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

چرا بهینه‌سازی کد؟

سه دلیل عملی: یک — تجربهٔ کاربری. کد ناکارآمد، سرعت را پایین می‌آورد. دو — مقیاس‌پذیری. سایتی که در ۱۰۰۰ بازدید روزانه سریع است، ممکن است در ۱۰۰٬۰۰۰ بازدید روزانه سقوط کند. سه — هزینهٔ هاست. کد بهینه، منابع کمتری مصرف می‌کند. تجربه‌ام: در پروژه‌ای با کد ناکارآمد، ارتقای هاست از ۵۰۰ هزار به ۵ میلیون تومان هم مشکل را حل نکرد؛ بهینه‌سازی کد، در دو روز، ۶۰٪ بهبود آورد. اصول کلی در بهینه‌سازی سرعت سایت چیست و چرا قالب‌ها سایت را کند می‌کنند.

هاست خوب، بدهی کد را جبران نمی‌کند؛ فقط آن را گران‌تر می‌کند.

بهینه‌سازی کوئری‌ها

پنج قاعدهٔ کلیدی: یک — استفاده از WP_Query با پارامترهای درست. نه کوئری خام با $wpdb، مگر در موارد خاص. دو — محدودسازی post_per_page. نمایش ۱۰۰۰ نوشته در یک صفحه، فاجعه است. سه — استفاده از no_found_rows وقتی نیازی به pagination نیست. این پارامتر، کوئری دوم (شمارش کل) را حذف می‌کند. چهار — update_post_meta_cache => false و update_post_term_cache => false وقتی نیاز نیست. پنج — کش نتایج سنگین.

$args = array(
    'post_type'              => 'post',
    'posts_per_page'         => 10,
    'no_found_rows'          => true,
    'update_post_meta_cache' => false,
    'update_post_term_cache' => false,
);
$query = new WP_Query( $args );

راهنمای کامل در بهینه‌سازی کوئری‌های وردپرس، توابع کوئری سفارشی، و بهینه‌سازی کوئری‌های MySQL.

کش در سطح کد

کش، مهم‌ترین ابزار بهینه‌سازی است. سه سطح: یک — Transients. برای نتایج سنگین و موقت:

function my_get_expensive_data() {
    $cache = get_transient( 'my_expensive_data' );
    if ( $cache !== false ) {
        return $cache;
    }
    $data = /* محاسبه سنگین */;
    set_transient( 'my_expensive_data', $data, HOUR_IN_SECONDS );
    return $data;
}

دو — Object Cache. با Redis/Memcached. برای پروژه‌های بزرگ. سه — Cache Invalidation. همیشه مشخص کنید چه زمانی cache باید پاک شود. راهنمای دقیق در ترنزینت‌ها در وردپرس و افزونه‌های کش وردپرس.

بارگذاری انتخابی assetها

هر CSS و JS، فقط در صفحه‌هایی که لازم است، لود شوند:

function my_plugin_enqueue_assets() {
    if ( ! is_singular( 'portfolio' ) ) {
        return;
    }
    wp_enqueue_style( 'my-plugin-portfolio', ... );
    wp_enqueue_script( 'my-plugin-portfolio', ... );
}
add_action( 'wp_enqueue_scripts', 'my_plugin_enqueue_assets' );

نکته: در پیشخوان و front-end، با هوک‌های مختلف لود کنید (admin_enqueue_scripts vs wp_enqueue_scripts). تجربه‌ام: در پروژه‌ای با افزونهٔ اسلایدر، محدودسازی لود به صفحات مربوطه، حجم صفحهٔ اصلی را ۳۰٪ کاهش داد. الگوی دقیق در تأثیر افزونه‌ها بر سرعت سایت.

بهینه‌سازی حلقه‌ها

پنج قاعده: یک — حلقه‌های تودرتو را محدود کنید. دو — از WP_Queryهای اضافه در حلقه دوری کنید. سه — داده موردنیاز را پیش از حلقه بگیرید. چهار — از wp_reset_postdata استفاده کنید. پنج — برای نمایش مرتبط، از get_the_terms با cache استفاده کنید. مثال ناکارآمد:

// بد: کوئری برای هر نوشته
while ( $query->have_posts() ) : $query->the_post();
    $terms = wp_get_post_terms( get_the_ID(), 'category' ); // کوئری اضافه
endwhile;

راه بهینه: از cache متای نوشته استفاده کنید یا در یک کوئری، همه را بگیرید. راهنمای دقیق در توابع دادهٔ نوشته و بهینه‌سازی کوئری‌ها.

مدیریت حافظه

سه قاعده: یک — بارگذاری داده به‌صورت chunked. به‌جای گرفتن ۱۰٬۰۰۰ ردیف یک‌جا، ۱۰۰ ردیف در حلقه. دو — آزادسازی متغیرها. در حلقه‌های بزرگ، متغیرها را unset کنید. سه — انتخاب ستون‌ها در کوئری خام. به‌جای SELECT *، ستون‌های لازم را انتخاب کنید. الگوی دقیق در رفع خطای Memory Limit و بهینه‌سازی کوئری MySQL.

کارهای پس‌زمینه

کارهای سنگین (ایمیل انبوه، اسکن، اکسپورت) را در cron یا صف انجام دهید، نه در مسیر کاربر. سه ابزار: یک — WP-Cron: ساده، ولی وابسته به بازدید. دو — cron واقعی سرور: حرفه‌ای‌تر. سه — Action Scheduler: برای صف‌های پیچیده. الگوی دقیق در کرون وردپرس و عیب‌یابی کرون.

سنجش و پایش

بدون عدد، بهینه‌سازی حدس است. سه ابزار: یک — Query Monitor: برای دیدن کوئری‌ها و زمان‌ها. دو — New Relic یا ابزار مشابه: برای پایش transaction در Production. سه — تایمر داخلی: در کد، زمان اجرای بخش‌های سنگین را لاگ کنید. تجربه‌ام: در پروژه‌ای که با Query Monitor کار می‌کردم، متوجه شدم یک افزونهٔ کوچک، ۵۰ کوئری اضافه در هر بازدید می‌زند. حذفش، زمان پاسخ را ۲۰۰ میلی‌ثانیه کاهش داد. الگوی دقیق در ابزارهای تست سرعت و تأثیر TTFB بر سرعت.

دید مهندسی

برای توسعه‌دهنده‌های سطح بالا، بهینه‌سازی کد سه سطح دارد: یک — Micro-Optimization. در سطح خط کد: پرهیز از تکرار، استفاده از توابع سریع‌تر، و مدیریت حافظه. دو — Macro-Optimization. در سطح معماری: کاهش کوئری‌ها، کش هدفمند، و بارگذاری انتخابی. سه — System-Optimization. در سطح زیرساخت: CDN، Redis، Page Cache، و Load Balancer. تجربه‌ام: نسبت اثر به تلاش در سطح دوم، بهترین است. بسیاری از پروژه‌ها با Macro-Optimization به ۸۰٪ بهبود می‌رسند، بدون نیاز به بازنویسی معماری. الگوهای معماری در ساختار هستهٔ وردپرس و ساختاربندی پروژه. یک نکته: در پروژه‌های بزرگ، پروفایلینگ (Profiling) با Xdebug یا Tideways، قبل از هر بهینه‌سازی، دقیقاً نشان می‌دهد گلوگاه کجاست. بهینه‌سازیِ کور، وقت تلف کردن است.

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

  • کوئری‌های اضافه در حلقه‌ها: کاهش سرعت چشمگیر. الگو در بهینه‌سازی کوئری.
  • نبود no_found_rows: کوئری شمارش اضافه، ۲۰-۴۰٪ بار بیشتر.
  • لود asset در همهٔ صفحات: تأثیر افزونه‌ها.
  • نبود کش روی محاسبات سنگین: ترنزینت‌ها.
  • اجرای کارهای سنگین در مسیر کاربر: کرون وردپرس.
  • نبود سنجش قبل از بهینه‌سازی: وقت تلف کردن بدون جهت.
  • نادیده‌گرفتن Object Cache در پروژه‌های بزرگ: کوئری‌های تکراری، فشار دیتابیس.
  • حلقه‌های تودرتوی سنگین در template: کندی front-end.

جمع‌بندی

بهینه‌سازی کد وردپرس، شش محور دارد: کوئری، کش، بارگذاری انتخابی asset، حلقه، حافظه، و کارهای پس‌زمینه. اگر امروز فقط یک کار می‌کنید: Query Monitor را نصب کنید و در صفحه‌های اصلی سایت، تعداد کوئری‌ها را ببینید. اگر بالای ۵۰ است، اول از آن‌جا شروع کنید. تجربهٔ خودتان از بهینه‌سازی کد، در دیدگاه‌ها ارزشمند است. ⚡