Кеширование медленного запроса к БД в 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;
}

Подскажите, пожалуйста, какой должен быть код.
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 2
anatoly_kulikov
@anatoly_kulikov
Помог ответ? Отметь решением!
Да, вам нужна фунция, которая возвращает результат запроса + имеет кеширование. На в оф. доках или на Каме посмотрите, там есть подробное описание про объектный кэш.
Ответ написан
TMProject
@TMProject
Frontend developer React/Redux
Попробуй так:
function my_get_wpdm_post_count() {
    $cache_key = 'my_wpdm_post_count';
    $post_count = wp_cache_get( $cache_key );
    
    if ( false === $post_count ) {
        global $wpdb;
        $post_count = $wpdb->get_var(
            "SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type = 'wpdmpro' AND post_author = 1 AND post_status IN ('publish', 'private')"
        );
        wp_cache_set( $cache_key, $post_count );
    }
    
    return $post_count;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы