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

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

شورت‌کد در وردپرس، در نگاه اول شبیه یک میان‌بر ساده به‌نظر می‌رسد؛ ولی در تجربهٔ من، سه ویژگی آن را به یک راه‌حل ویرایشی هوشمند تبدیل می‌کند که سال‌ها در پروژه‌ها کاربرد داشته است:

ویژگی اول: جداسازی منطق از محتوا. به‌جای اینکه نویسنده هر بار یک قطعه HTML پیچیده را کپی کند، یک برچسب کوچک مثل [wphk_notice] در محتوا می‌گذارد و توسعه‌دهنده منطق رندر را در کد می‌نویسد. این جداسازی، هم کار نویسنده را ساده‌تر می‌کند و هم اجازه می‌دهد توسعه‌دهنده بدون دست‌زدن به محتوا، ظاهر و رفتار را تغییر دهد.

ویژگی دوم: انعطاف در زمان. اگر روزی رنگ کادر هشدار شما عوض شود، فقط یک خط CSS یا یک مقدار در کد شورت‌کد را تغییر می‌دهید و همهٔ نوشته‌هایی که از آن شورت‌کد استفاده کرده‌اند، به‌طور خودکار به‌روز می‌شوند. اگر همان کادر را با HTML سخت‌نویسی اضافه کرده باشید، باید همهٔ نوشته‌ها را دستی ویرایش کنید.

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

شورت‌کد، پل بین نویسنده و توسعه‌دهنده است. نویسنده با یک برچسب ساده سفارش می‌دهد و توسعه‌دهنده پشت صحنه، منطق آن را در کد می‌نویسد. این پل، سرعت و دقت را هم‌زمان بالا می‌برد.

شورت‌کد وردپرس دقیقاً چیست؟

شورت‌کد (Shortcode) یک برچسب کوتاه درون محتوای نوشته است که وردپرس در لحظهٔ نمایش، آن را با خروجی HTML نهایی جایگزین می‌کند. این برچسب، درون ویرایشگر وردپرس با علامت براکت نوشته می‌شود، مثل [wphk_notice] یا [wphk_button url="https://example.com"]کلیک کنید[/wphk_button]. در تجربهٔ من، بیشترین کاربرد شورت‌کدها در سه دسته است:

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

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

تابع add_shortcode: پایه‌ای‌ترین ابزار ساخت شورت‌کد

ابزار اصلی برای ثبت یک شورت‌کد جدید در وردپرس، تابع add_shortcode است. این تابع دو پارامتر می‌گیرد: نام شورت‌کد (tag) و نام تابع callback که وظیفهٔ تولید خروجی را دارد:

add_shortcode( 'wphk_notice', 'wphk_render_notice' );

function wphk_render_notice( $atts, $content = null, $tag = '' ) {
    // منطق تولید HTML
    return '<div class="wphk-notice">' . esc_html( $content ) . '</div>';
}

چهار نکتهٔ کلیدی در همین نمونهٔ ساده. اول، نام شورت‌کد با پیشوند اختصاصی (wphk_) انتخاب شده تا تعارض با شورت‌کدهای افزونه‌های دیگر پیش نیاید. دوم، تابع callback سه پارامتر می‌پذیرد: ویژگی‌ها ($atts)، محتوای درونی ($content)، و نام تگ شورت‌کد ($tag). این سه پارامتر همیشه در همین ترتیب به تابع می‌رسند. سوم، در این نمونه، مقدار پیش‌فرض $content روی null تنظیم شده که شورت‌کد را هم به‌شکل تکی و هم به‌شکل محتوا‌محور پشتیبانی می‌کند. چهارم، خروجی تابع باید همیشه یک رشته باشد؛ شورت‌کد چیزی چاپ نمی‌کند، بلکه مقدار نهایی را برمی‌گرداند. تفاوت دقیق این رفتار با Actionها در هوک‌های وردپرس چیستند و چگونه کار می‌کنند توضیح داده شده است.

نکتهٔ مهم در زمان ثبت: تابع add_shortcode خودش نباید درون یک تابع دیگر قرار بگیرد و باید در زمان بارگذاری افزونه یا قالب اجرا شود. اگر این کار را اشتباه انجام دهید، شورت‌کد شما ممکن است در برخی صفحات کار کند و در برخی دیگر نه. نمونهٔ درست ثبت، در قالب یک اسنیپت کامل:

add_action( 'init', 'wphk_register_shortcodes' );

function wphk_register_shortcodes() {
    add_shortcode( 'wphk_notice', 'wphk_render_notice' );
}

استفاده از هوک init برای ثبت شورت‌کد، استاندارد توصیه‌شده در وردپرس است؛ چون این هوک در زمان مناسبی از چرخهٔ بارگذاری اجرا می‌شود و تضمین می‌کند که همهٔ توابع وابسته پیش از ثبت شورت‌کد در دسترس هستند. توضیح تکمیلی این هوک در مهم‌ترین Action Hook های وردپرس آمده است.

ساخت ساده‌ترین شورت‌کد

ساده‌ترین شورت‌کد، برچسبی است که خروجی ثابت یا شبه‌ثابت تولید می‌کند. نمونهٔ کامل یک شورت‌کد ساده که یک دکمهٔ سفارشی با متن و لینک مشخص می‌سازد:

/**
 * Snippet: Add a custom button shortcode.
 *
 * @since 2026-09-16
 * @author WordPressKar
 *
 * Purpose: Register a [wphk_button] shortcode for call-to-action buttons.
 * Location: mu-plugins directory or child theme functions.php.
 */

add_action( 'init', 'wphk_register_button_shortcode' );

function wphk_register_button_shortcode() {
    add_shortcode( 'wphk_button', 'wphk_render_button' );
}

function wphk_render_button( $atts, $content = null ) {
    if ( empty( $content ) ) {
        return '';
    }

    $atts = shortcode_atts( array(
        'url'    => '#',
        'target' => '_self',
        'style'  => 'primary',
    ), $atts, 'wphk_button' );

    $url    = esc_url( $atts['url'] );
    $target = in_array( $atts['target'], array( '_blank', '_self' ), true ) ? $atts['target'] : '_self';
    $style  = sanitize_html_class( $atts['style'] );

    return sprintf(
        '<a href="%s" target="%s" class="wphk-button wphk-button--%s">%s</a>',
        $url,
        esc_attr( $target ),
        esc_attr( $style ),
        esc_html( $content )
    );
}

شش نکتهٔ کلیدی در این نمونه. اول، بررسی empty( $content ) در ابتدای تابع که از تولید دکمه‌های خالی جلوگیری می‌کند. دوم، استفاده از تابع shortcode_atts که مقادیر پیش‌فرض را با ویژگی‌های ارائه‌شده توسط کاربر ادغام می‌کند. سوم، پارامتر سوم shortcode_atts روی نام شورت‌کد تنظیم شده که امکان فیلتر مقادیر توسط افزونه‌های دیگر را فراهم می‌کند. چهارم، پاک‌سازی هر سه مقدار متغیر: esc_url برای URL، esc_attr برای مقدار ویژگی، و sanitize_html_class برای نام کلاس CSS. پنجم، محدودسازی مقدار target به دو گزینهٔ مجاز (_blank و _self) که جلوی تزریق مقادیر ناخواسته را می‌گیرد. ششم، esc_html روی محتوای درونی که از تزریق HTML جلوگیری می‌کند. اصول جامع این پاک‌سازی‌ها در هوک‌های وردپرس و افزایش امنیت کد آمده است.

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

[wphk_button url="https://example.com/contact" style="primary"]تماس با ما[/wphk_button]

شورت‌کد با ویژگی‌ها: پیکربندی از دل محتوا

ویژگی‌ها در شورت‌کد، همان پارامترهایی هستند که نویسنده می‌تواند در زمان استفاده مشخص کند. ابزار اصلی برای کار با این ویژگی‌ها، تابع shortcode_atts است که مقادیر پیش‌فرض را با مقادیر ارائه‌شده ترکیب می‌کند. نمونه‌ای از یک شورت‌کد کادر هشدار با قابلیت تعیین نوع (اطلاع، هشدار، خطا):

add_shortcode( 'wphk_notice', 'wphk_render_notice_box' );

