وردپرس به صورت پیش فرض ۵ نوع نوشته دارد : پست ها ، صفحات ، ضمیمه ها ، رونوشت ها و منو ها. اما شما می توانید با استفاده از توابع مربوطه انواع نوشته خود را ایجاد کنید و از آنها استفاده کنید.در این مطلب به طور خلاصه نحوه انجام این کار را بررسی می کنیم.

ایجاد یک نوع نوشته سفارشی:

برای ایجاد یک نوع نوشته سفارشی  ( custom post type ) باید از تابع register_post_type استفاده کنید.

نکته: توجه داشته باشید که شما باید از تابع register_post_type  قبل از admin_menu و بعد از after_theme_setup استفاده کنید.

add_action( 'init', 'create_post_type' );
//Registers the Product's post type
function create_post_type() {
 register_post_type( 'acme_product',
 array(
 'labels' => array(
 'name' => __( 'Products' ),
 'singular_name' => __( 'Product' )
 ),
 'public' => true,
 'has_archive' => true,
 )
 );

با کد بالا می توانیم یک نوع نوشته سفارشی به نام Product ایجاد کنیم.که در پایگاه داده با نام acme_product ذخیره می شود. این تابع چند تنظیم مهم دارد:

labels :  نام نمایشی نوع نوشته را به صورت مفرد و جمع مشخص می کند شما می توانید موارد بیشتری به labels از قبیل عنوان مربوط به نوشته جدید یا اصلاح یا حذف نوشته را نسبت دهید.

public : مشخص می کند که آیا منوهای مربوط به این نوع نوشته در دسترس عموم کاربران سایت قرار می گیرید یا نه و همچنین در منوی پنل  مدیریت ودرپرس نمایش داده بشود  یا خیر.

has_archive :  مشخص می کند که آیا این نوع نوشته می تواند در قالب صفحه آرشیو مربوط به خود را داشته باشد یا نه.

ملاحضات نام گذاری:

  • در صورتی که از  نام نوع نوشته سفارشی شما خیلی کلی می باشد به آن پسوند مناسبی دهید تا با افزونه دیگری تداخل نداشته باشد مثلا به جای product می توانید از wprahnama_product  استفاده کنید.
  • نام نوع نوشته سفارشی خود را طولانی تر از ۲۰ کاراکتر انتخاب نکنید.
  • برای اینکه با نسخه های آینده وردپرس به مشکلی نخورید از پیشوند wp_ استفاده نکنید.

تغییر در URL مربوط به نوع نوشته سفارشی:

با استفاده از خاصیت rewrite و slug می توانید URL مربوطه به نوع نوشته سفارشی خود را تغییر دهید. مانند مثال زیر:

add_action( 'init', 'create_post_type' );
function create_post_type() {
    register_post_type( 'acme_product',
        array(
            'labels' => array(
                'name' => __( 'Products' ),
                'singular_name' => __( 'Product' )
            ),
            'public' => true,
            'has_archive' => true,
            'rewrite' => array('slug' => 'products'),
        )
    );
}