Кеширование медленного запроса к БД в wordpress?

Рейтинг: 0Ответов: 1Опубликовано: 09.03.2023

На сайте согласно 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'.