function wphk_render_notice_box( $atts, $content = null ) {
    $atts = shortcode_atts( array(
        'type'  => 'info',
        'title' => '',
    ), $atts, 'wphk_notice' );

    $allowed_types = array( 'info', 'warning', 'error', 'success' );
    $type          = in_array( $atts['type'], $allowed_types, true ) ? $atts['type'] : 'info';

    $title_html = '' ;
    if ( ! empty( $atts['title'] ) ) {
        $title_html = '<h4 class="wphk-notice-title">' . esc_html( $atts['title'] ) . '</h4>';
    }

    return sprintf(
        '<div class="wphk-notice wphk-notice--%s">%s<div class="wphk-notice-body">%s</div></div>',
        esc_attr( $type ),
        $title_html,
        wp_kses_post( $content )
    );
}

چهار نکتهٔ کلیدی در این الگو. اول، استفاده از shortcode_atts با مقادیر پیش‌فرض معقول که شورت‌کد را حتی بدون هیچ ویژگی‌ای قابل استفاده می‌کند. دوم، محدودسازی مقدار type به مقادیر مجاز با in_array که از تزریق مقادیر ناخواسته جلوگیری می‌کند. سوم، استفاده از wp_kses_post به‌جای esc_html برای محتوای درونی؛ این تصمیم اجازه می‌دهد نویسنده از تگ‌های HTML مجاز مثل لینک و بولد در کادر استفاده کند. چهارم، ترکیب sprintf و توابع پاک‌سازی که خوانایی و امنیت را هم‌زمان می‌سازد. تفاوت دقیق esc_html و wp_kses_post در حملات XSS چیست و چگونه دفع می‌شود آمده است.

نمونهٔ استفاده در محتوا:

[wphk_notice type="warning" title="توجه"]این نوشته ممکن است به‌روزرسانی شود.[/wphk_notice]

شورت‌کد محتوا‌محور: پوشاندن متن دلخواه

شورت‌کدهای محتوا‌محور، همان شورت‌کدهایی هستند که متن دلخواه را درون خود می‌گیرند و آن را در یک قالب خاص نمایش می‌دهند. تفاوت اصلی این نوع با شورت‌کدهای ساده، در وجود پارامتر $content است که همیشه در تابع callback در دسترس قرار می‌گیرد. مهم‌ترین نکته در این نوع شورت‌کدها، مدیریت صحیح تگ‌های بسته و کوتاه‌شده است. یک شورت‌کد محتوا‌محور می‌تواند به دو شکل استفاده شود:

  • شکل بسته: [wphk_notice]متن دلخواه[/wphk_notice]
  • شکل خودبسته: [wphk_notice] یا [wphk_notice /]

الگوی درست برای مدیریت هر دو شکل:

add_shortcode( 'wphk_quote', 'wphk_render_quote' );

function wphk_render_quote( $atts, $content = null ) {
    $atts = shortcode_atts( array(
        'author' => '',
    ), $atts, 'wphk_quote' );

    // اگر محتوای درونی وجود ندارد، یک نقل‌قول خالی برمی‌گردانیم
    if ( null === $content ) {
        return '';
    }

    $author_html = '' ;
    if ( ! empty( $atts['author'] ) ) {
        $author_html = '<cite class="wphk-quote-author">' . esc_html( $atts['author'] ) . '</cite>';
    }

    return sprintf(
        '<blockquote class="wphk-quote">%s%s</blockquote>',
        wp_kses_post( $content ),
        $author_html
    );
}

سه نکتهٔ کلیدی در این الگو. اول، بررسی null === $content که اگر شورت‌کد به‌شکل خودبسته استفاده شود و محتوایی نداشته باشد، خروجی خالی تولید می‌کند. دوم، پاک‌سازی محتوای درونی با wp_kses_post که اجازهٔ تگ‌های HTML مجاز را می‌دهد ولی از تزریق کد مخرب جلوگیری می‌کند. سوم، قرار دادن مقدار اختیاری author در انتهای خروجی که با تگ cite ارائه می‌شود. اگر با مفهوم wp_kses_post و کاربردش در محتوا آشنایی کمتری دارید، هوک‌های وردپرس و افزایش امنیت کد مرجع کاملی است.

پاک‌سازی ورودی و خروجی: تفکیک حیاتی

در ساخت شورت‌کد، تفکیک بین «ویژگی‌ها» و «محتوای درونی» اهمیت اساسی دارد، چون هرکدام به شکل متفاوتی پاک‌سازی می‌شوند:

