ویژگی تصویر

آموزش تابع wp_cache_get() در وردپرس و کاربرد آن

  /  وردپرس   /  تابع wp_cache_get در وردپرس
بنر تبلیغاتی الف
wp - wordpress - وردپرس

تابع wp_cache_get() یکی از ابزارهای اصلی برای کار با Object Cache در وردپرس است. این تابع امکان خواندن داده‌های کش‌شده (object cache) را فراهم می‌کند و هنگام درست استفاده شدن می‌تواند به‌شکل چشمگیری عملکرد سایت را بهبود دهد. در این مقاله با پارامترها، کاربردها، مثال‌های عملی، و نکات پیشرفته مرتبط با wp_cache_get() آشنا می‌شویم.

چرا از wp_cache_get() استفاده کنیم؟

  • کاهش تعداد کوئری‌های دیتابیس و درخواست‌های گران‌قیمت.
  • افزایش سرعت بارگذاری صفحات با خواندن داده‌ها از حافظه.
  • قابلیت استفاده با کش‌های پایداری مانند Redis یا Memcached (با نصب drop-in).

تعریف و پارامترها

پارامترتوضیح
keyنام کلید کش (رشته). بهتر است کوتاه و منحصربه‌فرد باشد.
groupگروه‌بندی کلیدها (مثل plugin_name یا theme_name). پیش‌فرض خالی است.
forceاگر true باشد، کش از منبع persistent دوباره خوانده می‌شود و کش داخلی request refresh می‌شود.
&foundپارامتری که مقدار مرجع آن بعد از اجرای تابع مشخص می‌کند آیا مقداری یافت شده یا نه (برای تشخیص مقدار false ذخیره‌شده).

نمونه ساده استفاده

function myplugin_get_popular_posts() {
    $cache_key = 'popular_posts';
    $group     = 'myplugin';
    $found     = false;

    $posts = wp_cache_get( $cache_key, $group, false, $found );

    if ( $found === false ) {
        // محاسبه یا کوئری گران‌قیمت
        $posts = get_posts( array( 'meta_key' => 'views', 'orderby' => 'meta_value_num', 'numberposts' => 5 ) );

        // ذخیره در کش برای ۱۰ دقیقه
        wp_cache_set( $cache_key, $posts, $group, 600 );
    }

    return $posts;
}

توضیح: این کد ابتدا به‌دنبال مقدار در کش می‌گردد. اگر هیچ مقداری پیدا نشد (found === false)، آنگاه کوئری اجرا شده و نتیجه با wp_cache_set در کش ذخیره می‌شود. توجه کنید که از پارامتر $found برای تشخیص اینکه آیا مقدار false واقعی است یا مقدار یافت‌نشده استفاده شده است.

مدیریت انقضا و پایداری

تابع wp_cache_set دارای پارامتر انقضا (expire) است؛ اما برخی drop-in های object cache مثل Redis ممکن است از این مقدار پشتیبانی کنند و برخی دیگر آن را نادیده بگیرند. وقتی از حافظه موقت داخلی وردپرس استفاده می‌کنید (بدون drop-in)، داده‌ها تنها در طول یک درخواست باقی می‌مانند و بین درخواست‌ها حفظ نمی‌شوند.

تمایز wp_cache vs Transients

  • Transients برای ذخیره‌سازی داده‌های موقت با مدیریت زمان در دیتابیس یا شیوه‌های ذخیره‌سازی دیگر طراحی شده‌اند.
  • Object Cache (wp_cache_*) سریع‌تر و مناسب برای ذخیره‌سازی اشیاء در حافظه است؛ اما برای پایداری بین درخواست‌ها نیاز به drop-in دارد.

مثال پیشرفته: الگوی read-through با جلوگیری از Cache Stampede

