تابع wp_cache_get در وردپرس
تابع 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) را نصب و پیکربندی کنید.
در صورت نیاز به مثال عملی برای پلاگین یا قالب خود، میتوانم نمونه کد ویژهای متناسب با ساختار شما بنویسم.
آیا این مطلب برای شما مفید بود ؟




