ساخت پست تایپ سفارشی در وردپرس

پست تایپ در وردپرس نوع محتوای منتشر شده در سایت را مشخص می‌کند. مثلاً نوشته، برگه و رسانه ۳ نوع post هستند که به طور پیش‌فرض با آن‌ها سر و کار داریم. یا وقتی یک فروشگاه راه‌اندازی می‌کنیم، نوع محتوای محصول نیز به سایت اضافه می‌شود. در این آموزش یاد می‌گیریم چطور یک پست تایپ سفارشی را به وردپرس اضافه کنیم.

فرض کنید می‌خواهیم یک سایت محتوا محور گردشگری با وردپرس ایجاد کنیم. در نظر داریم روی این سایت، مکان‌های دیدنی شهرهای مختلف را قرار دهیم. اولین راه‌حلی که به ذهنمان می‌رسد، استفاده از نوشته در وردپرس است.

به این صورت که هر مکان دیدنی را در یک نوشته ارسال می‌کنیم. سپس برای مدیریت و دسته‌بندی آن‌ها، از دسته‌بندی و برچسب‌ها کمک می‌گیریم. مثلاً استان‌ها و شهرها را به عنوان دسته‌بندی و نوع مکان دیدنی (تاریخی، تفریحی و …) را با برچسب‌ها مدیریت می‌کنیم.

اگر لازم باشد موضوعات دیگری هم در این سایت پوشش داده شود، مدیریت این محتواها سخت می‌شود. بهتر است به جای نوشته‌ها، یک پست تایپ سفارشی (Custom Post Type یا نوع پست سفارشی) در وردپرس ایجاد کرده و مکان‌های دیدنی را به عنوان یک نوع نوشته متفاوت در نظر بگیریم.

پست تایپ وردپرس

محتواهای اصلی در وردپرس به صورت Post و در جدول _posts در دیتابیس ذخیره می‌شوند. معروف‌ترین پست تایپ‌های پیش‌فرض وردپرس عبارت‌اند از:

  • نوشته‌ها (post)
  • برگه‌ها (page)
  • فایل‌های رسانه (attachment)
  • فهرست‌ها (Nav Menu)

برخی موارد دیگر در وردپرس هم به صورت پست تایپ ذخیره می‌شوند. مثلاً رونوشت‌ها (Revisions) که پیش‌نویس‌ها هستند و cssهای اختصاصی در بخش سفارشی ساز، به صورت پست ذخیره می‌شوند.

وقتی افزونه جدیدی نصب می‌کنیم ممکن است پست تایپ جدیدی به سایت اضافه شود. در این صورت در بخش پیشخوان وردپرس یک منوی جدید برای افزودن محتوا در آن post type اضافه خواهد شد و اگر افزونه را غیر فعال کنیم، منوی آن نیز از پیشخوان برداشته می‌شود.

مثلاً وقتی ووکامرس را روی وردپرس نصب می‌کنیم، یک پست تایپ جدید به نام «محصول» (product) به سایت اضافه می‌شود.

ساختار ذخیره‌سازی همه این محتواها شبیه به هم است. همه آن‌ها دارای ویژگی‌هایی نظیر زمان ایجاد، تاریخ ویرایش، عنوان، آدرس (slug) و ID هستند. بسته به نیازمان می‌توانیم ویژگی‌های بیشتری به آن‌ها اضافه کنیم.

در ادامه یاد می‌گیریم چطور یک پست تایپ سفارشی در وردپرس ایجاد کرده و تنظیمات مربوط به آن را انجام دهیم. تمام کدها را باید در فایل functions.php قالب اضافه کنیم.

ایجاد post type در وردپرس

برای ساخت پست تایپ جدید باید از تابع register_post_type() استفاده کنیم. به طور معمول این تابع را درون یک تابع که به حلقه init در هسته وردپرس متصل شده است فراخوانی می‌شود. برای اینکه راحت‌تر متوجه شوید، ابتدا به قطعه کد زیر توجه کنید:

function sbzd_place_post_type() {
    register_post_type( 'name', array() );
}
add_action( 'init', 'sbzd_place_post_type' );

