💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ میثم کیانی
بهبود کوئری‌های سایت
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۰۶ خرداد ۱۴۰۳

سلام خدمت استاد صالحی عزیز و منتور‌های گرامی،

یک سوال من یک قالب اختصاصی نوشتم مشکلم اینجاست که سرعت لودم کنده با اینکه از صفر تا صدشو اختصاصی نوشتم، حتی بخش 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');

سلام،

  1. استفاده از get_transient و set_transient خوبه، اما مطمئن بشید که طول عمر کش مناسبه و اگر داده‌ها زیاد تغییر می‌کنن، زمان انقضا رو کمتر کنید.
  2. اگر از افزونه‌های کش مثل Redis یا Memcached استفاده می‌کنید، می‌تونی به جای Transient API از Object Cache استفاده کنید که ممکنه عملکرد بهتری داشته باشه.
  3. بررسی کن که کوئری‌ها بهینه هستند و ایندکس گذاری مناسبی روی دیتابیست انجام بده و دیتابیس رو نرمالایز کن و همچنین ستون هایی که سلکت میشنو ایندکس کن.
  4. در متد clear_cache، بهتره که فقط کش‌هایی که واقعاً به روز شده‌اند را پاک کنید. می‌تونید با بهبود متد is_post_in_query یا استفاده از برچسب‌های کش دقیق‌تر این کار رو انجام بدید.
  5. افزونه‌هایی مثل Query Monitor می‌تونند به شما کمک کنند تا کوئری‌های کند را شناسایی کنید و بهینه‌سازی‌های لازم را انجام بدید.
محسن موحد ۰۷ خرداد ۱۴۰۳، ۲۳:۰۸