در پروژه‌ای که برای یک مجله آنلاین کار می‌کردم، مدیر سایت شکایت داشت که بازدیدکننده‌ها از نتایج جستجو روی چند برگهٔ قدیمی می‌آیند و با صفحهٔ «۴۰۴ یافت نشد» روبه‌رو می‌شوند. آن برگه‌ها، پنج سال پیش بخشی از سایت بودند و بعد از یک بازطراحی، آدرسشان تغییر کرده بود. مدیر انتظار داشت گوگل خودش این موضوع را بفهمد، ولی می‌دانیم که گوگل نه حافظه دارد و نه از گذشتهٔ سایت ما خبر دارد. راه‌حل، آن‌قدر ساده بود که وقتی برای مدیر توضیح دادم، با تعجب پرسید: «همین؟ یک خط کد؟» بله، همین. یک ریدایرکت ۳۰۱ که با یک اسنیپت کوچک اعمال شد، توانست آن برگه‌های قدیمی را به معادل‌های جدیدشان هدایت کند و در همان هفتهٔ اول، ترافیک ارگانیک آن صفحات به معادل‌های جدید منتقل شد. در این مقاله، دقیقاً همان موضوع را با هم مرور می‌کنیم: قطعه کد افزودن ریدایرکت در وردپرس چه کاری انجام می‌دهد، با چه هوک‌ها کار می‌کند، چطور براساس نوع صفحه و نقش کاربر اعمال شرطی شود، و چه ملاحظات سئو، امنیت و پایداری در آن وجود دارد. اگر با مفهوم پایهٔ اسنیپت آشنا نیستید، پیش از ادامه قطعه کد وردپرس چیست و چگونه از آن استفاده کنیم نقطهٔ شروع بهتری است. برای درک پایه‌های این حوزه، مقالهٔ توابع وردپرس برای مدیریت ریدایرکت‌ها نیز مرجع کاملی است.

ریدایرکت در وردپرس دقیقاً یعنی چه؟

ریدایرکت (Redirect) به هدایت خودکار کاربر از یک آدرس به آدرس دیگر گفته می‌شود. وقتی کاربری روی یک لینک کلیک می‌کند یا آدرسی را در مرورگر وارد می‌کند، و آن آدرس دیگر وجود ندارد یا به جای دیگری منتقل شده، سرور به‌جای پاسخ با خطای ۴۰۴، پاسخ ۳۰۱ (Moved Permanently) می‌دهد و مرورگر کاربر را به آدرس جدید هدایت می‌کند. این مکانیزم، در تجربهٔ من، سه کاربرد اصلی دارد:

کاربرد اول: انتقال محتوا بدون از دست دادن سئو. وقتی آدرس یک نوشته یا محصول تغییر می‌کند، ریدایرکت ۳۰۱ به گوگل می‌گوید که محتوا فقط جابه‌جا شده و باید اعتبار قبلی به آدرس جدید منتقل شود. بدون این ریدایرکت، گوگل با خطای ۴۰۴ روبه‌رو می‌شود و اعتبار آن صفحه از بین می‌رود. تحلیل تفصیلی این موضوع در سئو چیست و چگونه به رشد سایت کمک می‌کند آمده است.

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

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

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

چرا ریدایرکت، یک تصمیم سئویی و تجربی است

ریدایرکت، در نگاه اول یک تصمیم فنی به‌نظر می‌رسد؛ ولی در تجربهٔ من، هم‌زمان یک تصمیم سئویی و یک تصمیم تجربی است. سه دلیل که این دو بُعد را در تصمیم‌گیری‌های خودم کنار هم می‌گذارم:

دلیل اول: حفظ اعتبار سئو. وقتی آدرس یک صفحه تغییر می‌کند، گوگل به آن صفحه اعتبار داده است: بک‌لینک‌ها، رتبه، ترافیک. اگر ریدایرکت ۳۰۱ درست اعمال شود، این اعتبار به آدرس جدید منتقل می‌شود. اگر نه، به مرور زمان از بین می‌رود. تجربهٔ من در سایتی که ساختار URL آن از تاریخ‌محور به اسلاگ‌محور تغییر کرد، نشان داد که بدون ریدایرکت ۳۰۱، ترافیک ارگانیک آن بخش از سایت در دو ماه حدود ۷۰٪ افت کرد.

