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

تفاوت برچسب و دسته

قبل از ورود به توابع، یک تفکیک کوتاه که تصمیم درست را ممکن می‌کند: دسته‌بندی، ساختار سلسله‌مراتبی دارد و محتوای اصلی سایت را سازمان می‌دهد؛ هر نوشته معمولاً به یک یا دو دسته تعلق دارد. برچسب، ساختار مسطح دارد و مفاهیم جانبی را پوشش می‌دهد؛ هر نوشته می‌تواند چندین برچسب داشته باشد. در سئو، دسته‌بندی نقش پررنگ‌تری در ساختار لینک و آرشیو دارد؛ برچسب، نقش کمکی در ارتباط محتوایی. تحلیل تفاوت‌ها در تاکسونومی سفارشی و ساختار URL و سئو. یک قاعدهٔ عملی: برای هر نوشته، یک تا سه برچسب کافی است. اگر برچسب‌ها از پنج مورد بیشتر می‌شوند، احتمالاً دارند نقش دسته‌بندی را بازی می‌کنند.

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

دریافت برچسب

برای دریافت اطلاعات برچسب، توابع اختصاصی و معادل‌های تاکسونومی در دسترس هستند:

get_tag( $tag_id );                             // با شناسه
get_term_by( 'slug', 'wordpress', 'post_tag' ); // با اسلاگ
get_term( $tag_id, 'post_tag' );                // تابع تاکسونومی
get_the_tags( $post_id );                       // برچسب‌های نوشته
get_tags( $args );                              // لیست برچسب‌ها
get_tag_link( $tag_id );                        // لینک برچسب

نکته‌ها: یک — معادل‌های تاکسونومی: از وردپرس ۴.۴، get_term و get_terms برای برچسب‌ها هم کار می‌کنند و استانداردتر هستند. توابع اختصاصی برچسب، همچنان پشتیبانی می‌شوند. دو — get_the_tags: آرایه‌ای از اشیاء WP_Term برمی‌گرداند؛ اگر نبود، false. سه — بررسی بازگشتی:

$tag = get_tag( $tag_id );
if ( $tag && ! is_wp_error( $tag ) ) {
    echo esc_html( $tag->name );
}

راهنمای تفاوت توابع اختصاصی و عمومی در تاکسونومی سفارشی و توابع متادیتا.

نمایش برچسب در حلقه

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

the_tags( $before, $sep, $after );       // چاپ برچسب‌ها
get_the_tags( $post_id );                 // بازگرداندن آرایه

پارامترهای the_tags: یک — قبل: متن یا HTML قبل از اولین برچسب. دو — جداکننده: متن بین برچسب‌ها. سه — بعد: متن بعد از آخرین برچسب. الگوی ساده:

the_tags( '<div class="post-tags">', ' ', '</div>' );

الگوی سفارشی با کنترل کلاس:

$tags = get_the_tags();
if ( ! empty( $tags ) && ! is_wp_error( $tags ) ) :
    echo '<div class="post-tags">';
    foreach ( $tags as $tag ) :
        printf(
            '<a href="%s" class="tag-link">%s</a>',
            esc_url( get_tag_link( $tag->term_id ) ),
            esc_html( $tag->name )
        );
    endforeach;
    echo '</div>';
endif;

چرا این الگو بهتر از the_tags است؟ امکان کنترل کلاس‌ها، ترتیب، escape، و اجتناب از جداکنندهٔ ثابت. راهنمای تفکیک در توابع دادهٔ نوشته.

لینک برچسب، کاربر را به آرشیو برچسب می‌برد:

get_tag_link( $tag_id );
get_term_link( $term );
get_term_link( 'wordpress', 'post_tag' );   // با اسلاگ

نکته: از وردپرس ۴.۴، get_term_link استاندارد است و برای برچسب هم کار می‌کند. همیشه خروجی را با esc_url escape کنید:

<a href="<?php echo esc_url( get_term_link( $tag ) ); ?>">
    <?php echo esc_html( $tag->name ); ?>
</a>

راهنمای ساختار URL در ساختار URL و سئو و توابع لینک و URL.

لیست برچسب‌ها

برای لیست برچسب‌های سایت، از get_tags یا معادل تاکسونومی get_terms استفاده کنید:

$tags = get_tags( array(
    'orderby'    => 'count',
    'order'      => 'DESC',
    'hide_empty' => true,
    'number'     => 20,
) );

foreach ( $tags as $tag ) {
    printf(
        '<a href="%s">%s (%d)</a>',
        esc_url( get_term_link( $tag ) ),
        esc_html( $tag->name ),
        (int) $tag->count
    );
}

پارامترهای کلیدی get_tags: یک — orderby: name (الفبایی)، count (تعداد)، term_id (شناسه). دو — order: ASC یا DESC. سه — hide_empty: نمایش ندادن برچسب‌های بدون نوشته. چهار — number: تعداد برچسب. پنج — name__like: جستجوی الفبایی. با get_terms، پارامترهای مشابه با نام تاکسونومی:

$tags = get_terms( array(
    'taxonomy'   => 'post_tag',
    'hide_empty' => true,
    'orderby'    => 'count',
    'order'      => 'DESC',
    'number'     => 20,
) );

نکته: get_terms در صورت خطا، WP_Error برمی‌گرداند. راهنمای بهینه‌سازی در بهینه‌سازی کوئری‌ها.

ابر برچسب

ابر برچسب (Tag Cloud)، نمایش گرافیکی برچسب‌ها با اندازهٔ متفاوت بر اساس تعداد استفاده است. تابع اختصاصی:

wp_tag_cloud( $args );

پارامترهای پرکاربرد:

wp_tag_cloud( array(
    'smallest'  => 12,
    'largest'   => 24,
    'unit'      => 'px',
    'number'    => 30,
    'format'    => 'flat',      // flat, list, array
    'orderby'   => 'count',
    'order'     => 'DESC',
    'separator' => ' ',
    'taxonomy'  => 'post_tag',
) );

نکته‌ها: یک — اندازه‌ها: کوچک‌ترین و بزرگ‌ترین سایز فونت. دو — format: flat (پیش‌فرض)، list (لیست <ul>)، array (آرایه برای پردازش دلخواه). سه — taxonomy: می‌توانید ابر برچسب را برای تاکسونومی سفارشی بسازید. اگر می‌خواهید ابر برچسب دلخواه با کلاس‌های اختصاصی بسازید، از get_tags و پیاده‌سازی دستی استفاده کنید:

$tags = get_tags( array( 'number' => 30, 'orderby' => 'count', 'order' => 'DESC' ) );
$max_count = 0;
foreach ( $tags as $tag ) {
    if ( $tag->count > $max_count ) $max_count = $tag->count;
}

echo '<div class="tag-cloud">';
foreach ( $tags as $tag ) {
    $size = 12 + ( $tag->count / max( 1, $max_count ) ) * 12; // 12 تا 24
    printf(
        '<a href="%s" style="font-size:%dpx;">%s</a>',
        esc_url( get_term_link( $tag ) ),
        (int) $size,
        esc_html( $tag->name )
    );
}
echo '</div>';

الگوی مشابه در توابع دسته‌بندی. یک نکتهٔ سئویی: ابر برچسب برای بعضی سایت‌ها بار زیاد لینک می‌آورد. در سایت‌های محتوایی، محدودکردن تعداد و استفاده از hide_empty ضروری است. راهنما در سئوی درون‌صفحه.

ساخت و ویرایش برچسب

ساخت و ویرایش برچسب، با توابع تاکسونومی انجام می‌شود:

// ساخت
$result = wp_insert_term( 'وردپرس', 'post_tag', array(
    'description' => 'مطالب مرتبط با وردپرس',
    'slug'        => 'wordpress',
) );

if ( is_wp_error( $result ) ) {
    error_log( $result->get_error_message() );
} else {
    $new_tag_id = $result['term_id'];
}

// به‌روزرسانی
wp_update_term( $tag_id, 'post_tag', array(
    'name'        => 'نام جدید',
    'description' => 'توضیحات جدید',
    'slug'        => 'new-slug',
) );

نکته: توابع wp_insert_term و wp_update_term، هم برای دسته‌بندی و هم برای برچسب و هم برای تاکسونومی سفارشی کار می‌کنند؛ فقط پارامتر دوم (نام تاکسونومی) را تغییر دهید. راهنمای کامل در ساخت تاکسونومی سفارشی.

حذف برچسب

حذف برچسب، با یک تابع ساده انجام می‌شود:

wp_delete_term( $tag_id, 'post_tag' );

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

کوئری بر اساس برچسب

پرس‌وجوی نوشته‌ها بر اساس برچسب، در دو سطح انجام می‌شود:

// در حلقهٔ اصلی
if ( is_tag( 'wordpress' ) ) {
    // آرشیو برچسب وردپرس
}

// با WP_Query
$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 10,
    'tag'            => 'wordpress',                 // فقط اسلاگ
    // یا
    'tag_id'         => 5,                           // فقط شناسه
    // یا
    'tag__in'        => array( 5, 7, 12 ),          // یکی از چند برچسب
    'tag__and'       => array( 5, 7 ),              // همهٔ این برچسب‌ها
    'tag__not_in'    => array( 3, 8 ),              // نه این برچسب‌ها
);
$query = new WP_Query( $args );

تفاوت tag__in و tag__and مهم است: یک — in: نوشته‌هایی که در یکی از برچسب‌های لیست هستند. دو — and: نوشته‌هایی که در همهٔ برچسب‌های لیست هستند. مثال کاربردی: نوشته‌های مرتبط با «وردپرس» و «امنیت» → با and. نوشته‌های مرتبط با یکی از برچسب‌های «فروشگاه»، «لندینگ»، «سئو» → با in. تفصیل در کدنویسی کوئری سفارشی و توابع کوئری سفارشی. یک نکتهٔ عملکردی: ترکیب tag__and با تعداد زیاد برچسب، کوئری سنگینی می‌سازد؛ در سایت‌های بزرگ، از cache نتایج استفاده کنید. راهنما در بهینه‌سازی کوئری‌ها و ترنزینت‌ها در وردپرس.

متادیتای برچسب

برچسب‌ها هم می‌توانند متادیتای سفارشی داشته باشند:

get_term_meta( $tag_id, '_tag_icon', true );       // خواندن
update_term_meta( $tag_id, '_tag_icon', $value );   // به‌روزرسانی
add_term_meta( $tag_id, '_tag_color', $color_id );  // افزودن
delete_term_meta( $tag_id, '_tag_icon' );           // حذف

نمایش متادیتا در front-end:

$color = get_term_meta( $tag->term_id, '_tag_color', true );
if ( $color ) {
    printf(
        '<span class="tag-badge" style="background:%s;">%s</span>',
        esc_attr( $color ),
        esc_html( $tag->name )
    );
}

راهنمای کامل در تاکسونومی سفارشی و توابع متادیتا.

برچسب با متادیتا، ابزار سئوی جانبی و بخشی از تجربهٔ بصری سایت است. تصمیم درست بین نمایش ساده و نمایش با متادیتا، به هدف طراحی بستگی دارد.

escape خروجی و امنیت

سه قاعدهٔ الزامی در کار با برچسب‌ها: یک — escape در نمایش:

echo esc_html( $tag->name );
echo esc_url( get_term_link( $tag ) );
echo wp_kses_post( $tag->description );

دو — بررسی is_wp_error: در خروجی توابعی مثل get_term_link و get_terms:

$link = get_term_link( $tag );
if ( ! is_wp_error( $link ) ) {
    echo esc_url( $link );
}

سه — بررسی current_user_can در ساخت و ویرایش:

if ( ! current_user_can( 'manage_categories' ) ) {
    return;
}

راهنمای کامل در PHP امن در وردپرس، پاک‌سازی داده‌ها، اعتبارسنجی داده‌ها، و توابع نقش و دسترسی. یک آسیب‌پذیری که در پرونده‌های امنیتی بررسی‌شده دیده‌ام: فرم ساخت برچسب در پیشخوان که current_user_can را نداشت؛ نتیجه این بود که هر کاربر با نقش نویسنده، می‌توانست برچسب‌های جدید بسازد و ساختار برچسب‌های سایت را شلوغ کند. کنترل دسترسی، نیمی از امنیت یک فرم مدیریتی است.

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

توابع برچسب وردپرس، در ده گروه مرور شدند: تفاوت با دسته، دریافت، نمایش، لینک، لیست، ابر برچسب، ساخت و ویرایش، حذف، کوئری، و متادیتا. تسلط بر این فهرست، در هر پروژهٔ محتوایی ارزشمند است. اگر امروز یک کار در این مسیر انجام می‌دهید: در سایت فعلی خود، فهرست برچسب‌های پرکاربرد را مرور کنید و ببینید کدام‌یک به‌جای برچسب، باید دسته‌بندی باشد یا به تاکسونومی سفارشی منتقل شود؛ همان بازبینی کوچک، ساختار محتوایی سایت را تمیزتر می‌کند. اگر تجربه‌ای از یک اشتباه رایج در برچسب‌ها — یا یک سناریوی موفق در استفاده از ابر برچسب — دارید، در دیدگاه‌ها بنویسید؛ همان گزارش‌های واقعی، این راهنما را برای توسعه‌دهندهٔ بعدی دقیق‌تر می‌کند. 🏷️