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

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

تاکسونومی در وردپرس، مکانیزم دسته‌بندی محتواست. وردپرس به‌طور پیش‌فرض چهار تاکسونومی دارد: دسته (category) برای نوشته‌ها، برچسب (post_tag) برای نوشته‌ها، post_format و link_category (کم‌کاربرد). تاکسونومی سفارشی، دسته‌بندی جدیدی است که خودتان می‌سازید و به هر نوع محتوایی (نوشته، برگه، CPT) وصل می‌کنید. مثال‌ها: «برند» برای محصولات، «نویسندهٔ مهمان» برای مقالات، «ژانر» برای کتاب‌ها. مفهوم پایه در توابع دسته‌بندی و توابع برچسب آمده است.

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

چه زمانی تاکسونومی سفارشی لازم است؟

سه نشانه: یک — ابعاد مختلفی از دسته‌بندی دارید. یک محصول هم «دستهٔ محصول» دارد، هم «برند»، هم «رنگ». این‌ها نباید در یک تاکسونومی جمع شوند. دو — دسته‌بندی خاص، فقط برای یک نوع محتوا معنا دارد. مثلاً «ژانر» فقط برای کتاب معنا دارد؛ اگر آن را در دسته‌های عمومی بریزید، در بایگانی نوشته‌های خبری هم ظاهر می‌شود. سه — برچسب‌های پیش‌فرض شلوغ شده‌اند. اگر در برچسب‌ها بین مفاهیم مختلف گم شده‌اید، تاکسونومی سفارشی راه نجات است. تجربه‌ام: در پروژه‌ای با سه CPT (محصول، پروژه، مقاله)، انتقال دسته‌بندی‌های ابعادی به تاکسونومی سفارشی، زمان مدیریت محتوا را نصف کرد.

ثبت تاکسونومی با register_taxonomy

اسکلت پایه:

function my_plugin_register_brand_taxonomy() {
    $labels = array(
        'name'              => 'برندها',
        'singular_name'     => 'برند',
        'search_items'      => 'جستجوی برندها',
        'all_items'         => 'همهٔ برندها',
        'edit_item'         => 'ویرایش برند',
        'update_item'       => 'به‌روزرسانی برند',
        'add_new_item'      => 'افزودن برند جدید',
        'new_item_name'     => 'نام برند جدید',
        'menu_name'         => 'برندها',
    );

    $args = array(
        'labels'            => $labels,
        'hierarchical'      => true,
        'public'            => true,
        'show_ui'           => true,
        'show_admin_column' => true,
        'show_in_rest'      => true,
        'rewrite'           => array( 'slug' => 'brand' ),
    );

    register_taxonomy( 'brand', array( 'product' ), $args );
}
add_action( 'init', 'my_plugin_register_brand_taxonomy' );

پنج نکتهٔ کلیدی: یک — ثبت روی hook init. دو — نام تاکسونومی حداکثر ۳۲ کاراکتر، حروف کوچک لاتین. سه — پارامتر دوم: آرایهٔ CPTهایی که این تاکسونومی به آن‌ها متصل است. چهار — show_admin_column: نمایش ستون در لیست CPT (برای تجربهٔ کاربری خوب، توصیه می‌شود). پنج — show_in_rest: برای دسترسی REST و گوتنبرگ. راهنمای دقیق hook در هوک‌های وردپرس.

hierarchical یا flat؟

پارامتر hierarchical تفاوت اساسی در UX می‌سازد: hierarchical = true (مثل دسته‌ها): دارای ساختار سلسله‌مراتبی، زیرمجموعه، و رابط چک‌باکسی. برای تاکسونومی‌هایی مثل «دسته‌بندی»، «منطقه جغرافیایی»، «گروه محصول». hierarchical = false (مثل برچسب‌ها): ساختار ساده و flat. برای تاکسونومی‌هایی مثل «برند»، «رنگ»، «تگ خاص». تجربه‌ام: انتخاب اشتباه این پارامتر، در پروژه‌های پرمحتوا، هزینهٔ مهاجرت بالایی می‌سازد. مثال: اگر برند را hierarchical=false بگذارید و بعداً بخواهید زیربرندها را سازمان دهید، نیاز به مهاجرت کامل داده است.

اتصال به CPT

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

register_taxonomy( 'brand', array( 'product', 'accessory' ), $args );

نکته: اگر می‌خواهید بعداً CPT دیگری به تاکسونومی اضافه کنید، از register_taxonomy_for_object_type استفاده کنید:

register_taxonomy_for_object_type( 'brand', 'accessory' );

تجربه‌ام: در پروژه‌هایی که CPTها در مراحل مختلف اضافه می‌شوند، این تابع نجات‌دهنده است. الگوی کامل CPT در ساخت CPT.

rewrite و slug تاکسونومی

برای URL خوانا:

'rewrite' => array(
    'slug'         => 'brand',
    'with_front'   => false,
    'hierarchical' => true,
),

نکته: اگر تاکسونومی را بعد از انتشار سایت اضافه می‌کنید، حتماً یک بار صفحهٔ پیوندهای یکتا را در پیشخوان ذخیره کنید تا rewrite rules دوباره ساخته شود. بدون این کار، صفحه‌های تاکسونومی ۴۰۴ می‌شوند. الگوی URL حرفه‌ای در ساختار URL و سئو.

نمایش در قالب و پیشخوان

نمایش در قالب، با توابع استاندارد:

// نمایش برند محصول در single-product
$brands = get_the_terms( get_the_ID(), 'brand' );
if ( ! empty( $brands ) && ! is_wp_error( $brands ) ) {
    foreach ( $brands as $brand ) {
        echo '<a href="' . esc_url( get_term_link( $brand ) ) . '">';
        echo esc_html( $brand->name );
        echo '</a>';
    }
}

نکته: همیشه is_wp_error را چک کنید. اگر تاکسونومی وجود نداشته باشد، خطا برمی‌گردد. نمایش در پیشخوان، به‌طور خودکار با show_ui = true انجام می‌شود. الگوی فیلترها در توابع کوئری سفارشی.

سئوی تاکسونومی

سه نکتهٔ سئویی: یک — صفحهٔ تاکسونومی، صفحهٔ آرشیو است. اگر محتوای توضیحی روی آن نگذارید، risk محتوای نازک دارد. در توضیحات term، ۲–۳ خط متن معنادار بنویسید. دو — Duplicate Content. اگر یک نوشته به چند تاکسونومی مشترک تعلق دارد، محتوای آرشیوها می‌تواند تکراری شود. برای رفع: در تنظیمات افزونهٔ سئو، در مواردی noindex روی صفحه‌های کم‌ارزش بگذارید. سه — عنوان و متای صفحهٔ تاکسونومی. افزونه‌های سئو مثل Yoast و Rank Math، امکان تنظیم دستی این‌ها را می‌دهند. استفاده کنید تا عنوان «برند X – سایت شما» به‌جای «آرشیو برند» باشد. راهنمای کامل در سئوی درون‌صفحه و بهترین افزونه‌های سئو.

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

برای توسعه‌دهنده‌های سطح بالا، تاکسونومی سفارشی نه فقط یک قابلیت دسته‌بندی، که یک تصمیم معماری اطلاعات است. سه الگوی پیشرفته: یک — تاکسونومی چندگانه. یک محتوا می‌تواند به دو یا سه تاکسونومی مستقل وصل باشد (مثلاً محصول با «دسته»، «برند»، و «رنگ»). این جداسازی، بازیابی محتوا و فیلتر پیشرفته را ممکن می‌کند. دو — term meta. از وردپرس ۴.۴ به بعد، termها می‌توانند متادیتا داشته باشند (تصویر، توضیح، رنگ). الگو در توابع متادیتا. سه — تاکسونومی به‌عنوان روابط. در پروژه‌هایی با ساختار شبکۀ پیچیده، تاکسونومی می‌تواند نقش «رابطه» بین موجودیت‌ها را بازی کند. تجربه‌ام: در پروژه‌ای با ساختار رستوران-غذا-محتوا، استفاده از تاکسونومی به‌جای جدول رابطه، نگهداری را چند برابر ساده‌تر کرد. الگوی کلی معماری داده در توابع کوئری سفارشی و بهینه‌سازی کوئری‌ها. یک نکته: در تاکسونومی‌های پرترافیک (مثل «برند» در فروشگاه بزرگ)، به‌جای نمایش شمارش واقعی با count (که کوئری سنگین می‌زند)، از مقدار cache شده یا حذف شمارش استفاده کنید. الگوی بهینه‌سازی در همان مقالهٔ بهینه‌سازی کوئری‌ها.

اشتباهات رایج

  • ثبت تاکسونومی روی hook اشتباه: باید init باشد. هوک‌ها.
  • انتخاب اشتباه hierarchical: مهاجرت بعدی سخت می‌شود.
  • فراموش کردن show_in_rest: گوتنبرگ و REST کار نمی‌کنند.
  • فراموش کردن flush_rewrite_rules: ۴۰۴ در آرشیو تاکسونومی.
  • نادیده‌گرفتن is_wp_error در get_the_terms: خطای PHP.
  • تاکسونومی بدون محتوای توضیحی: محتوای نازک و risk سئو.
  • حذف تاکسونومی بدون پاک‌سازی داده: ردیف‌های بی‌استفاده در wp_termmeta.
  • نمایش تمام termها در یک صفحه: کندی و UX ضعیف — همیشه صفحه‌بندی یا کش.

جمع‌بندی

ساخت تاکسونومی سفارشی در وردپرس، پنج گام دارد: ثبت با register_taxonomy، تعریف labels فارسی، انتخاب hierarchical، اتصال به CPT، و نمایش در قالب. قاعدهٔ طلایی: تاکسونومی در افزونه، نه در قالب. اگر امروز فقط یک کار می‌کنید: به ساختار دسته‌بندی سایت فعلی خود نگاه کنید و ببینید آیا ابعاد مختلف دسته‌بندی در یک تاکسونومی جمع شده‌اند؛ اگر بله، تاکسونومی سفارشی راه‌حل است. تجربهٔ خودتان از ساخت تاکسونومی، در دیدگاه‌ها ارزشمند است. 🏷️