من یک تابع به نام sbzd_place_post_type() ایجاد کردم تا در آن تنظیمات پست تایپ جدید را تعریف کنم. سپس با add_action به هسته وردپرس گفتم که در هنگام init کردن سایت، این تابع را فراخوانی کند.

اگر جمله بالا را متوجه نشدید، هیچ اشکالی ندارد. این توضیحات را برای کسانی دادم که برنامه نویس وردپرس هستند. اگر می‌خواهید فقط پست تایپ در وردپرس ایجاد کنید، بدون نگرانی، بقیه آموزش را دنبال کنید.

تابع register_post_type() دو وردی می‌گیرد که هر دو تای آن‌ها اجباری است. آرگومان اول یک رشته PHP است که نام پست تایپ ما را مشخص می‌کند. این اسم حتماً باید انگلیسی باشد.

آرگومان دوم یک آرایه PHP است که تنظیمات پست تایپ جدید را مشخص می‌کند. در ادامه مهم‌ترین ویژگی‌های درون آرایه را بررسی می‌کنیم.

محتواهای جدیدی که در این بخش می‌نویسیم، با اسمی که برای پست تایپ سفارشی خود تعریف می‌کنیم شناخته می‌شوند. یعنی اگر پس از ارسال چند محتوای جدید، آن را تغییر دهیم، به محتواهای قدیمی دسترسی نداریم. مثل اینکه در بخش برگه‌ها، دنبال نوشته‌های سایت بگردیم!

افزودن کد به وردپرس (3 روش افزودن کد سفارشی)

افزودن کد به وردپرس (3 روش افزودن کد سفارشی)

ویژگی‌های پست تایپ سفارشی

ابتدا قطعه کد زیر را بررسی کنید. اگر در حال کد زدن هستید، آن را به functions.php قالب خودتان اضافه کنید تا تغییرات را بهتر متوجه شوید.

function sbzd_place_post_type() {

    $labels = array(
	    'name'			=> _x( 'مکان‌های دیدنی', 'Post type general name', 'sbzd.ir' ),
		'singular_name'	=> _x( 'مکان دیدنی', 'Post type singular name', 'sbzd.ir' ),
		'menu_name'		=> __( 'مکان‌ها' ),
		'add_new'		=> __( 'افزودن' ),
		'add_new_item'	=> __( 'افزودن مکان جدید' ),
		'new_item'		=> __( 'مکان جدید' ),
		'all_items'		=> __( 'همه مکان‌ها' )
	);
	
	$args = array(
	    'labels'		=> $labels,
		'label'			=> __( 'مکان‌ها' ),
		'description'	=> __( 'مکان‌های دیدنی برای گردشگری' ),
	);
	
    register_post_type( 'place', $args );
}
add_action( 'init', 'sbzd_place_post_type' );

برای اینکه فهم ساختار کد بهتر شود، من از دو متغیر $labels و $args استفاده کرده‌ایم؛ اما می‌توانیم همه این‌ها را به صورت تودرتو هم بنویسیم. همه این آرایه‌ها به صورت کلید – مقدار تعریف می‌شوند.

متغیر labels

کلیدهای مختلفی متناسب با نیازمان برای این آرایه می‌توان تعریف کرد. در این جا 7 مورد مهم را آورده‌ام:

  • name : نام پست تایپ سفارشی ما در وردپرس است.
  • singular_name : نام مفرد نوع پست
  • menu_name : نامی که در منوی پیشخوان نمایش داده می‌شود.
  • add_new : اسم دکمه «افزودن» پست جدید
  • add_new_item : اسم دکمه «افزودن پست»
  • new_item
  • all_items

ویژگی‌های بیشتری هم می‌توانیم تعریف کنیم، اما معمولاً به همین موارد بسنده می‌شود. سایر موارد (مثل پاک کردن، ویرایش، نمایش و …) اتوماتیک از متن‌های پیش‌فرض وردپرس گرفته می‌شود که برایمان کافی است.

متغیر args

این متغیر را به عنوان ورودی دوم تابع ثبت پست تایپ جدید در وردپرس می‌دهیم. مقادیر این آرایه به دو بخش اصلی تقسیم می‌شود، مقادیری که مرتبط با تعیین ویژگی‌های Post Type است و دیگری تنظیمات مخصوص پست تایپ.

در قطعه کدی که دیدید، من فقط بخش اول را تعریف کرده‌ام:

  • labels : خودش یک آرایه است که ویژگی‌های پست تایپ سفارشی ما را مشخص می‌کند. چون این اطلاعات را در $labels مشخص کرده‌ایم، همان متغیر را برای این کلید در نظر می‌گیریم.
  • label : نام کلی پست تایپ جدید ماست. وقتی افزونه یا بخش دیگری از سایت بخواهد به این post type اشاره کند، از این نام استفاده می‌کند.
  • description : توضیحات کوتاه برای پست تایپ را مشخص می‌کند. تعریف این مقدار ضروری نیست اما حرفه‌ای‌تر است که توضیحاتی برای آن بنویسیم.

در این کدها از توابع __() و _x() استفاده شده است. به زبان ساده، این توابع برای شناسایی متن‌ها در قالب و افزونه استفاده می‌شود تا ترجمه آن‌ها به راحتی انجام شود.

تنظیمات پست تایپ در وردپرس

در آرایه متغیر $args می‌توانیم تنظیمات به خصوصی را برای پست تایپ جدیدمان تعریف کنیم. در قطعه کد زیر ۸ مورد از پرکاربردترین‌ها را استفاده کرده‌ام:

<?php
$args = array(
    'labels'		=> $labels,
    'label'			=> __( 'مکان‌ها' ),
    'description'	=> __( 'مکان‌های دیدنی برای گردشگری' ),

    'supports'		=> array('title', 'editor', 'thumbnail', 'comment'),

    'taxonomies'	=> array('tag'),

    'public'             => true,
    'publicly_queryable' => true,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'has_archive'        => true,
    'hierarchical'       => false,
);

کلید supports برای تعریف فیلدهایی است که این پست تایپ پشتیبانی می‌کند. در این مثال، فیلدهای عنوان، ویرایشگر متن، تصویر شاخص و دیدگاه‌ها را فعال کرده‌ام. اگر از سایت شما دارای فیلدهای سفارشی است، می‌توانید از آن‌ها در این جا استفاده کنید.

کلید taxonomies لیست تگزانومی‌هایی که این پست تایپ در وردپرس از آن‌ها پشتیبانی می‌کند را مشخص می‌کند. به طور پیش‌فرض، این مقدار خالی است. یعنی پست تایپ جدید ما هیچ تگزانومی را پشتیبانی نمی‌کند. من در قطعه کد بالا، برچسب‌ها را به پست تایپ خودمان اضافه کرده‌ام. اگر سایتتان taxnomy سفارشی دارد، می‌توانید از آن‌ها هم استفاده کنید.

نتیجه افزودن پست تایپ جدید به وردپرس
نتیجه افزودن پست تایپ جدید به وردپرس

وظیفه سایر کلیدهایی که تعریف کرده‌ام عبارت‌اند از:

ویژگیمشخص می‌کند که
publicپست تایپ عمومی است یا نه؟
public_queryableپست تایپ در نتایج کوئری‌های نمایش پست‌ها آورده شود یا نه؟
show_uiپست تایپ در سمت کاربر (در پوسته سایت) قابل نمایش باشد یا نه؟
show_in_menuدر منوی پیشخوان نمایش داده شود یا نه؟
has_archivepost type دارای بایگانی است یا نه؟
hierarchicalآیا پست تایپ ساختار سلسله مراتبی دارد؟ (والد فرزندی)

همانطور که گفتم، تنظیمات بسیار بیشتری را می‌توانیم متناسب با نیاز خود برای پست تایپ جدید در وردپرس تعریف کنیم. برای دیدن همه تنظیمات به مستندات آن مراجعه کنید. همچنین برای اینکه یاد بگیرید چطور مطالب پست تایپ‌های مختلف را از دیتابیس فراخوانی کنید، آموزش کار با کوئری در وردپرس برایتان مفید خواهد بود.

امیدوارم با این آموزش توانسته باشید پست تایپ سفارشی خودتان را در وردپرس اضافه کنید. شما از پست تایپ برای افزودن چه بخشی به سایتتان کمک گرفته‌اید؟ از بخش دیدگاه‌ها با دیگران به اشتراک بگذارید.