نوع دادهمنبعتابع پاک‌سازی مناسب
URLویژگی urlesc_url
مقدار ویژگی سادهویژگی title و…esc_attr
نام کلاس CSSویژگی classsanitize_html_class
شناسه یا عددویژگی idabsint یا intval
محتوای درونی سادهمحتوای بین برچسب‌هاesc_html
محتوای درونی با HTML مجازمحتوای بین برچسب‌هاwp_kses_post

سه نکتهٔ کلیدی در این جدول. اول، هر نوع داده، تابع پاک‌سازی مخصوص خودش دارد؛ استفاده از یک تابع برای همهٔ انواع، اشتباه رایجی است که هم امنیت و هم ظاهر خروجی را خراب می‌کند. دوم، وقتی محتوای درونی را با esc_html پاک‌سازی می‌کنید، تگ‌های HTML به متن خام تبدیل می‌شوند؛ این رفتار برای کادرهای متن ساده درست است ولی برای محتوایی که باید HTML داشته باشد، باید از wp_kses_post استفاده کنید. سوم، در کنار پاک‌سازی، همیشه مقادیر ویژگی را با in_array محدود کنید تا از مقادیر ناخواسته جلوگیری شود. مبانی این اصول در هوک‌های وردپرس و افزایش امنیت کد آمده است.

در شورت‌کد، هر خط خطا در پاک‌سازی، یک درِ باز برای تزریق محتوا به سایت شماست. شورت‌کدها ابزارهای نویسندگان هستند و نویسندگان، لزوماً با امنیت آشنا نیستند.

بارگذاری شرطی و پرهیز از اثر بر دیگر بخش‌ها

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

add_action( 'wp_enqueue_scripts', 'wphk_conditional_shortcode_assets' );

function wphk_conditional_shortcode_assets() {
    if ( ! is_singular() ) {
        return;
    }

    $post = get_post();
    if ( ! $post instanceof WP_Post ) {
        return;
    }

    if ( ! has_shortcode( $post->post_content, 'wphk_notice' ) ) {
        return;
    }

    wp_enqueue_style(
        'wphk-notice-css',
        plugins_url( 'assets/notice.css', __FILE__ ),
        array(),
        '1.0.0'
    );
}

چهار نکتهٔ کلیدی در این الگو. اول، بررسی is_singular که از بارگذاری در آرشیوها و صفحات فهرست جلوگیری می‌کند. دوم، بررسی instanceof WP_Post برای اطمینان از مقداردهی درست پست جاری. سوم، استفاده از تابع has_shortcode که به‌طور دقیق تشخیص می‌دهد آیا شورت‌کد مورد نظر در محتوا وجود دارد یا نه. چهارم، بارگذاری استایل پس از سه شرط که تضمین می‌کند این فایل فقط در صفحات لازم بارگذاری می‌شود. تحلیل تفصیلی این رویکرد در افزونه‌های وردپرس چگونه روی سرعت سایت اثر می‌گذارند آمده است.

یک نکتهٔ عملی از تجربهٔ خودم: در سایت‌هایی که از قالب‌های سنگین استفاده می‌کنند، بارگذاری شرطی CSS و JS شورت‌کدها می‌تواند تفاوت محسوسی در امتیاز Core Web Vitals بسازد. اگر از شورت‌کدهای پرشمار استفاده می‌کنید، این تصمیم را جدی بگیرید. توضیح معیارهای دقیق در Core Web Vitals چیست و چرا گوگل بر آن تاکید دارد آمده است.

چند نمونهٔ کاربردی از پروژه‌های واقعی

در پروژه‌های خودم، شورت‌کدهای زیر پرکاربردترین‌ها بوده‌اند و هرکدام نکتهٔ فنی خاصی دارند:

شورت‌کد نمایش آخرین نوشته‌های یک دسته

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

add_shortcode( 'wphk_recent_posts', 'wphk_render_recent_posts' );

function wphk_render_recent_posts( $atts ) {
    $atts = shortcode_atts( array(
        'category' => '',
        'count'    => 5,
    ), $atts, 'wphk_recent_posts' );

    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => absint( $atts['count'] ),
        'no_found_rows'  => true,
    );

    if ( ! empty( $atts['category'] ) ) {
        $args['category_name'] = sanitize_title( $atts['category'] );
    }

    $query = new WP_Query( $args );
    if ( ! $query->have_posts() ) {
        return '';
    }

    $output = '<ul class="wphk-recent-posts">';
    while ( $query->have_posts() ) {
        $query->the_post();
        $output .= sprintf(
            '<li><a href="%s">%s</a></li>',
            esc_url( get_permalink() ),
            esc_html( get_the_title() )
        );
    }
    $output .= '</ul>';

    wp_reset_postdata();
    return $output;
}

چهار نکتهٔ کلیدی: اول، استفاده از absint برای تعداد که از مقادیر منفی یا نامعتبر جلوگیری می‌کند. دوم، استفاده از sanitize_title برای نام دسته. سوم، پارامتر no_found_rows => true که پرس‌وجو را سریع‌تر می‌کند چون نیازی به شمارش کل نتایج نداریم. چهارم، فراخوانی wp_reset_postdata در انتهای تابع که از اثر ناخواسته بر حلقهٔ اصلی جلوگیری می‌کند. اصول کار با این نوع کوئری‌ها در توابع وردپرس برای دریافت اطلاعات نوشته آمده است.

شورت‌کد نمایش فیلد سفارشی

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

add_shortcode( 'wphk_meta', 'wphk_render_meta_shortcode' );

function wphk_render_meta_shortcode( $atts ) {
    $atts = shortcode_atts( array(
        'key' => '',
    ), $atts, 'wphk_meta' );

    if ( empty( $atts['key'] ) ) {
        return '';
    }

    $key   = sanitize_key( $atts['key'] );
    $value = get_post_meta( get_the_ID(), $key, true );

    if ( empty( $value ) ) {
        return '';
    }

    return '<span class="wphk-meta">' . esc_html( $value ) . '</span>';
}

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

شورت‌کد نمایش اطلاعات کاربر

در سامانه‌های عضویت‌محور، این شورت‌کد به‌طور شرطی اطلاعاتی از کاربر جاری را نمایش می‌دهد:

add_shortcode( 'wphk_user', 'wphk_render_user_shortcode' );

function wphk_render_user_shortcode( $atts ) {
    $atts = shortcode_atts( array(
        'field' => 'display_name',
    ), $atts, 'wphk_user' );

    if ( ! is_user_logged_in() ) {
        return '';
    }

    $user = wp_get_current_user();
    if ( ! $user instanceof WP_User ) {
        return '';
    }

    $allowed = array( 'display_name', 'user_email', 'user_login' );
    if ( ! in_array( $atts['field'], $allowed, true ) ) {
        return '';
    }

    return esc_html( $user->{$atts['field']} );
}

چهار نکتهٔ کلیدی: اول، بررسی is_user_logged_in که شورت‌کد را برای کاربران مهمان بی‌اثر می‌کند. دوم، محدودسازی فیلدهای مجاز با in_array که از نمایش فیلدهای حساس جلوگیری می‌کند. سوم، استفاده از ویژگی پویا ($user->{$field}) پس از اطمینان از مقدار مجاز. چهارم، esc_html برای خروجی که از تزریق داده در HTML جلوگیری می‌کند. تحلیل جامع توابع مربوط به کاربران در توابع وردپرس برای کار با کاربران آمده است.

ملاحظات کارایی و کش

شورت‌کدها به‌طور معمول سبک هستند ولی در سایت‌های پربازدید می‌توانند منبع کندی باشند. سه ملاحظهٔ کارایی که در پروژه‌های خودم رعایت می‌کنم:

ملاحظهٔ اول: کش محتوای سنگین. اگر شورت‌کد شما کوئری به دیتابیس می‌زند (مثل نمایش آخرین نوشته‌ها)، نتیجهٔ آن را با transient کش کنید. الگوی مشابه:

function wphk_render_recent_posts( $atts ) {
    $cache_key = 'wphk_recent_' . md5( serialize( $atts ) );
    $cached    = get_transient( $cache_key );

    if ( false !== $cached ) {
        return $cached;
    }

    // ... منطق تولید خروجی ...
    $output = '';

    set_transient( $cache_key, $output, HOUR_IN_SECONDS );
    return $output;
}

سه نکتهٔ کلیدی: اول، ساخت کلید کش براساس ویژگی‌ها که تضمین می‌کند هر ترکیب ویژگی، کش جداگانه‌ای داشته باشد. دوم، بررسی وجود کش پیش از اجرای کوئری. سوم، تنظیم زمان کش براساس سرعت تغییر داده. برای مطالعهٔ بیشتر در این حوزه، بهترین افزونه‌های کش وردپرس برای افزایش سرعت مرجع کاملی است.

ملاحظهٔ دوم: پرهیز از کوئری در حلقه. اگر شورت‌کد شما در یک حلقه (مثل نمایش فهرست نوشته‌ها) چند بار اجرا می‌شود، هر بار یک کوئری جدید می‌زند. راه‌حل: دادهٔ مشترک را در سطح فایل یا در یک متغیر استاتیک کش کنید. این تصمیم، در سایت‌های با تعداد زیاد نوشته، تفاوت محسوسی در زمان بارگذاری می‌سازد.

ملاحظهٔ سوم: بارگذاری شرطی CSS/JS. همان‌طور که در بخش قبل توضیح دادم، همیشه فایل‌های جانبی شورت‌کد را فقط در صفحاتی که شورت‌کد در آن‌ها استفاده شده بارگذاری کنید. این رویکرد، در سایت‌هایی با چند شورت‌کد، بار قابل‌توجهی را از صفحات دیگر برمی‌دارد.

محل درست قرارگیری این اسنیپت

مانند همهٔ اسنیپت‌های وردپرس، محل قرارگیری این کد هم تصمیم مهمی است. سه گزینه پیش روی شماست:

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

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

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

الگوی عملی من در پروژه‌های خودم: تمام شورت‌کدهای اختصاصی را در یک افزونهٔ کوچک به نام «wphk-shortcodes» نگه می‌دارم که هم‌زمان چند قابلیت مرتبط را در خود دارد. برای هر شورت‌کد، یک فایل PHP جدا و یک فایل CSS/JS جدا (در صورت نیاز) تعریف می‌کنم. این ساختار، نگهداری چندساله را بسیار ساده می‌کند. برای دیدن فهرست گسترده‌تری از اسنیپت‌های کاربردی، بهترین قطعه کدهای کاربردی وردپرس برای سایت‌ها مرجع خوبی است.

اشتباهات رایج در ساخت شورت‌کد

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

اشتباهپیامد واقعیاصلاح
ثبت شورت‌کد درون یک تابع دیگر بدون هوک مناسبشورت‌کد در برخی صفحات کار نمی‌کنداستفاده از هوک init
نبود پاک‌سازی ویژگی‌ها و محتوای درونیریسک XSSاستفاده از esc_* و wp_kses_post
استفاده از esc_html برای محتوایی که HTML داردنمایش متن خام به‌جای HTMLاستفاده از wp_kses_post
نبود wp_reset_postdata پس از کوئری سفارشیاثر ناخواسته بر حلقهٔ اصلی سایتفراخوانی در انتهای تابع
نبود پیشوند اختصاصی در نام شورت‌کدتعارض با افزونه‌های دیگرپیشوند یکتا مثل wphk_
نبود بررسی has_shortcode پیش از بارگذاری CSS/JSبارگذاری بی‌دلیل فایل در همه صفحاتبررسی وجود شورت‌کد در محتوا

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

مسیر پیشنهادی و نتیجه

قطعه کد افزودن شورت‌کد سفارشی وردپرس، یکی از پرکاربردترین ابزارهای ویرایشی است که هم تجربهٔ نویسنده را ساده‌تر می‌کند و هم به توسعه‌دهنده اجازه می‌دهد منطق را در یک نقطهٔ مشخص نگه دارد. سه ستون این کار: ثبت شورت‌کد با add_shortcode در هوک init، مدیریت ویژگی‌ها با shortcode_atts و محدودسازی مقادیر مجاز، و پاک‌سازی دقیق خروجی براساس نوع داده. سه ملاحظهٔ کارایی (کش محتوای سنگین، پرهیز از کوئری در حلقه، بارگذاری شرطی CSS/JS) در سایت‌های پربازدید تفاوت محسوسی می‌سازند. سه ملاحظهٔ امنیتی (پاک‌سازی ویژگی‌ها و محتوا، محدودسازی مقادیر مجاز، پرهیز از افشای داده حساس) در همهٔ شورت‌کدها باید رعایت شوند. و محل درست این اسنیپت، افزونهٔ اختصاصی یا mu-plugins است، نه فایل قالب والد.

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