FA-TOOLS — Header Component

آموزش جامع ساخت پست تایپ سفارشی در وردپرس (کدنویسی و افزونه)

خلاصه کاربردی مقاله

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

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

پست تایپ سفارشی (Custom Post Type) چیست؟

ساخت پست تایپ سفارشی وردپرس — تصویر 2

پاسخ کوتاه: پست تایپ سفارشی (CPT) یک ساختار محتوایی اختصاصی در وردپرس است که داده‌های آن در جدول wp_posts ذخیره می‌شود اما منوی مدیریت، تاکسونومی‌ها (دسته‌بندی‌های) مستقل، و آرشیو مجزای خود را در سایت دارد.

وردپرس به‌صورت پیش‌فرض دارای چند نوع محتوای پایه مانند «نوشته‌ها» (Post)، «برگه‌ها» (Page) و «ضمائم» (Attachment) است. زمانی که می‌خواهید بخش جدیدی مانند «پزشکان»، «نمونه‌کارها» یا «فایل‌های دانلود» به سایت اضافه کنید، اختلاط این داده‌ها با مقالات وبلاگ باعث بی‌نظمی پیشخوان و کاهش کارایی سایت می‌شود. با ایجاد یک CPT، یک منوی مستقل در پنل وردپرس همراه با فرم‌های ورودی سفارشی ایجاد می‌کنید.

مقایسه پست تایپ، نوشته، برگه و تاکسونومی

ساخت پست تایپ سفارشی وردپرس — تصویر 3

برای درک بهتر ساختار داده در وردپرس، جدول زیر تفاوت‌های کلیدی ساختارهای محتوایی مختلف را نشان می‌دهد:

نوع ساختار کاربرد و ویژگی‌های اصلی
نوشته (Post) محتوای زمان‌محور (اخبار و وبلاگ)، دارای دسته‌بندی و برچسب پیش‌فرض، دارای آرشیو تاریخی.
برگه (Page) محتوای ثابت و غیر زمان‌محور (درباره ما، تماس با ما)، دارای ساختار والدی/فرزندی (سلسله‌مراتبی)، بدون دسته‌بندی.
پست تایپ سفارشی (CPT) محتوای اختصاصی (پروژه‌ها، دوره‌ها)، قابلیت تعریف آرشیو، آیکون، سطوح دسترسی و متا باکس‌های کاملاً مجزا.
تاکسونومی سفارشی سیستم گروه‌بندی و طبقه‌بندی داده‌ها (مانند برندها یا سبک‌ها) که به CPT متصل می‌شود.

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

ساخت پست تایپ سفارشی وردپرس — تصویر 4

روش استاندارد و بدون نیاز به افزونه‌های جانبی، ثبت پست تایپ از طریق فایل functions.php قالب یا یک افزونه اختصاصی است. برای شروع می‌توانید از مجموعه‌ای از تکه کدهای وردپرس استفاده کنید.

مراحل زیر نحوه ثبت یک پست تایپ جدید به نام «نمونه‌کارها» (Portfolio) را نشان می‌دهد:

  1. وارد فایل‌های قالب خود شده و فایل functions.php را باز کنید (یا یک Must-Use Plugin بسازید).
  2. تابع سفارشی خود را تعریف کرده و آن را به هوک init متصل کنید.
  3. آرایه‌ای از آرگومان‌ها و لیبل‌ها (Labels) را به تابع register_post_type پاس دهید.

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

function my_custom_post_type_portfolio() {
    $labels = array(
        'name'                  => 'نمونه‌کارها',
        'singular_name'         => 'نمونه‌کار',
        'menu_name'             => 'نمونه‌کارها',
        'name_admin_bar'        => 'نمونه‌کار',
        'add_new'               => 'افزودن جدید',
        'add_new_item'          => 'افزودن نمونه‌کار جدید',
        'new_item'              => 'نمونه‌کار جدید',
        'edit_item'             => 'ویرایش نمونه‌کار',
        'view_item'             => 'نمایش نمونه‌کار',
        'all_items'             => 'همه نمونه‌کارها',
        'search_items'          => 'جستجوی نمونه‌کار',
        'not_found'             => 'نمونه‌کاری یافت نشد.',
        'not_found_in_trash'    => 'نمونه‌کاری در زباله‌دان یافت نشد.'
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array('slug' => 'portfolio'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-portfolio',
        'show_in_rest'       => true, // فعال‌سازی ویرایشگر بلوک (گوتنبرگ) و REST API
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments')
    );

    register_post_type('portfolio', $args);
}
add_action('init', 'my_custom_post_type_portfolio');

توضیح پارامترهای کلیدی در آرگومان بالا:

  • show_in_rest: تنظیم این گزینه روی true حیاتی است؛ زیرا ویرایشگر جدید وردپرس (گوتنبرگ) و قابلیت‌های API بر پایه REST کار می‌کنند.
  • has_archive: در صورت تنظیم روی true، یک صفحه آرشیو خودکار در آدرس yoursite.com/portfolio ساخته می‌شود.
  • supports: ویژگی‌هایی که این پست تایپ پشتیبانی می‌کند (تصویر شاخص، چکیده، دیدگاه‌ها و…).

۳ نکته حیاتی و خطای کشنده در ساخت CPT که بیشتر توسعه‌دهندگان نمی‌دانند

ساخت پست تایپ سفارشی وردپرس — تصویر 5

۱. تله تابع flush_rewrite_rules (افت شدید سرعت سایت)

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

// روش صحیح: اجرا فقط در زمان فعال‌سازی افزونه
function myplugin_activate() {
    // ابتدا پست تایپ را ثبت کنید
    my_custom_post_type_portfolio();
    // سپس قوانین پیوند یکتا را بازنویسی کنید
    flush_rewrite_rules();
}
register_activation_hook(__FILE__, 'myplugin_activate');

۲. استفاده از Meta Query به جای Custom Taxonomy (کند شدن دیتابیس)

اگر قصد دارید پست تایپ‌های خود را دسته‌بندی کنید (مثلا نمونه‌کارهای گرافیک، وب، عکاسی)، هرگز از پست‌متا (Meta Keys) برای فیلتر کردن استفاده نکنید. جستجو در جدول wp_postmeta به دلیل عدم وجود ایندکس‌های بهینه روی ارزش‌های متغیر، سرعت بسیار پایینی دارد. همیشه یک تاکسونومی سفارشی (Custom Taxonomy) بسازید و آن را به پست تایپ متصل کنید.

۳. تداخل نام‌گذاری (Slug Conflict)

نام کلیدی پست تایپ (نام پست تایپ در تابع ثبت) نباید بیشتر از ۲۰ کاراکتر باشد و نباید با کلمات رزرو شده وردپرس (مثل post, page, attachment, action, type) یا اسلاگ برگه‌های دیگر یکسان باشد، در غیر این صورت با خطای ۴۰۴ مواجه خواهید شد.

ساخت پست تایپ با افزونه CPT UI

اگر علاقه‌ای به کدنویسی مستقیم ندارید، افزونه Custom Post Type UI (CPT UI) بهترین و محبوب‌ترین گزینه برای این کار است.

  1. افزونه Custom Post Type UI را از مخزن وردپرس نصب و فعال کنید.
  2. از منوی جدید به مسیر CPT UI > Add/Edit Post Types بروید.
  3. در بخش Post Type Slug، نام انگلیسی و کوتاه پست تایپ را بنویسید (مثلاً product_review).
  4. نام‌های جمع و مفرد فارسی را در بخش‌های Plural Label و Singular Label وارد کنید.
  5. در بخش تنظیمات پیشرفته (Additional labels & Settings)، گزینه Has Archive و Show in REST API را روی True قرار دهید.
  6. روی دکمه Add Post Type کلیک کنید.

شما می‌توانید برای طراحی فرم‌های ورود داده حرفه‌ای‌تر، این افزونه را با افزونه Advanced Custom Fields (ACF) ترکیب کنید تا فیلدهای اختصاصی نظیر قیمت، تاریخ، گالری تصاویر و فایل‌های ضمیمه را به پست تایپ متصل کنید.

نحوه نمایش پست تایپ در فرانت‌اند سایت (قالب‌ها و Query)

پس از ثبت CPT، دو راه برای نمایش داده‌های آن در صفحات وب‌سایت وجود دارد: استفاده از فایل‌های تمپلیت قالب یا نوشتن یک کوئری اختصاصی.

۱. ساخت فایل‌های تمپلیت در قالب

وردپرس بر اساس سلسله‌مراتب فایل‌ها (Hierarchy)، فایل‌های اختصاصی پست تایپ را به‌صورت زیر شناسایی می‌کند:

  • نمایش تکی پست: کپی کردن فایل single.php و تغییر نام آن به single-{post_type_slug}.php (مثال: single-portfolio.php)
  • نمایش صفحه آرشیو: کپی کردن فایل archive.php و تغییر نام آن به archive-{post_type_slug}.php (مثال: archive-portfolio.php)

۲. نمایش پست تایپ در حلقه‌های سفارشی (WP_Query)

برای فراخوانی پست تایپ در هر بخش دلخواه از قالب، می‌توانید از کلاس WP_Query استفاده کنید. اگر به مفاهیم فرانت‌اند مثل ساختار HTML یا استایل‌دهی CSS مسلط باشید، می‌توانید کدهای حلقه را به زیبایی طراحی کنید:

$args = array(
    'post_type'      => 'portfolio',
    'posts_per_page' => 6,
    'orderby'        => 'date',
    'order'          => 'DESC'
);

$portfolio_query = new WP_Query($args);

if ($portfolio_query->have_posts()) :
    echo '<div class="portfolio-grid">';
    while ($portfolio_query->have_posts()) : $portfolio_query->the_post(); ?>
        <div class="portfolio-item">
            <a href="<?php the_permalink(); ?>">
                <?php the_post_thumbnail('medium'); ?>
                <h3><?php the_title(); ?></h3>
            </a>
        </div>
    <?php endwhile;
    echo '</div>';
    wp_reset_postdata(); // بسیار مهم: بازنشانی داده‌های پست
else :
    echo '<p>هیچ نمونه‌کاری یافت نشد.</p>';
endif;

برای تعاملی‌تر کردن فرم‌ها یا لود بدون رفرش (Ajax) این پست تایپ‌ها می‌توانید از تکه‌کدهای مرتبط با اسکریپت‌های JavaScript بهره بگیرید.

۳. شامل کردن CPT در کوئری اصلی و جستجوی سایت

به‌صورت پیش‌فرض، جستجوی وردپرس پست تایپ‌های سفارشی را شامل نمی‌شود. برای افزودن CPT به نتایج جستجو، کد زیر را به functions.php اضافه کنید:

function add_cpt_to_search_query($query) {
    if ($query->is_search && $query->is_main_query() && !is_admin()) {
        $query->set('post_type', array('post', 'portfolio'));
    }
    return $query;
}
add_filter('pre_get_posts', 'add_cpt_to_search_query');

عیب‌یابی سریع مشکلات رایج

مشکل ۱: پس از ساخت CPT، لینک پست‌ها خطای ۴۰۴ (Not Found) می‌دهد.
راه حل: وارد پیشخوان وردپرس شوید، به مسیر تنظیمات > پیوندهای یکتا بروید و بدون تغییر هیچ گزینه‌ای، فقط روی دکمه «ذخیره تغییرات» کلیک کنید تا جدول بازنویسی لینک‌ها به روز شود.
مشکل ۲: ویرایشگر بلوک (گوتنبرگ) برای پست تایپ جدید فعال نیست و ویرایشگر کلاسیک باز می‌شود.
راه حل: مطمئن شوید که در آرگومان‌های ثبت پست تایپ، مقدار 'show_in_rest' => true قرار داده شده باشد.
مشکل ۳: تصویر شاخص در صفحه ساخت پست جدید وجود ندارد.
راه حل: بررسی کنید که در بخش supports حتماً عبارت 'thumbnail' درج شده باشد و قالب شما نیز از post-thumbnails پشتیبانی کند.
مشکل ۴: تغییر قالب باعث ناپدید شدن کامل پست تایپ و داده‌های آن می‌شود.
راه حل: داده‌ها در دیتابیس محفوظ هستند. اگر کد CPT را در functions.php قالب نوشته باشید با تغییر قالب غیرفعال می‌شود. برای جلوگیری از این مشکل، کدهای CPT را در یک افزونه اختصاصی (Must-Use Plugin) بنویسید. اگر به ابزارهای برنامه‌نویسی مختلف نیاز دارید می‌توانید به مخزن تکه کدها مراجعه کنید.

پرسش‌های متداول

آیا ساخت پست تایپ‌های متعدد باعث کاهش سرعت سایت می‌شود؟

خیر، ذات ایجاد پست تایپ تاثیری بر سرعت ندارد چون همه آنها در جدول standard wp_posts ذخیره می‌شوند. موضوعی که بر سرعت تاثیر می‌گذارد، تعداد کوئری‌های غیربهینه و استفاده نادرست از متاکئری‌ها است.

تفاوت ساخت پست تایپ با افزونه و کدنویسی چیست؟

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

چگونه برای پست تایپ سفارشی دسته‌بندی بسازم؟

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

آیا امکان انتقال پست‌های پیش‌فرض وردپرس به CPT وجود دارد؟

بله، این کار از طریق تغییر مستقیم ستون post_type در دیتابیس MySQL یا استفاده از افزونه‌هایی مانند Post Type Switcher به‌راحتی امکان‌پذیر است.

سوالات متداول

پست تایپ سفارشی (CPT) چیست؟

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

چرا نباید تابع flush_rewrite_rules را در هوک init اجرا کرد؟

اجرای این تابع در هوک init باعث بازنویسی قوانین پیوند یکتا در هر بار بارگذاری صفحات می‌شود. این کار فشار شدیدی به دیتابیس وارد کرده و سرعت سایت را به شدت کاهش می‌دهد.

آیا برای ساخت پست تایپ سفارشی حتماً به افزونه نیاز داریم؟

خیر، شما می‌توانید بدون نیاز به افزونه و تنها با قرار دادن تابع register_post_type در فایل functions.php یا یک افزونه اختصاصی، پست تایپ مورد نظر خود را بسازید.

پارامتر show_in_rest در ساخت پست تایپ چه کاربردی دارد؟

این پارامتر امکان استفاده از ویرایشگر بلوک (گوتنبرگ) و دسترسی به داده‌های پست تایپ از طریق REST API وردپرس را فعال می‌کند.

Table of Contents

آخرین نوشته‌ها

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

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