رفع تداخل اسلاگ آرشیو پست‌تایپ و صفحه در وردپرس

۲۸ اردیبهشت ۱۴۰۳

بطور کلی زمانی که اسلاگ (slug) یک پست‌تایپ سفارشی (custom post type) مشابه اسلاگ یک صفحه باشد، آرشیو پست‌تایپ سفارشی اولیت بیشتری دارد و وردپرس آن را به جای صفحه نمایش می‌دهد.

اگر همچین اتفاقی برای شما رخ نداده احتمالا به این دلیل است که شما پیوندهای یکتا (permalink) را بازنویسی یا بروزرسانی نکرده‌اید. برای این منظور کافیست تنظیمات پیوندهای یکتا در پنل مدیریت را بدون تغییر تنظیمات ذخیره کنید تا بروز رسانی شود.

اگر نیاز است اسلاگ صفحه دارای اولویت بیشتری باشد و محتوای صفحه نمایش داده شود دو گزینه پیش رو دارید:

  • غیرفعال کردن آرشیو پست‌تایپ سفارشی
  • تغییر rewrite slug پست‌تایپ سفارشی

قبل از هر چیزی با توجه به اینکه در هر دو مورد باید آرگومان‌های فانکشن register_post_type() را تغییر دهید نحوه تعریف و ایجاد یک پست‌تایپ سفارشی را بررسی می‌کنیم تا توضیحات واضح تر باشد و بدانید چه قسمتی از کد باید تغییر کند.

تعریف پست‌تایپ جدید

برای تعریف پست‌تایپ جدید از فانکش register_post_type() استفاده می‌شود، این فانکش دو پارامتر قبول می‌کند: پارامتر اول که از نوع رشته (string) است نام پست‌تایپ یا post type key می‌باشد و پارامتر دوم آرایه‌ای از آرگومان‌هاست (arguments) که ویژگی‌های مختلف پست‌تایپ را مشخص می‌کند. قطعه کد زیر مثال ساده‌ای از تعریف پست‌تایپ است و پست‌تایپی به نام product ایجاد می‌کند.

function custom_post_type() {
	register_post_type('product',
		array(
			'labels'      => array(
				'name'          => __('Products', 'textdomain'),
				'singular_name' => __('Product', 'textdomain'),
			),
				'public'      => true,
				'has_archive' => true,
		)
	);
}
add_action('init', 'custom_post_type');

غیرفعال کردن آرشیو پست‌تایپ سفارشی

برای غیرفعال کردن آرشیو پست‌تایپ سفارشی بایستی مقدار آرگومان has_archive را به false تغییر دهید.

'has_archive' => false,

تغییر rewrite slug پست‌تایپ سفارشی

هنگامی که پست‌تایپ سفارشی جدیدی را تعریف می‌کنید باید مشخص کنید که قانون بازنویسی (rewrite rule) نباید به ساختار URL موجود اضافه شود.

به زبان ساده یعنی این آرگومان از فانکشن register_post_type()

'rewrite' => array('slug' => 'product'),

باید به شکل زیر بازنویسی شود.

'rewrite' => array('slug' => 'product','with_front' => false),

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *