تابع register_taxonomy یکی از مهم‌ترین توابع وردپرس برای ساخت انواع دسته‌بندی سفارشی است. این تابع امکان تعریف تاکسونومی‌های مستقل با ساختار سلسله‌مراتبی یا تخت را فراهم می‌کند و پایه ساختاردهی محتوایی پروژه‌های حرفه‌ای محسوب می‌شود. طراحی درست این تابع با labels مناسب، rewrite دقیق و اتصال صحیح به پست تایپ‌ها، انعطاف محتوایی بالایی به پروژه می‌دهد. اشتباهات رایجی مانند نبود flush، نبود labels مناسب، نبود شرط و نبود تست می‌تواند به ناپدید شدن تاکسونومی از پنل یا خطای ۴۰۴ منجر شود. تسلط بر این تابع برای افزونه‌نویسی حرفه‌ای ضروری است و در ساختار محتوایی کاربرد جدی دارد.

چرا تاکسونومی سفارشی یک نیاز جدی است؟

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

تابع register_taxonomy چیست؟

تابع register_taxonomy() یک تابع هسته وردپرس است که در فایل wp-includes/taxonomy.php تعریف شده است. این تابع یک تاکسونومی جدید ثبت می‌کند و آن را به یک یا چند پست تایپ متصل می‌سازد. نکته مهم این است که این تابع تنها در هوک init باید فراخوانی شود. اگر زودتر یا دیرتر اجرا شود، ممکن است تاکسونومی به‌درستی ثبت نشود یا در پنل مدیریت نمایش داده نشود. مفهوم تاکسونومی در وردپرس به دو نوع تقسیم می‌شود: سلسله‌مراتبی (Hierarchical) مانند دسته‌بندی و تخت (Flat) مانند برچسب. برای مطالعه دقیق‌تر روی ثبت پست تایپ سفارشی و اتصال آن به تاکسونومی، به راهنمای register_post_type مراجعه کنید.

امضای تابع و پارامترهای اصلی

امضای این تابع به‌شکل زیر است:
function register_taxonomy( $taxonomy, $object_type, $args = array() ) {
    // ...
}
پارامتر اول (taxonomy) نامک تاکسونومی است که حداکثر ۳۲ کاراکتر و فقط شامل حروف کوچک انگلیسی، عدد، خط تیره و زیرخط است. پارامتر دوم (object_type) یک رشته یا آرایه از نامک پست تایپ‌هایی است که این تاکسونومی به آنها متصل می‌شود. پارامتر سوم (args) آرایه‌ای از تنظیمات است. مهم‌ترین پارامترهای این آرایه عبارت‌اند از: - labels: برچسب‌های نمایشی در پنل مدیریت - public: نمایش عمومی - hierarchical: ساختار سلسله‌مراتبی یا تخت - show_ui: نمایش در پنل مدیریت - show_in_rest: فعال‌سازی در REST API - rewrite: ساختار URL - capabilities: کنترل دسترسی - query_var: پارامتر کوئری

پارامتر labels و برچسب‌ها

پارامتر labels مجموعه‌ای از برچسب‌های نمایشی است که در پنل مدیریت نمایش داده می‌شوند. اگر این پارامتر ندهید، وردپرس برچسب‌های عمومی می‌سازد که معمولاً با برند پروژه هماهنگ نیست. نمونه ساخت labels:
$labels = array(
    'name'              => 'برندها',
    'singular_name'     => 'برند',
    'menu_name'         => 'برندها',
    'all_items'         => 'همه برندها',
    'add_new_item'      => 'افزودن برند جدید',
    'edit_item'         => 'ویرایش برند',
    'update_item'       => 'به‌روزرسانی برند',
    'search_items'      => 'جستجوی برندها',
    'not_found'         => 'برندی پیدا نشد',
    'parent_item'       => 'برند والد',
);
نکته مهم: این برچسب‌ها باید از توابع ترجمه مانند __() و _x() عبور کنند تا پروژه چندزبانه باقی بماند.

hierarchical و انتخاب ساختار

پارامتر hierarchical تعیین می‌کند که آیا تاکسونومی سلسله‌مراتبی است یا تخت. انتخاب درست این پارامتر بر پایه ماهیت داده انجام می‌شود: - اگر تاکسونومی می‌تواند والد و فرزند داشته باشد، از true استفاده کنید - اگر تاکسونومی فهرست تخت است و ترتیب سلسله‌مراتبی ندارد، از false استفاده کنید نمونه: برای تاکسونومی «برند»، مقدار false مناسب است. برای تاکسونومی «دسته‌بندی محصول»، مقدار true مناسب است.

rewrite و ساختار URL

پارامتر rewrite ساختار آدرس‌دهی را تعیین می‌کند. اگر آن را false بگذارید، تاکسونومی در URL نمایش داده نمی‌شود. نمونه پیکربندی:
'rewrite' => array(
    'slug'         => 'brand',
    'with_front'   => false,
    'hierarchical' => false,
),
نکته مهم: اگر ساختار URL را تغییر دهید، باید یک بار rewrite rules را flush کنید. جزئیات بیشتر در بخش بعدی.

capability و کنترل دسترسی

پارامتر capabilities کنترل دسترسی تاکسونومی را تعیین می‌کند. مقدار پیش‌فرض بر پایه پست تایپ متصل تنظیم می‌شود. برای تاکسونومی‌های حساس، باید صریحاً capabilities تعریف شوند:
'capabilities' => array(
    'manage_terms' => 'manage_categories',
    'edit_terms'   => 'manage_categories',
    'delete_terms' => 'manage_categories',
    'assign_terms' => 'edit_posts',
),
نکته مهم: برای مطالعه دقیق‌تر روی کنترل دسترسی، به راهنمای current_user_can مراجعه کنید.

flush_rewrite_rules و زمان صحیح

یکی از پرتکرارترین خطاها در ثبت تاکسونومی سفارشی، فراموشی flush کردن rewrite rules است. فراخوانی flush_rewrite_rules() در هر بار بارگذاری صفحه، هزینه بالایی دارد. روش صحیح، اجرای آن تنها یک بار هنگام فعال‌سازی افزونه است:
register_activation_hook( __FILE__, 'myplugin_activate' );
function myplugin_activate() {
    myplugin_register_brand_taxonomy();
    flush_rewrite_rules();
}
راهنمای هوک فعال‌سازی در صفحه register_activation_hook آمده است.

هوک init و ترتیب ثبت

تاکسونومی سفارشی باید در هوک init ثبت شود. اگر پیش از این هوک اجرا شود، ممکن است برخی بخش‌ها آماده نباشند. اگر دیرتر اجرا شود، ممکن است برخی صفحات پنل از کار بیفتند. نمونه صحیح:
add_action( 'init', 'myplugin_register_brand_taxonomy' );
function myplugin_register_brand_taxonomy() {
    register_taxonomy( 'brand', array( 'post', 'product' ), array(
        // args
    ) );
}

کاربردهای عملی در افزونه

ثبت تاکسونومی «برند» برای محصولات:
function myplugin_register_brand_taxonomy() {
    $labels = array(
        'name'          => __( 'برندها', 'myplugin' ),
        'singular_name' => __( 'برند', 'myplugin' ),
        'search_items'  => __( 'جستجوی برندها', 'myplugin' ),
        'all_items'     => __( 'همه برندها', 'myplugin' ),
        'edit_item'     => __( 'ویرایش برند', 'myplugin' ),
        'add_new_item'  => __( 'افزودن برند جدید', 'myplugin' ),
    );

    register_taxonomy( 'brand', array( 'product' ), array(
        'labels'            => $labels,
        'hierarchical'      => false,
        'public'            => true,
        'show_ui'           => true,
        'show_admin_column' => true,
        'show_in_rest'      => true,
        'rewrite'           => array(
            'slug'       => 'brand',
            'with_front' => false,
        ),
    ) );
}
add_action( 'init', 'myplugin_register_brand_taxonomy' );
نمایش تاکسونومی سفارشی در قالب:
$brands = get_the_terms( get_the_ID(), 'brand' );

if ( $brands && ! is_wp_error( $brands ) ) {
    echo '<ul class="brand-list">';
    foreach ( $brands as $brand ) {
        printf(
            '<li><a href="%s">%s</a></li>',
            esc_url( get_term_link( $brand ) ),
            esc_html( $brand->name )
        );
    }
    echo '</ul>';
}
نکته مهم: همیشه از esc_url و esc_html برای خروجی استفاده کنید. راهنمای این توابع در صفحه esc_html آمده است.

نکات امنیتی و اشتباهات رایج

اشتباه اول، نبود flush پس از تغییر rewrite rules است. این خطا باعث می‌شود URLهای جدید ۴۰۴ برگردانند. اشتباه دوم، نبود labels مناسب است. برچسب‌های پیش‌فرض تجربه کاربری پنل را ضعیف می‌کنند. اشتباه سوم، نبود شرط بررسی وجود تاکسونومی است. اگر افزونه دیگری قبلاً این تاکسونومی را ثبت کرده باشد، ثبت دوباره باعث تداخل می‌شود. الگوی صحیح:
if ( ! taxonomy_exists( 'brand' ) ) {
    register_taxonomy( 'brand', array( 'product' ), $args );
}
اشتباه چهارم، نبود show_in_rest است. اگر از REST API یا ویرایشگر بلوک استفاده می‌کنید، این پارامتر باید true باشد. اشتباه پنجم، نبود capability مناسب است. برای تاکسونومی‌های حساس، کنترل دسترسی باید صریحاً تعریف شود. اشتباه ششم، نبود تست است. پس از ثبت تاکسونومی، باید در پنل، در آرشیو و در REST API آزمون انجام شود.

تحلیل فنی پیشرفته

در نگاه مهندسی، تابع register_taxonomy() یک نقطه معماری در لایه Content Structure است که بر چند لایه سیستم اثر می‌گذارد. لایه اول لایه پایگاه داده است. تاکسونومی‌ها در جداول wp_terms، wp_term_taxonomy و wp_term_relationships ذخیره می‌شوند و هیچ جدول جدیدی ساخته نمی‌شود. لایه دوم لایه Routing است. پارامتر rewrite قوانین بازنویسی URL را تنظیم می‌کند و بر رفتار آرشیو تأثیر می‌گذارد. اگر قوانین درست تنظیم نشوند، آرشیو تاکسونومی ناپدید می‌شود. لایه سوم لایه REST Integration است. با show_in_rest => true، تاکسونومی در REST API ظاهر می‌شود و در ویرایشگر بلوک قابل استفاده است. برای مطالعه بیشتر به راهنمای register_rest_route مراجعه کنید. لایه چهارم لایه Performance است. تعداد زیاد تاکسونومی‌ها می‌تواند کوئری‌های JOIN را پیچیده‌تر کند و بر سرعت آرشیو اثر بگذارد. لایه پنجم لایه Multisite است. در شبکه‌های Multisite، تاکسونومی‌ها در سطح هر سایت مستقل ثبت می‌شوند. لایه ششم لایه Testing است. تست‌های End-to-End باید همه جنبه‌های تاکسونومی را پوشش دهند. مفاهیم پایه‌ای Taxonomy در Taxonomy در ویکی‌پدیا توضیح داده شده است. برای مطالعه بیشتر روی توابع مرتبط، می‌توانید به راهنمای register_post_type، راهنمای register_meta، راهنمای register_rest_route، راهنمای current_user_can، راهنمای esc_html و راهنمای is_archive مراجعه کنید.

پرسش‌های پرتکرار

تفاوت تاکسونومی سلسله‌مراتبی و تخت چیست؟ اولی والد و فرزند دارد و دومی فهرست تخت است. آیا می‌توان یک تاکسونومی را به چند پست تایپ متصل کرد؟ بله، با پاس دادن آرایه. آیا پس از تغییر slug باید flush انجام شود؟ بله، یک بار پس از تغییر. آیا تاکسونومی سفارشی در REST API نمایش داده می‌شود؟ تنها اگر show_in_rest => true باشد. آیا می‌توان تاکسونومی پیش‌فرض وردپرس را حذف کرد؟ به‌طور کامل نه، اما می‌توان آن را از یک پست تایپ جدا کرد.

ادامه مسیر

تابع register_taxonomy() ابزار اصلی وردپرس برای ساختاردهی محتوایی سفارشی است. استفاده درست از آن یعنی تعریف labels مناسب، انتخاب hierarchical درست، تعریف rewrite دقیق، افزودن شرط بررسی وجود و اجرای flush در هوک فعال‌سازی. اشتباه‌های کوچک در این تابع اغلب به ناپدید شدن تاکسونومی از پنل یا خطای ۴۰۴ منجر می‌شوند. اگر این تابع را در پروژه‌ای واقعی به کار برده‌اید و رفتار غیرمنتظره‌ای دیده‌اید — به‌خصوص در Multisite یا در ترکیب با پست تایپ‌های سفارشی — تجربه‌تان می‌تواند راهگشای دیگران باشد. کدام بخش بیشترین زمان را از شما گرفت؟ دیدگاه خود را بنویسید.