Как отобразить основные записи запроса в случайном порядке, используя add_filter

Вопрос или проблема

Итак, я попробовал два метода для простого отображения основных записей запроса в случайном порядке – просто. Я также пытаюсь лучше понять всё это.

  1. Используя the_content add_filter, с моим собственным экземпляром класса WP_Query.

  2. Используя pre_get_posts add_filter.

Я не смог заставить add_filter случайным образом распределять записи. Также стоит упомянуть, что используется плагин Elementor в качестве конструктора страниц, так что он обслуживает блог. Возможно, он перезаписывает мой фильтр? Или я что-то упускаю.

Кроме того, какой был бы лучший метод для этого, если мои попытки ниже не идеальны?

Мой код с обоими методами выглядит следующим образом:

ПЕРВЫЙ МЕТОД:

add_filter( 'the_content', 'thefunction',10 ,1 );
function thefunction($content) {

    $args = array(
       'post_type' => 'post',
       'orderby' => 'rand'
    );

    $mario_query = new  WP_Query( $args );

    if ( $mario_query->have_posts() ) {
        while ( $mario_query->have_posts() ) {
            $mario_query->the_post();
        }
    } else { echo 'ошибка: записи не найдены.'; }

    wp_reset_postdata();

    return $content;
}

ВТОРОЙ МЕТОД:

add_filter( 'pre_get_posts', 'thefunction');
function thefunction($content) {

    if ( ! is_admin() && $query->is_main_query() ) {
        // Не запрос для админской страницы.
        // Это основной запрос для фронтальной страницы вашего сайта.
 
            // Давайте изменим запрос, используя аргументы.
            $query->set( 'orderby', 'rand' );

    }

    return $content;
}

Должен быть add_action, а не add_filter при использовании pre_get_posts

add_action( 'pre_get_posts', 'thefunction');
function thefunction($query) {

    if ( ! is_admin() && $query->is_main_query() ) {
        // Не запрос для админской страницы.
        // Это основной запрос для фронтальной страницы вашего сайта.
 
            // Давайте изменим запрос, используя аргументы.
            $query->set( 'orderby', 'rand' );

    }

    return $query;
}

Ответ или решение

Для реализации отображения постов в случайном порядке с использованием фильтра add_filter или add_action, важно учитывать несколько аспектов, связанные с логикой WordPress и работой плагина Elementor. В вашем случае вы уже пробовали два подхода, и я помогу вам разобраться, как это можно сделать правильно, а также какие аспекты могут повлиять на работу ваших фильтров.

Методы отображения постов в случайном порядке

Метод 1: Использование the_content и WP_Query

Ваш исходный код с использованием фильтра the_content имеет некоторые недостатки, так как вы не возвращаете результат из WP_Query. Также этот способ несколько неэффективен, поскольку создаёт новый экземпляр WP_Query для каждого запроса к контенту.

add_filter('the_content', 'thefunction', 10, 1);
function thefunction($content) {
    $args = array(
        'post_type' => 'post',
        'orderby' => 'rand'
    );

    $mario_query = new WP_Query($args);

    if ($mario_query->have_posts()) {
        ob_start(); // Начинаем буферизацию вывода
        while ($mario_query->have_posts()) {
            $mario_query->the_post();
            // Выводим контент поста
            the_title('<h2>', '</h2>');
            the_excerpt();
        }
        $content .= ob_get_clean(); // Добавляем сгенерированный вывод к контенту
    } else {
        echo 'error: no posts retrieved.';
    }

    wp_reset_postdata();
    return $content;
}

Этот метод добавляет случайные посты в конце контента, что может быть не совсем тем, что вы хотите.

Метод 2: Использование pre_get_posts

Более правильным способом является использование pre_get_posts, но, как вы заметили, необходимо использовать add_action, а не add_filter. Исправленный код будет выглядеть следующим образом:

add_action('pre_get_posts', 'thefunction');
function thefunction($query) {
    if (!is_admin() && $query->is_main_query() && is_home()) {
        // Меняем порядок выдачи на случайный
        $query->set('orderby', 'rand');
    }
}

Этот код будет корректно менять порядок вывода постов на главной странице вашего блога. Однако имейте в виду, что если Elementor обрабатывает запросы, он может переопределить ваши фильтры.

Возможные проблемы с Elementor

Если вы используете плагин Elementor, он может переопределять вашу настройку pre_get_posts. В этом случае вам следует попробовать использовать хуки, специфичные для Elementor, например:

add_action('elementor/query/my_custom_query', function($query) {
    $query->set('orderby', 'rand');
});

Замените my_custom_query на фактический идентификатор вашего пользовательского запроса.

Рекомендации по оптимальным решениям

  1. Предпочтение pre_get_posts: Используйте метод с pre_get_posts, чтобы избежать лишних запросов к базе данных.
  2. Тестирование с Elementor: Убедитесь, что любые изменения в запросах тестируются в контексте Elementor, поскольку он может использовать свои собственные механизмы для обработки запросов.
  3. Обработка вывода: Используйте буферизацию вывода (ob_start() и ob_get_clean()), чтобы контролировать, что именно выводится на экран, избегая потерь данных.

Следуя этим рекомендациям, вы сможете успешно реализовать отображение постов в случайном порядке на вашем сайте.

Оцените материал
Добавить комментарий

Капча загружается...