سلام خدمت استاد صالحی عزیز و منتورهای گرامی،
یک سوال من یک قالب اختصاصی نوشتم مشکلم اینجاست که سرعت لودم کنده با اینکه از صفر تا صدشو اختصاصی نوشتم، حتی بخش css رو هم شخصی نوشتم.
بعد بررسیها تو سایتها متوجه شدم مشکلم توی کوئری هایی هست که توی سایت نوشتم. اومدم این کلاس رو نوشتم که کوئری هارو کش کنه و بجای اینکه کلاس wp_query رو new کنم، از این کلاسم استفاده میکنم، نسبتا شرایط بهتر شد ولی همچنان کندی دارم، در کنارش نمیدونم کار درستی بوده یا نه، یا راه حل بهتری میشه استفاده کرد؟ ممنون میشم منو راهنمایی کنید باتشکر
<?php
class WP_Query_Cache_Helper {
private static array $instances = [];
public static function get_instance($args) {
$cache_key = 'wp_query_cache_' . md5(serialize($args));
$cached_query = get_transient($cache_key);
if ($cached_query) {
return $cached_query;
}
if (!isset(self::$instances[$cache_key])) {
self::$instances[$cache_key] = new WP_Query($args);
set_transient($cache_key, self::$instances[$cache_key], 2 * DAY_IN_SECONDS);
}
return self::$instances[$cache_key];
}
public static function clear_cache($post_id) {
global $wpdb;
$cache_keys = $wpdb->get_col("
SELECT option_name
FROM $wpdb->options
WHERE option_name LIKE '_transient_wp_query_cache_%'
");
foreach ($cache_keys as $cache_key) {
if (false !== ($cached_query = get_transient(str_replace('_transient_', '', $cache_key)))) {
if (self::is_post_in_query($post_id, $cached_query)) {
delete_transient(str_replace('_transient_', '', $cache_key));
}
}
}
}
private static function is_post_in_query($post_id, $query): bool {
if (empty($query->posts)) {
return false;
}
foreach ($query->posts as $post) {
if ($post->ID == $post_id) {
return true;
}
}
return false;
}
}
// Hook to clear cache on post save
function wp_query_cache_helper_clear_cache_on_save($post_id) {
WP_Query_Cache_Helper::clear_cache($post_id);
}
add_action('save_post', 'wp_query_cache_helper_clear_cache_on_save');
add_action('delete_post', 'wp_query_cache_helper_clear_cache_on_save');
add_action('woocommerce_update_product', 'wp_query_cache_helper_clear_cache_on_save');