function myplugin_get_expensive_data() {
    $key   = 'expensive_data';
    $group = 'myplugin';
    $found = false;

    $data = wp_cache_get( $key, $group, false, $found );

    if ( $found !== false ) {
        return $data;
    }

    // تلاش برای افزودن یک لاک؛ اگر موفق شدیم، ما مسئول پر کردن کش هستیم
    $lock_key = $key . ':lock';
    $locked   = wp_cache_add( $lock_key, 1, $group, 30 );

    if ( $locked ) {
        // محاسبه طولانی
        $data = do_expensive_operation();

        // ذخیره نتیجه با انقضا
        wp_cache_set( $key, $data, $group, 300 );

        // حذف لاک
        wp_cache_delete( $lock_key, $group );

        return $data;
    } else {
        // اگر لاک وجود دارد، برای چند میلی‌ثانیه منتظر می‌شویم و دوباره سعی می‌کنیم
        usleep( 50000 ); // 50ms
        $data = wp_cache_get( $key, $group, false, $found );
        if ( $found !== false ) {
            return $data;
        }
        // در نهایت به صورت منطقی fallback
        return do_expensive_operation();
    }
}

توضیح: این الگو از wp_cache_add برای ایجاد «لاک» استفاده می‌کند تا چند فرایند همزمان باعث اجرای چندباره عملیات گران‌قیمت نشوند. اگر لاک موجود باشد، درخواست‌های دیگر منتظر نتیجه یا fallback می‌شوند.

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

  • کلیدها را با پیشوند plugin/theme خود نام‌گذاری کنید تا از تداخل جلوگیری شود (مثلاً myplugin_user_123).
  • از پارامتر $found استفاده کنید تا مقدار false ذخیره‌شده را از نبودن مقدار تشخیص دهید.
  • برای داده‌های حساس از کش عمومی استفاده نکنید یا از مکانیزم رمزنگاری/تجزیه استفاده کنید.
  • در محیط توسعه ممکن است کش persistent فعال نباشد؛ بنابراین عملکرد را در محیط تولید که drop-in نصب شده تست کنید.
  • از wp_cache_delete برای پاک‌سازی کش هنگام به‌روزرسانی داده‌ها استفاده کنید.
  • اگر نیاز به قفل پیشرفته دارید، از راهکارهای مخصوص (مانند Redlock برای Redis) استفاده کنید.

وقتی wp_cache_get کار نمی‌کند

اگر wp_cache_get مقدار مورد انتظار را برنمی‌گرداند، ابتدا موارد زیر را بررسی کنید:

  • آیا drop-in object-cache.php نصب شده و سرویس Redis/Memcached در حال اجرا است؟
  • آیا کلید و گروه را درست نوشته‌اید؟ (حساس به رشته)
  • آیا مقدار قبل از expire حذف شده یا پاک‌سازی شده است؟
  • آیا در زمان تست از cache bypass یا force=true استفاده نشده است؟

نمونه اتصال وردپرس به Redis (مختصر)

// نصب و فعال‌سازی یک drop-in مانند redis-cache یا object-cache.php مخصوص
// سپس در functions.php یا پلاگین می‌توانید از wp_cache_* بدون تغییر استفاده کنید.

// مثال استفاده:
$value = wp_cache_get( 'my_key', 'my_group', false, $found );
if ( $found === false ) {
    $value = expensive_function();
    wp_cache_set( 'my_key', $value, 'my_group', 3600 );
}

توضیح: پس از نصب drop-in (مثلاً افزونه‌ای که object-cache.php را ایجاد می‌کند)، توابع wp_cache_get و wp_cache_set به Redis یا Memcached وصل می‌شوند و کش بین درخواست‌ها پایدار خواهد بود.

خلاصه و نتیجه‌گیری

wp_cache_get() یک ابزار قدرتمند برای افزایش کارایی در وردپرس است. با استفاده‌ی صحیح (کلیدها و گروه‌بندی مناسب، مدیریت انقضا، پاک‌سازی و جلوگیری از cache stampede) می‌توان بار سرور را کاهش و سرعت بارگذاری را به‌طور محسوس افزایش داد. توجه داشته باشید که برای بهره‌برداری کامل از این تابع در سطح درخواست‌های مختلف باید یک object-cache drop-in (مثل Redis/Memcached) را نصب و پیکربندی کنید.

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

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: