تعداد بازدید: 2874

پست تایپ ها (post type) در وردپرس

قصد داریم تا در این مقاله به مبحث پست تایپ ها در وردپرس بپردازیم و پارامتر های مهم در تابع register_post_type رو باهم بررسی کنیم.این مبحث برای برنامه نویسان وردپرس از اهمیت بالایی برخورداره.

پست ها در وردپرس

در وردپرس بیشتر المان ها پست هستند. به طور مثال پست ها ، برگه ها ، رسانه ها ، و منو ها. این مواردی که نام بردم همگی در جدول wp_post قرار گرفتند. وجه تمایز این پست ها ستونی هست به نام post_type که باعث میشه این موارد از هم جدابشن.

پست تایپ های پیشفرض در وردپرس

  • Post (Post Type: ‘post’)
  • Page (Post Type: ‘page’)
  • Attachment (Post Type: ‘attachment’)
  • Revision (Post Type: ‘revision’)
  • Navigation Menu (Post Type: ‘nav_menu_item’)
  • Custom CSS (Post Type: ‘custom_css’)
  • Changesets (Post Type: ‘customize_changeset’)

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

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

شما می تونید خودتون پست تایپ اختصاصی بسازید. به طور مثال در همین وب سایت گنوتک ما یک پست تایپ ساختیم با نام دوره و یک پست تایپ با نام درس که دروس در دوره قرار داره . قبل از ساخت پست تایپ دقت داشته باشید که شما باید ماهیت موجودیتی که بهش احتیاج دارید رو بررسی کنید و اگر لازم بود براش پست تایپ بسازید . پست تایپ ها با تکسونومی ها یا همون دسته بندی ها متفاوت هستند و نکته مهم اینه که استخراج پست ها به وسیله پست تایپ در وردپرس بسیار سریعتر از استخراج پست ها با استفاده از تکسونومی ها هست چون در استخراج پست ها به وسیله تکسونومی ما از چند جدول استفاده می کنیم و در استخراج پست ها به وسیله پست تایپ از یک جدول.

ساخت پست تایپ با تابع register_post_type

برای ساخت پست تایپ ما نیاز داریم تا تابعی با اولویت بالا (یعنی 0) به اکشن init برنیم که در اون از تابع register_post_type استفاده شده باشه.

<?php register_post_type( $post_type, $args ); ?>

پارامتر های تابع register_post_type

تابع register_post_type دوتا پارامتر میگیره که اولیش نام کلیدی اون پست تایپ هست که در کوئری گرفتن ازش استفاده می کنیم(حداکثر ۲۰ کاراکتر بدون حروف بزرگ و فاصله و کاراکتر های فارسی) و مورد دوم آرگومان های پست تایپ هست که ما در قالب یک آرایه تودرتو از اون استفاده می کنیم. به مثال زیر توجه کنید.

<?php 
if ( ! function_exists('rng_create_post_type') ) {

// Register Custom Post Type
function rng_create_post_type() {

	$labels = array(
		'name'                  => _x( 'Post Types Plural', 'Post Type General Name', 'translate_name' ),
		'singular_name'         => _x( 'Post Type Singular', 'Post Type Singular Name', 'translate_name' ),
		'menu_name'             => __( 'Post Types', 'translate_name' ),
		'name_admin_bar'        => __( 'Post Type', 'translate_name' ),
		'archives'              => __( 'Item Archives', 'translate_name' ),
		'attributes'            => __( 'Item Attributes', 'translate_name' ),
		'parent_item_colon'     => __( 'Parent Item:', 'translate_name' ),
		'all_items'             => __( 'All Items', 'translate_name' ),
		'add_new_item'          => __( 'Add New Item', 'translate_name' ),
		'add_new'               => __( 'Add New', 'translate_name' ),
		'new_item'              => __( 'New Item', 'translate_name' ),
		'edit_item'             => __( 'Edit Item', 'translate_name' ),
		'update_item'           => __( 'Update Item', 'translate_name' ),
		'view_item'             => __( 'View Item', 'translate_name' ),
		'view_items'            => __( 'View Items', 'translate_name' ),
		'search_items'          => __( 'Search Item', 'translate_name' ),
		'not_found'             => __( 'Not found', 'translate_name' ),
		'not_found_in_trash'    => __( 'Not found in Trash', 'translate_name' ),
		'featured_image'        => __( 'Featured Image', 'translate_name' ),
		'set_featured_image'    => __( 'Set featured image', 'translate_name' ),
		'remove_featured_image' => __( 'Remove featured image', 'translate_name' ),
		'use_featured_image'    => __( 'Use as featured image', 'translate_name' ),
		'insert_into_item'      => __( 'Insert into item', 'translate_name' ),
		'uploaded_to_this_item' => __( 'Uploaded to this item', 'translate_name' ),
		'items_list'            => __( 'Items list', 'translate_name' ),
		'items_list_navigation' => __( 'Items list navigation', 'translate_name' ),
		'filter_items_list'     => __( 'Filter items list', 'translate_name' ),
	);
	$args = array(
        'public'                => true,
		'label'                 => __( 'Post Type Singular', 'translate_name' ),
		'description'           => __( 'Post Type Description', 'translate_name' ),
        'labels'                => $labels,
        'exclude_from_search'   => true,
        'publicly_queryable'    => true,
        'show_ui'               => true,
		'show_in_nav_menus'     => true,
		'show_in_menu'			=> true,
		'show_in_admin_bar'		=> true,
		'menu_position'			=> 5,
		// 'menu_icon' 			=> get_bloginfo('template_directory') . '/images/portfolio-icon.png',
		'menu_icon'				=> 'dashicon-groups',
		'has_archive'			=> true,
		'capability_type'		=> array('book','books'),
		'capabilities' 			=> array(
			'edit_post'          => 'edit_book', 
			'read_post'          => 'read_book', 
			'delete_post'        => 'delete_book', 
			'edit_posts'         => 'edit_books', 
			'edit_others_posts'  => 'edit_others_books', 
			'publish_posts'      => 'publish_books',       
			'read_private_posts' => 'read_private_books', 
			'create_posts'       => 'edit_books', 
		),
		'supports'              => array( 'title', 'editor', 'thumbnail', 'page-attributes', 'post-formats' ),
		'taxonomies'            => array( 'category', 'post_tag' ),
		'hierarchical'          => true,
                'rewrite'                => array('slug' => 'book')
	);
	register_post_type( 'book', $args );

}
add_action( 'init', 'rng_create_post_type', 0 );

}

خوب حالا آرگومان های این تابع رو با هم بررسی می کنیم.

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

  • public : این پارامتر چک می کنه که آیا این پست تایپ قراره برای ادمین (در فهرست ها و منوی سمت راست) و همچنین برای کاربران و بازدید کنندگان وب سایت (در جستجوی وب سایت و درخواست ها از طریق url) قابل دیدن باشه یا خیر.
    این پارامتر شامل پارامتر های زیادی میشه که جلو تر به اون ها اشاره می کنیم .
    برای ادمین :
    show_in_nav_menus
    show_ui
    وبرای کاربران عادی وب سایت:
    exclude_from_search
    publicly_queryable
  • exclude_from_search : این پارامتر مشخص می کنه که آیا کاربران وب سایت (بازدید کننده ها) در قسمت فرانت وب سایت قابلیت جستجوی این پست تایپ رو داشته باشند یا خیر. این پارامتر اگر مقدار دهی نشده باشه از پارامتر قبل تر از خودش یعنی public استفاده می کنه به طوری که اگر public برابر با true باشه این مورد برابر با false هست و بالعکس.
  • publicly_queryable : این مورد میگه که کاربران از طریق کوئری های آدرس بار یا url قابلیت مشاهده پست رو نداشته باشه . (به طور مثال شما نمی تونید پست تایپ های فرم تماس در پلاگیت فرم تماس ۷ رو به صورت archive یا single در وب سایت مشاهده کنید.)

    ?post_type={post_type_key}
    ?{post_type_key}={single_post_slug}
    ?{post_type_query_var}={single_post_slug}
    کوئری هایی که در بالا مشاهده می فرمایید شامل این پارامتر می شود.و اگر کاربر این کوئری ها را وارد کند به برگه ۴۰۴ هدایت می شود.

  • show_ui : این مورد بررسی می کنه که آیا ظاهر کاربری (user interface) در پنل ادمین برای مدیریت پست تایپ وجود داشته باشه یا خیر. به طور مثال در پلاگین ووکامرس پست تایپی برای محصولات متغیر وجود داره که ظاهر کاربری به شکل پست تایپ های معمولی در اون وجود نداره و کاربر از طریق پست تایپ محصولات اون ها رو ایجاد و یاتغییر میده. این پارامتر هم اگر مقدار دهی نشه از پارامتر public استفاده می کنه.
  • show_in_nav_menus : نمایش در قسمت محتواهایی که می تونید به  فهرست ها اضافه کنید.این پارامتر هم اگر مقدار دهی نشه از پارامتر public استفاده می کنه.
  • show_in_menu : این که آیا این پست تایپ جدید در منوی ادمین وردپرس نمایش داده بشود یا خیر.
    نکته : برای این که پست تایپ در این مرحله چک بشود که در منو قرار بگیرد یا خیر باید در مرحله قبل show_ui را برابر با true قرارداده باشید.
    نکته مهم : گاهی وقت ها نیاز پیدا می کنید که پست تایپ رو به عنوان یک زیر منو قرار بدید. خوب برای این منظور کافیه که به جای true , false یک رشته به پارامتر show_in_menu پاس بدید. این رشته باید همون قسمت از لینک منوی اصلی باشه . به طور مثال اگر بهش بدید “edit.php” این پست تایپ میشه زیر منوی پست ها. اگر بهش بدید “edit.php?post_type=product” میشه زیر منوی محصولات ووکامرس (زیر منوی پست تایپ product)
  • show_in_admin_bar : این که آیا در ادمین بار یا همان نوار بالایی پنل ادمین در قسمت افزودن باشه یا خیر.
  • menu_position : جایگاه اون در منوی ادمین وردپرس. این رو باید به صورت عدد بدید. یعنی باید عددی بدید ما بین اعداد موجود برای انتخاب منو. اعداد پیش فرض رو مشاهده بفرمایید:
    5 – below Posts
    10 – below Media
    15 – below Links
    20 – below Pages
    25 – below comments
    60 – below first separator
    65 – below Plugins
    70 – below Users
    75 – below Tools
    80 – below Settings
    100 – below second separator
  • menu_icon : آیکن منو که می تونه به صورت موردی از دسته آیکن های وردپرس باشه (dashicons) یا به صورت تصویر باشه.
  • has_archive : این پارامتر مشخص می کنه که آیادر قسمت فرانت اند وب سایت پست ها بر اساس این پست تایپ آرشیور بشن یا خیر. به طور مثال شما پست تایپی ساختید با نام course که در اون دوره ها رو قرار بدید. اگر کاربر لینک yourdoman.com/course رو وارد کرد تمامی پست های مربوط به پست تایپ course براش نمایش داده بشه یا خیر .
    نکته : به صورت پیش فرض این پارامتر false است.
  • capability_type : این مورد برای ساخت capability های وردپرس برای این پست تایپ می باشد که به صورت یک آرایه با مقادیر singular و parular است.
    توضیح کوتاه : در وردپرس ما role داریم و capabilities که role ها همون نقش ها هستند و capabilities همون مجوز اعمالی که قراره روی پست تایپ های مختلف اتفاق بیفته .
    ← role :
    Administrator
    Editor
    Author
    Contributor
    Subscriber
    و سایر role هایی که شما می تونید خودتون بسازید.
    ← capabilities :
    delete_posts
    delete_published_posts
    edit_posts
    edit_published_posts
    publish_posts
    read
    upload_files
    ….
    در نتیجه هر role به یک یا چند capabilities دسترسی داره که شما در زمان ساخت پست تایپ می تونید cpabilities های مختلفی رو در اون قرار بدید.
  • به طور مثال شما وقتی پست با نام book درست کنید و برای مقدار پارامتر capability_type مقدار  array(‘book’,’books’) قراربدید اون میاد و به طور خودکار capability های موردنظر رو میسازه.
  • capabilities : می تونید برای هر یک از cpabilities های پست تایپ خودتون یک مقدار تعیین کنید. به طور مثال برای ویرایش پست تایپ یک مقدار capabilities تعیین کنید. برای این کار میتونید از capabilities هایی که در وردپرس موجوده استفاده کنید. مثلا edit_post که یه سری از role ها بهش دسترسی دارند. اگر مقداری تعیین کنید که وجود نداشته باشه و هیچ نقشی بهش دسترسی نداشته باشه (مثلا rng_edit_post) قطعا کاربرهایی که به این capabilities دسترسی ندارند مجوز این کار رو پیدا نمی کنند.
    برای مشاهده مستندات مربوط به role ها و capabilities ها این مقاله را مطالعه بفرمایید.
  • support : شما توسط این پارامتر تعیین می کنید که پست تایپ های شما از چه مواردی پشتیبانی می کنند. لیست امکانات پست تایپ را در زیر می توانید مشاهده فرمایید:’title’
    ‘editor’
    ‘author’
    ‘thumbnail’
    ‘excerpt’
    ‘trackbacks’
    ‘custom-fields’
    ‘comments’
    ‘revisions’
    ‘page-attributes’
    ‘post-formats’
    نکته : اگر قرار است پست تایپ شما از thumbnail پشتیبانی کند باید قبل از آن شما پشتیبانی از thumbnail رو به پوسته خودتون اضافه کرده باشید. (add_theme_support)
  • taxonomies : لیست taxonomy هایی که شما قراره به این پست تایپ نسبت بدید رو در قالب یک آرایه می تونید به این پارامتر پاس بدید. حال این taxonomy ها رو شما ساخته باشید یا از taxonomy های پیش فرض وردپرس استفاده کرده باشید.
  • hierarchical :‌ خاصیت سلسله مراتبی یا همان مادر و فرزندی که به طور مثال در برگه مشاهده کرده اید. اگر این مقدار رو برابر true قرار بدید این خاصیت برای پست تایپ شما در نظر گرفته میشه.
  • rewrite : نامک رو برای پست تایپ جدید انتخاب می کنه . نامک رو طوری انتخاب کنید که با سایر پست تایپ ها تداخلی به وجود نیاره.

پست تایپ ها در معماری وردپرس

برای ساخت فایل آرشیو برای پست تایپ خودتون در ریشه تم خودتون فایلی با قالب زیر ایجاد کنید.

archive-{POST_TYPE}.php

برای ساخت فایل داخلی برای پست تایپ خودتون در ریشه تم خودتون فایلی با قالب زیر ایجاد کنید.

single-{POST_TYPE}.php

نحوه پیاده سازی پست تایپ ها در وردپرس

برای پیاده سازی پست تایپ ها در وردپرس باید از پلاگین استفاده کرد چرا که اگر در پوسته تعریف شده باشه و پوسته وب سایت شما تغییر کنه شما دیگه در پنل ادمین به پست تایپ دسترسی ندارید.

اگر در پلاگین این پست تایپ رو تعریف می کنید ، بهتره که از تابع flush_rewrite_rule برای ریست کردن لینک ها استفاده کنید که این تابع رو می تونید به فعال یا غیر فعال کردن پلاگین متصل کنید.

مطالب مشابه

آموزش نکات و تکنیک های برنامه نویسی وردپرس

Rest API در وردپرس

سرور ها می توانند پاسخ مناسب به درخواست ها بدهند. درخواست ها و پاسخ یک سری ویژگی ها و داده همراه خود دارند. کدی که در...

آموزش نکات و تکنیک های برنامه نویسی وردپرس

Hooks: Actions and Filters

هیچ وقت هسته وردپرس رو تغییر ندید (do'nt touch the core) . بدین معنی هست که برای هک وردپرس راه دیگری غیر از تغییر...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

4 دیدگاه برای پست تایپ ها (post type) در وردپرس

    • با سلام و احترام.
      برای قسمت فرانت اند وب سایت که بصورت معمول مطابق با سایر قسمت های تم رفتار کنید و برای قسمت بک اند هم ماهیت استفاده از پست تایپ ها و سایر api های وردپرس اینه که ساختار کلی پنل ادمین حفظ بشه ولی شما با هوک admin_enqueue_script می تونید استایل اضافه کنید.

  1. سلام این پست تایپ یه مشکل کوچیک داره اونم بخش دسته ها و برچسب ها هست که با دسته ها و برچسب های وردپرس یکی میشه. من میخوام یک پست تایپ با دسته و برچسب های اختصاصی خودش داشته باشم. دقیقا مثل محصولات ووکامرس که دسته و برچسب ها مختص به خودشون رو دارند و هیچ ارتباطی به دسته ها و برچسب های نوشته ها در وردپرس ندارند. منابع زیادی رو هم گشتم ولی چیز خاصی پیدا نکردم. ممنون میشم در این مورد راهنمایی کنید با تشکر ازشما.

    • با سلام و احترام :
      شما سه مفهوم رو میخواهید :

      • مفهوم دسته بندی پست تایپ
      • مفهوم برچسب پست تایپ
      • خود پست تایپ

      ابتدا باید برید و دسته بندی و تگ مربوطه رو که بهش taxonomy میگن بسازید.(از این لینک استفاده کنید). بعد باید در زمانی که پست تایپ خودتون رو می سازید به پارامتر taxonomies (خط 63 مثال ما) دسته بندی و تگ هایی که ساختید رو معرفی کنید. این پارامتر یک آرایه است که در همین مقاله توضیحاتش داده شده.

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

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