دلیل دوم: تجربهٔ کاربر. کاربری که روی لینک قدیمی کلیک می‌کند، انتظار دارد محتوای مرتبط را ببیند، نه صفحهٔ ۴۰۴. اگر بلافاصله به صفحهٔ مناسب هدایت شود، هم تجربهٔ بهتری داشته و هم احتمال می‌ماند در سایت شما بماند.

دلیل سوم: جلوگیری از ایجاد محتوای تکراری. اگر همان محتوا در چند آدرس مختلف قابل دسترس باشد، گوگل با محتوای تکراری روبه‌رو می‌شود و این می‌تواند روی رتبهٔ هر دو آدرس اثر منفی بگذارد. ریدایرکت ۳۰۱ در این حالت، همهٔ آدرس‌های تکراری را به یک آدرس مرجع هدایت می‌کند. توضیح این موضوع در سئو تکنیکال چیست و چرا مهم است آمده است.

انواع ریدایرکت: ۳۰۱، ۳۰۲، ۳۰۷ و ۳۰۸

ریدایرکت‌ها براساس کد HTTP به چهار دستهٔ اصلی تقسیم می‌شوند که هرکدام کاربرد متفاوتی دارند:

کدمعنیکاربرد
۳۰۱Moved Permanentlyانتقال دائمی؛ اعتبار سئو منتقل می‌شود
۳۰۲Foundانتقال موقت؛ اعتبار سئو منتقل نمی‌شود
۳۰۷Temporary Redirectمانند ۳۰۲ ولی برای متدهای غیر GET
۳۰۸Permanent Redirectمانند ۳۰۱ ولی برای متدهای غیر GET

سه نکتهٔ کلیدی در این جدول. اول، برای ۹۰٪ کاربردهای سایت‌های وردپرسی، ریدایرکت ۳۰۱ انتخاب درستی است. اگر مطمئن نیستید، ۳۰۱ بگذارید. دوم، ریدایرکت ۳۰۲ فقط برای مواقعی مفید است که یک صفحه موقتاً جابه‌جا شده و بعداً به جای اصلی‌اش برمی‌گردد. سوم، در وردپرس، ریدایرکت‌های ۳۰۱ و ۳۰۲ بیشترین کاربرد را دارند و در تابع wp_redirect، با پارامتر دوم کد تعیین می‌شود. توصیهٔ من این است که تا زمانی که دلیل قوی برای انتخاب کد دیگر دارید، همان ۳۰۱ را استفاده کنید.

هوک‌های مسئول در وردپرس

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

هوکزمان اجراکاربرد
template_redirectپس از تشخیص قالب، پیش از رندرریدایرکت‌های محتوایی براساس صفحه
initپیش از تشخیص قالبریدایرکت‌های عمومی و الگویی
wp_loadedپس از بارگذاری کامل وردپرسریدایرکت‌های وابسته به افزونه‌ها

سه نکتهٔ کلیدی در این نقشه. اول، template_redirect بهترین نقطه برای بیشتر ریدایرکت‌های محتوایی است، چون در این لحظه وردپرس می‌داند چه صفحه‌ای درخواست شده ولی هنوز شروع به رندر نکرده. دوم، در این هوک، شرط‌هایی مثل is_singular، is_front_page و is_404 به‌طور درست کار می‌کنند. سوم، برای ریدایرکت‌های عمومی که به تشخیص صفحه وابسته نیستند، استفاده از init هم مجاز است ولی توجه به ترتیب اجرا اهمیت دارد. توضیح تفصیلی این هوک‌ها در مهم‌ترین Action Hook های وردپرس و نحوه استفاده از add_action در وردپرس آمده است.

ساده‌ترین اسنیپت: ریدایرکت ۳۰۱ ثابت

ساده‌ترین شکل ریدایرکت، هدایت یک آدرس مشخص به یک آدرس دیگر است. نمونهٔ کامل:

/**
 * Snippet: Redirect a specific path to a new location.
 *
 * @since 2026-09-16
 * @author WordPressKar
 *
 * Purpose: Redirect /old-page/ to /new-page/ with a 301 status.
 * Location: mu-plugins directory or child theme functions.php.
 */

add_action( 'template_redirect', 'wphk_redirect_old_page' );

function wphk_redirect_old_page() {
    $request_uri = isset( $_SERVER['REQUEST_URI'] )
        ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) )
        : '';

    $path = trim( parse_url( $request_uri, PHP_URL_PATH ), '/' );

    if ( 'old-page' === $path ) {
        wp_safe_redirect( home_url( '/new-page/' ), 301 );
        exit;
    }
}

پنج نکتهٔ کلیدی در همین نمونه. اول، استفاده از هوک template_redirect که در زمان مناسب اجرا می‌شود. دوم، خواندن مقدار $_SERVER['REQUEST_URI'] با wp_unslash و esc_url_raw؛ بدون این پاک‌سازی، دادهٔ ورودی می‌تواند آلوده باشد. سوم، استخراج مسیر نسبی با parse_url و PHP_URL_PATH که از مقایسهٔ نادرست با پارامترهای اضافی جلوگیری می‌کند. چهارم، استفاده از تابع wp_safe_redirect به‌جای wp_redirect که امنیت بیشتری دارد و جلوی ریدایرکت به دامنه‌های خارجی را می‌گیرد. پنجم، فراخوانی exit پس از ریدایرکت که تضمین می‌کند ادامهٔ کد اجرا نمی‌شود. نحوۀ دقیق این توابع در توابع وردپرس برای مدیریت ریدایرکت‌ها آمده است.

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

نقشهٔ ریدایرکت: چند آدرس در یک اسنیپت

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

add_action( 'template_redirect', 'wphk_redirect_map' );

function wphk_redirect_map() {
    $request_uri = isset( $_SERVER['REQUEST_URI'] )
        ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) )
        : '';

    $path = trim( parse_url( $request_uri, PHP_URL_PATH ), '/' );

    $map = array(
        'old-page'          => '/new-page/',
        'old-products'      => '/shop/',
        'promo-2024'        => '/campaigns/',
        'contact-us'        => '/contact/',
        'blog/author/admin' => '/about/',
    );

    if ( isset( $map[ $path ] ) ) {
        wp_safe_redirect( home_url( $map[ $path ] ), 301 );
        exit;
    }
}

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

ریدایرکت شرطی براساس نوع صفحه

گاهی می‌خواهید براساس نوع صفحه یا شرایط خاص ریدایرکت اعمال کنید. مثلاً هدایت تمام نوشته‌های یک دستهٔ قدیمی به یک برگهٔ مرجع. الگوی اعمال شرطی:

add_action( 'template_redirect', 'wphk_conditional_redirects' );

function wphk_conditional_redirects() {
    if ( is_admin() ) {
        return;
    }

    if ( is_category( 'old-news' ) ) {
        wp_safe_redirect( home_url( '/news/' ), 301 );
        exit;
    }

    if ( is_singular( 'post' ) && has_category( 'legacy-posts' ) ) {
        wp_safe_redirect( home_url( '/archive/' ), 301 );
        exit;
    }

    if ( is_404() ) {
        wp_safe_redirect( home_url( '/' ), 301 );
        exit;
    }
}

چهار نکتهٔ کلیدی در این الگو. اول، بررسی is_admin در ابتدای تابع که از اعمال این ریدایرکت‌ها در پیشخوان جلوگیری می‌کند. دوم، استفاده از شرط is_category که مخصوص آرشیو دسته‌بندی است. سوم، ترکیب is_singular با has_category که دقیقاً نوشته‌های یک دستهٔ خاص را هدف می‌گیرد. چهارم، استفاده از is_404 که در سناریوی «هدایت همهٔ صفحات ۴۰۴ به صفحهٔ اصلی» مفید است. یک هشدار: در هدایت همهٔ ۴۰۴ها به صفحهٔ اصلی، حتماً باید با احتیاط عمل کنید؛ چون این کار می‌تواند رفتار گوگل را در مواجهه با لینک‌های شکسته تغییر دهد. در تجربهٔ من، بهتر است به‌جای هدایت کورکورانه، یک صفحهٔ ۴۰۴ سفارشی با پیشنهادهای محتوایی بسازید. تحلیل تفصیلی این موضوع در چگونه خطای ۴۰۴ در وردپرس را رفع کنیم آمده است.

