Вопрос или проблема
Итак, я попробовал два метода для простого отображения основных записей запроса в случайном порядке – просто. Я также пытаюсь лучше понять всё это.
-
Используя
the_content
add_filter, с моим собственным экземпляром классаWP_Query
. -
Используя
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
на фактический идентификатор вашего пользовательского запроса.
Рекомендации по оптимальным решениям
- Предпочтение
pre_get_posts
: Используйте метод сpre_get_posts
, чтобы избежать лишних запросов к базе данных. - Тестирование с Elementor: Убедитесь, что любые изменения в запросах тестируются в контексте Elementor, поскольку он может использовать свои собственные механизмы для обработки запросов.
- Обработка вывода: Используйте буферизацию вывода (
ob_start()
иob_get_clean()
), чтобы контролировать, что именно выводится на экран, избегая потерь данных.
Следуя этим рекомендациям, вы сможете успешно реализовать отображение постов в случайном порядке на вашем сайте.