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

    Подскажите, пожалуйста, какой должен быть код.

Просмотр 4 ответов — с 1 по 4 (всего 4)
    1. Проверьте индексацию полей, участвующих в запросе, в базе данных сайта. Иногда добавление индексов решает проблему со скоростью
    2. Смотрите в сторону transient, если не поможет индексация базы https://developer.wordpress.org/apis/transients/

    Приблизительно такой(но это не точно):

    function wpdmpro_get_post_count() {
        $cache_key = 'wpdmpro_post_count'; 
        $post_count = wp_cache_get( $cache_key );
      
        if ( false === $post_count ) { 
            global $wpdb;
            $post_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",
                    get_current_user_id()
                )
            );
      
            wp_cache_set( $cache_key, $post_count );
        }
      
        return $post_count;
    }
    • Ответ изменён 1 год, 1 месяц назад пользователем ipsoltl.

    ipsoltl, спасибо за код, но, увы, не сработало.

    Насколько медленным является запрос (сколько секунд)? Сколько записей в таблице wp_posts сайта?

    • Ответ изменён 1 год, 1 месяц назад пользователем efess.
Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «Кеширование медленного запроса к БД в wordpress» закрыта для новых ответов.