Кеширование медленного запроса к БД в wordpress?
На сайте согласно Query Monitor есть медленный запрос, который создается плагином Wordpress Download Manager. Источник вызова - count_user_posts
SELECT COUNT(*)
FROM wp_posts
WHERE ( ( post_type = 'wpdmpro'
AND ( post_status = 'publish'
OR post_status = 'private' ) ) )
AND post_author = 1
Почитав в интернете информацию, понял, что его можно закешировать wp_cache_get, тем более на сервере используется редис. Но не понял, как это сделать правильно. Создать функцию и вставить в function.php? Нашел такой пример, но затрудняюсь его подредактировать на свои данные.
function prefix_get_post_count( $post_status = 'publish' ) {
$cache_key = 'prefix_post_count_'. $post_status;
$_posts = wp_cache_get( $cache_key );
if ( false === $_posts ) {
$_posts = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'post' AND post_status = %s",
$post_status
));
wp_cache_set( $cache_key, $_posts );
}
return $_posts;
}
Подскажите, пожалуйста, какой должен быть код.
Ответы (1 шт):
Код кеширования должен выглядеть так:
function prefix_get_post_count( $author ) {
global $wpdb;
$cache_key = 'wpdmpro_post_count';
$count = wp_cache_get( $cache_key );
if ( false === $count ) {
$count = $wpdb->get_var(
$wpdb->prepare(
"SELECT COUNT(*) FROM $wpdb->posts
WHERE ( ( post_type = 'wpdmpro' AND ( post_status = 'publish' OR post_status = 'private' ) )
AND post_author = %d )",
$author
)
);
wp_cache_set( $cache_key, $count );
}
return $count;
}
Но не торопитесь его применять. Закешировать - дело нехитрое. Основная проблема в кешировании - вовремя инвалидировать кеш. Особенно она важна, когда установлен и подключен Redis. Т.е. ваш запрос, будучи закеширован, будет отдавать один и тот же результат вечно.
Вам надо понять, как добавляются посты типа 'wpdmpro'. Если стандартными функциями WordPress, то надо использовать хуки 'save_post', 'post_updated', 'wp_trash_post', 'untrash_post', 'delete_post' для перехвата событий, проверять на них тип поста и сбрасывать кеш, если этот тип 'wpdmpro'.