تابع wp_cache_set در وردپرس
wp_cache_set() یکی از توابع اصلی وردپرس برای کار با Object Cache است. این تابع به شما امکان میدهد دادههایی را با یک کلید مشخص در کش (cache) نگهداری کنید تا در فراخوانیهای بعدی از منابع سنگین مثل پایگاهداده یا API بیرونی بینیاز شوید. در ادامه به شکل دقیق، مثالها، نکات فنی و بهترین شیوههای استفاده میپردازیم.
امضای تابع و پارامترها
فرم کلی تابع:
wp_cache_set( $key, $data, $group = '', $expire = 0 );توضیح پارامترها:
- $key (string): کلیدی که برای خواندن/نوشتن داده استفاده میشود.
- $data: هر نوع دادهای (آرایه، آبجکت، مقدار ساده) که میخواهید در کش ذخیره شود.
- $group (string، اختیاری): گروهی که داده در آن ذخیره میشود تا از تداخل کلیدها جلوگیری شود.
- $expire (int، اختیاری): زمان انقضا بر حسب ثانیه؛ 0 به معنی بدون انقضا (تا پاکسازی دستی یا فلش کش).
چگونه wp_cache_set() کار میکند؟
wp_cache_set() در سطح بالاتر یک پیادهسازی ساده از object caching ارائه میدهد. اگر پلاگین یا drop-in برای کش پایدار مثل Redis یا Memcached نصب نشده باشد، وردپرس از یک کش حافظهای درون-درخواست (non-persistent) استفاده میکند که فقط تا پایان اجرای درخواست (request) زنده میماند. در صورت نصب drop-in، دادهها به کش پایدار ارسال میشوند و بین درخواستها نیز در دسترس خواهند بود.
مثال ساده: ذخیره و خواندن یک نتیجه پرسوجو
// ذخیره نتیجه یک پرسوجوی سنگین
$key = 'my_custom_query_results';
$data = $wpdb->get_results("SELECT ID, post_title FROM wp_posts WHERE ...");
wp_cache_set( $key, $data, 'custom_queries', 3600 );
// سپس خواندن از کش
$cached = wp_cache_get( $key, 'custom_queries' );
if ( false !== $cached ) {
// از کش استفاده شود
} else {
// اجرای مجدد پرسوجو و ذخیره دوباره
}
توضیح: در این مثال نتیجه پرسوجوی سنگین در گروه custom_queries و به مدت یک ساعت (3600 ثانیه) ذخیره میشود. سپس با wp_cache_get تلاش میکنیم از کش استفاده کنیم و در صورت عدم وجود، مجدداً داده را محاسبه و ذخیره میکنیم.
تفاوت wp_cache_set و Transients
| ویژگی | wp_cache_set | set_transient |
|---|---|---|
| محدوده | Object cache، معمولا داخلی یا persistent (بسته به drop-in) | ذخیره در پایگاهداده یا object cache (بسته به پیادهسازی) |
| طول عمر | قابل تعیین، ممکن است توسط backend مدیریت شود | قابل تعیین، معمولاً persistent در پایگاهداده |
| عملکرد | بسیار سریع اگر به Redis/Memcached متصل باشد | قابل اعتماد اما با بار پایگاهداده در صورت ذخیره در DB |
نکته: Transients برای دادههایی که باید بین درخواستها ثابت بمانند متداولتر است، اما wp_cache_set وقتی casshed backend مثل Redis موجود باشد سریعتر و کارآمدتر است.
مثال عملی: کش کردن نتایج در REST API و پاکسازی هنگام بروزرسانی پست
// ذخیره در cache هنگام فراخوانی REST
function my_rest_get_items() {
$key = 'rest_items_v1';
$cached = wp_cache_get( $key, 'rest' );
if ( false !== $cached ) {
return $cached;
}
// محاسبات یا درخواست سنگین
$data = expensive_data_fetch();
wp_cache_set( $key, $data, 'rest', 600 ); // 10 minutes
return $data;
}
// پاکسازی cache هنگام ذخیره پست
function my_clear_rest_cache_on_save( $post_id ) {
wp_cache_delete( 'rest_items_v1', 'rest' );
}
add_action( 'save_post', 'my_clear_rest_cache_on_save' );
توضیح: این کد ابتدا بررسی میکند که آیا داده در کش گروه rest موجود است یا نه. اگر موجود نباشد، داده را تولید کرده و به مدت 10 دقیقه ذخیره میکند. هنگام بروزرسانی پست، کش مربوطه پاک میشود تا دادهها همیشه آپدیت باشند.
نکات و بهترین شیوهها
- همیشه از گروه استفاده کنید تا کلیدها نامگذاری منطقی داشته باشند و از برخورد جلوگیری شود (مثلاً ‘users’, ‘posts’, ‘my_plugin’).
- کلیدها را کوتاه و معنادار نگه دارید. در برخی backends مثل Memcached طول کلید محدود است؛ از رشتههای بسیار طولانی یا حاوی کاراکترهای عجیب خودداری کنید.
- به مسئله cache invalidation (پاکسازی کش) توجه ویژه کنید. کشگذاری بدون تعیین راه پاکسازی منجر به نمایش دادههای قدیمی میشود.
- از wp_cache_add وقتی میخواهید فقط زمانی که کلید وجود ندارد مقدار ذخیره شود استفاده کنید. از wp_cache_replace برای جایگزینی صرفاً زمانی که کلید موجود است، بهره ببرید.
- توجه کنید که در محیط توسعه ممکن است کش پایدار فعال نباشد؛ حتماً تستها را روی محیطی با همان backend کش تولیدی انجام دهید.
- دادههای خیلی بزرگ یا با ارجاع به منابع خارجی ممکن است بهتر باشد در سیستم فایل یا پایگاهداده نگهداری شوند تا در کش حافظهای.
وقایع و موارد حرفهای (Expert Tips)
- برای پلاگین یا تمی که توسعه میدهید، نام گروه را به نام پلاگین خود محدود کنید تا احتمال تداخل کم شود.
- در مواقعی که قطعات صفحه (partials) را کش میکنید، از کلیدهایی شامل شناسه شی (ID) و ورژن (version) استفاده کنید تا هنگام تغییر قالب یا ساختار، invalidate سادهتر شود.
- مراقب دادههای حساس باشید؛ اگر کش شما بین سروِرها به اشتراک گذاشته میشود، دادهای شامل اطلاعات محرمانه را در کش عمومی ذخیره نکنید.
- اگر از Redis یا Memcached استفاده میکنید، از امکانات TTL (expire) آنها بهره ببرید تا مدیریت حافظه و حذف خودکار دادههای قدیمی انجام شود.
ابزارها و پلاگینهای مرتبط
- Redis Object Cache (به عنوان drop-in) — برای کش پایدار و سریع
- WP Rocket، W3 Total Cache — هرچند اینها بیشتر برای صفحهکشینگ هستند اما بعضی امکانات object cache را هم دارند
- Query Monitor — برای بررسی اینکه آیا کش استفاده شده یا نه و مانیتورینگ
جمعبندی
wp_cache_set یک ابزار قدرتمند برای بهینهسازی عملکرد سایت وردپرس است که در صورت استفاده صحیح میتواند بار پایگاهداده را بهطور چشمگیری کاهش داده و سرعت پاسخگویی را افزایش دهد. با انتخاب گروه مناسب، مدیریت منظم زمان انقضا، و استراتژیهای پاکسازی دقیق میتوانید از مزایای کش بهره کامل ببرید. توجه داشته باشید که همیشه پیادهسازی را در محیطی مشابه تولید تست کنید و محدودیتهای backend کش (مثل طول کلید در memcached) را در نظر بگیرید.
آیا این مطلب برای شما مفید بود ؟