ریدایرکت الگویی: انتقال انبوه با الگو

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

add_action( 'template_redirect', 'wphk_pattern_redirect' );

function wphk_pattern_redirect() {
    $request_uri = isset( $_SERVER['REQUEST_URI'] )
        ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) )
        : '';

    $path = trim( parse_url( $request_uri, PHP_URL_PATH ), '/' );

    // الگوی اول: انتقال از /blog/2020/03/post-slug به /post-slug/
    if ( preg_match( '#^blog/d{4}/d{2}/([^/]+)$#', $path, $matches ) ) {
        wp_safe_redirect( home_url( '/' . $matches[1] . '/' ), 301 );
        exit;
    }

    // الگوی دوم: انتقال از /product/old-prefix-slug به /product/slug/
    if ( preg_match( '#^product/old-prefix-(.+)$#', $path, $matches ) ) {
        wp_safe_redirect( home_url( '/product/' . $matches[1] . '/' ), 301 );
        exit;
    }
}

چهار نکتهٔ کلیدی در این الگو. اول، استفاده از regex برای تطبیق ساختاری مسیر. الگوی اول، هر آدرس با ساختار /blog/YYYY/MM/post-slug را می‌گیرد و به /post-slug/ منتقل می‌کند. دوم، استفاده از گروه‌بندی ([^/]+) که اسلاگ را استخراج می‌کند. سوم، ساخت مسیر جدید با استفاده از مقدار استخراج‌شده که نیاز به نگهداری نقشهٔ دستی را حذف می‌کند. چهارم، ترتیب تطبیق الگوها که در سناریوهای پیچیده اهمیت دارد. یک نکتهٔ ظریف: در پروژه‌هایی که با ساختار URL پیچیده سروکار دارید، توصیه می‌کنم پیش از اجرای ریدایرکت الگویی، تست گسترده در محیط استجینگ انجام دهید تا از بازنویسی ناخواسته جلوگیری کنید. الگوهای مشابه در چگونه ترتیب اجرای هوک‌ها را مدیریت کنیم آمده است.

ریدایرکت شرطی براساس نقش کاربر

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

add_filter( 'login_redirect', 'wphk_custom_login_redirect', 20, 3 );

function wphk_custom_login_redirect( $redirect_to, $requested, $user ) {
    if ( is_wp_error( $user ) || ! ( $user instanceof WP_User ) ) {
        return $redirect_to;
    }

    if ( in_array( 'administrator', (array) $user->roles, true ) ) {
        return admin_url();
    }

    if ( in_array( 'customer', (array) $user->roles, true ) ) {
        return home_url( '/my-account/' );
    }

    return home_url( '/' );
}

چهار نکتهٔ کلیدی در این الگو. اول، استفاده از فیلتر login_redirect که مخصوص هدایت پس از ورود است، نه یک ریدایرکت معمولی. دوم، بررسی is_wp_error و instanceof WP_User که از خطا در شرایط غیرمنتظره جلوگیری می‌کند. سوم، استفاده از in_array با پارامتر سوم true که بررسی دقیق نوع را تضمین می‌کند. چهارم، بازگشت یک مقدار پیش‌فرض برای نقش‌های دیگر. تجربهٔ من در این حوزه: برای سایت‌های سازمانی که چند نقش مختلف دارند، این الگو یک تجربهٔ کاربری منسجم می‌سازد. توضیح تفصیلی توابع مربوط به کاربران در توابع وردپرس برای کار با کاربران آمده است.

ریدایرکت خودکار Slug‌های تغییر‌یافته

وردپرس به‌طور پیش‌فرض برای آدرس‌های قدیمی نوشته‌ها که اسلاگشان تغییر کرده، ریدایرکت ایجاد نمی‌کند. این یعنی اگر اسلاگ یک نوشته را از /old-slug/ به /new-slug/ تغییر دهید، آدرس قدیمی به ۴۰۴ تبدیل می‌شود. یکی از رایج‌ترین نیازها در پروژه‌های وردپرسی، ریدایرکت خودکار براساس شناسهٔ نوشته است. الگوی کاربردی:

add_action( 'template_redirect', 'wphk_redirect_by_post_id' );

function wphk_redirect_by_post_id() {
    if ( ! is_404() ) {
        return;
    }

    $request_uri = isset( $_SERVER['REQUEST_URI'] )
        ? esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) )
        : '';

    $path = trim( parse_url( $request_uri, PHP_URL_PATH ), '/' );

    // تلاش برای پیدا کردن نوشته براساس اسلاگ قدیمی
    if ( ! $path ) {
        return;
    }

    $slug = basename( $path );

    $posts = get_posts( array(
        'name'        => $slug,
        'post_type'   => array( 'post', 'page' ),
        'numberposts' => 1,
        'fields'      => 'ids',
    ) );

    if ( ! empty( $posts ) ) {
        wp_safe_redirect( get_permalink( $posts[0] ), 301 );
        exit;
    }
}

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

افزونهٔ ریدایرکت یا اسنیپت: کدام برای چه پروژه‌ای

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

معیاراسنیپتافزونهٔ ریدایرکت
تعداد ریدایرکت‌هاکمتر از ۲۰بیش از ۲۰
منطق شرطیثابت یا الگویی سادهالگوهای پیچیده و متغیر
نیاز به گزارشنداردگزارش کلیک و آمار
مدیریت توسط کاربر غیرفنیدشوارساده از پیشخوان
سبک بودن سایتسبک‌ترافزونهٔ اضافه

سه نکتهٔ کلیدی در این جدول. اول، برای پروژه‌های کوچک تا متوسط که ریدایرکت‌ها در طول زمان زیاد نمی‌شوند، اسنیپت انتخاب سبک‌تر و پایداری است. دوم، برای پروژه‌های بزرگ با ریدایرکت‌های متغیر، افزونهٔ مدیریت ریدایرکت مثل Redirection یا Safe Redirect Manager منطقی‌تر است. سوم، در انتخاب افزونه، پیش از هر چیز به عملکرد پایداری، کیفیت پشتیبانی و تاریخچهٔ به‌روزرسانی توجه کنید. راهنمای کامل این موضوع در بهترین افزونه‌های ریدایرکت برای وردپرس و مقایسه افزونه‌های مدیریت ریدایرکت آمده است.

ملاحظات سئویی ریدایرکت

ریدایرکت‌ها، از منظر سئو، سه اصل مهم دارند که در همهٔ پروژه‌هایم رعایت می‌کنم:

اصل اول: از ۳۰۱ استفاده کنید، نه ۳۰۲. در ۹۵٪ موارد، ریدایرکت دائمی ۳۰۱ انتخاب درستی است. اگر اشتباهاً ۳۰۲ بگذارید، گوگل اعتبار صفحهٔ قدیمی را به صفحهٔ جدید منتقل نمی‌کند و به مرور زمان، رتبه‌تان افت می‌کند. تنها در موارد خاص مثل صفحات A/B تست یا صفحات موقت، ۳۰۲ منطقی است.

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

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

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

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

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

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

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

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

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

اشتباهات رایج در افزودن ریدایرکت

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

اشتباهپیامد واقعیاصلاح
استفاده از wp_redirect به‌جای wp_safe_redirectریسک ریدایرکت به دامنه‌های خارجیاستفاده از wp_safe_redirect
فراموشی exit پس از ریدایرکتادامهٔ اجرای کد و ایجاد رفتار ناخواستهفراخوانی صریح exit
استفاده از کد ۳۰۲ به‌جای ۳۰۱عدم انتقال اعتبار سئواستفاده از کد ۳۰۱ برای انتقال دائمی
ایجاد زنجیرهٔ ریدایرکتکندی سایت و افت رتبههدایت مستقیم به مقصد نهایی
عدم بررسی is_admin در ریدایرکت شرطیاعمال ریدایرکت در پیشخوانبررسی is_admin در ابتدای تابع
نبود پیشوند اختصاصی در نام توابعتعارض با افزونه‌های دیگرپیشوند یکتا مثل wphk_

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

دو پروندهٔ واقعی از پروژه‌ها

برای این‌که این اصول در عمل روشن‌تر شوند، دو پروندهٔ واقعی از تجربهٔ خودم را مرور می‌کنم — بدون جزئیات هویتی، ولی با ساختار دقیق مشکل و راه‌حل.

پروندهٔ اول: مجله‌ای که با نقشهٔ ریدایرکت، ترافیک ارگانیک را نجات داد

همان پروژهٔ ابتدای مقاله. مجله‌ای که در بازطراحی سال گذشته، ساختار URL خود را از /blog/YYYY/MM/post-slug به /post-slug/ تغییر داده بود، بدون اینکه ریدایرکت اعمال کند. نتیجه: در دو ماه اول، ترافیک ارگانیک از موتورهای جستجو در بخش نوشته‌ها حدود ۴۰٪ افت کرد. راه‌حل: یک اسنیپت با نقشهٔ ریدایرکت الگویی که هر آدرس با ساختار قدیمی را به ساختار جدید هدایت می‌کرد. نتیجه در یک ماه: ترافیک ارگانیک به سطح قبلی برگشت و در سه ماه بعد، از آن هم عبور کرد. درس این پرونده: هر تغییر ساختاری، باید با فهرست ریدایرکت‌ها همراه باشد، نه به‌عنوان یک کار جانبی، بلکه به‌عنوان بخشی جدانشدنی از پروژه.

پروندهٔ دوم: فروشگاهی که با هدایت هوشمند، نرخ پرش را کاهش داد

در یک فروشگاه ووکامرسی، برگهٔ «قیمت‌ها» که در گذشته یکی از پربازدیدترین صفحات سایت بود، در بازطراحی جدید حذف شده بود و کاربران با خطای ۴۰۴ روبه‌رو می‌شدند. راه‌حل: ریدایرکت ۳۰۱ از /pricing/ به /services/ با یک اسنیپت کوچک. نتیجه در دو هفته: نرخ پرش آن بخش از سایت از ۸۵٪ به ۳۰٪ کاهش یافت و کاربران بیشتری به صفحهٔ خدمات هدایت شدند. تجربهٔ مشابه در حوزهٔ ووکامرس در رفع خطاهای رایج ووکامرس آمده است.

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

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

قطعه کد افزودن ریدایرکت در وردپرس، یکی از پرکاربردترین و در عین حال کم‌سروصداترین ابزارهای توسعهٔ وردپرس است. سه ستون این کار: استفاده از هوک template_redirect برای ریدایرکت‌های محتوایی، استفاده از wp_safe_redirect با کد ۳۰۱ برای انتقال دائمی، و اعمال شرطی براساس نوع صفحه، نقش کاربر یا الگوی URL. سه ملاحظهٔ کلیدی (استفاده از ۳۰۱ نه ۳۰۲، هدایت به محتوای مرتبط، پرهیز از زنجیرهٔ ریدایرکت) در همهٔ اسنیپت‌های این حوزه باید رعایت شوند. سه ملاحظهٔ امنیتی (استفاده از wp_safe_redirect، پاک‌سازی ورودی، بررسی is_admin) به‌تنهایی می‌توانند از ریسک‌های جدی جلوگیری کنند. و محل درست این اسنیپت، افزونهٔ اختصاصی یا چایلد تم است، نه فایل قالب والد.

گام بعدی عملی که پیشنهاد می‌کنم: در همین امروز، یکی از آدرس‌های قدیمی سایت خودتان که به ۴۰۴ می‌رود را انتخاب کنید و با یک اسنیپت کوچک، آن را به نزدیک‌ترین محتوای مرتبط هدایت کنید. پس از اعمال، در Google Search Console بررسی کنید که این آدرس در هفته‌های بعد به‌عنوان ۴۰۴ گزارش نشود. اگر تجربه‌ای با افزودن ریدایرکت در وردپرس دارید — به‌ویژه اگر در پروژه‌ای روش تمیزی برای مدیریت انبوه ریدایرکت‌ها پیدا کرده‌اید یا اگر در ترکیب ریدایرکت با سایر بهینه‌سازی‌های سئو به نکته‌ای برخورده‌اید — برای من جالب است بدانید چطور حلش کردید. تجربهٔ خودتان را در دیدگاه‌ها بنویسید؛ به‌ویژه اگر افزونه یا رویکرد جالبی برای مدیریت ریدایرکت در سایت‌های حجیم می‌شناسید. 🔗