Вопрос или проблема
Я хочу сортировать записи по заголовку, но всегда показывать избранные записи первыми. У меня есть код ниже для сортировки записей по заголовку. Теперь я хотел бы всегда показывать записи, которые имеют метаполе ‘wiloke_listgo_toggle_highlight’ со значением ‘1’, первыми.
Как я могу это осуществить?
/* Сортировка записей в алфавитном порядке */
function prefix_modify_query_order( $query ) {
if ( is_main_query() ) {
$args = array( 'title' => 'ASC' );
$query->set( 'orderby', $args );
}
}
add_action( 'pre_get_posts', 'prefix_modify_query_order' );
Моя первая попытка помочь вам решить вашу проблему могла бы быть следующей:
/* Сортировка записей в алфавитном порядке */
function prefix_modify_query_order( $query ) {
if ( is_main_query() ) {
$query->set(
'meta_query', array(
'relation' => 'AND',
'query_highlight' => array(
'key' => 'wiloke_listgo_toggle_highlight',
'value' => '1',
'compare' => '='
)
)
);
$query->set(
'orderby', array(
'title' => 'ASC',
'query_highlight' => 'ASC',
)
);
}
}
add_action( 'pre_get_posts', 'prefix_modify_query_order' );
Источник: https://codex.wordpress.org/Class_Reference/WP_Meta_Query#Usage
Код должен начинать сортировать записи по заголовку в порядке возрастания и также учитывать записи с вашим пользовательским ключом со значением 1.
Примечание: Я не тестировал это, поэтому предлагаю вам прокомментировать, если возникнут какие-либо ошибки.
Ответ или решение
Чтобы решить проблему с сортировкой сообщений в WordPress сначала по метаполю, а затем по заголовку, вам нужно внести корректировки в вашу функцию, которая изменяет порядок запросов. Ваша задача заключается в том, чтобы сначала отображать все сообщения, у которых поле wiloke_listgo_toggle_highlight
равно ‘1’, а затем отсортировать оставшиеся сообщения по заголовку в алфавитном порядке.
Вот как можно это сделать:
function custom_modify_query_order( $query ) {
if ( is_main_query() && !is_admin() ) { // Убедитесь, что это основной запрос и не на админке
// Добавляем параметры для метапоиска, чтобы выявить 'highlighted' посты
$meta_query = array(
'relation' => 'OR',
array(
'key' => 'wiloke_listgo_toggle_highlight',
'value' => '1',
'compare' => '='
),
array(
'key' => 'wiloke_listgo_toggle_highlight', // Берем посты, где ключа нет или не равно 1
'compare' => 'NOT EXISTS'
),
);
$query->set('meta_query', $meta_query);
// Устанавливаем порядок сортировки: сначала по метаполю, затем по заголовку
$query->set('orderby', array(
'wiloke_listgo_toggle_highlight' => 'DESC', // 'highlighted' посты сначала
'title' => 'ASC' // Затем сортировка по заголовку
));
$query->set('meta_key', 'wiloke_listgo_toggle_highlight'); // Указываем ключ для сортировки
}
}
add_action( 'pre_get_posts', 'custom_modify_query_order' );
Объяснение кода:
-
Проверка основного запроса: Мы проверяем, что это идет обработка основного запроса, и он не относится к админке, чтобы избежать воздействия на административные страницы WordPress.
-
Meta Query: Мы создаем метазапрос с
relation => 'OR'
, чтобы включать сообщения сwiloke_listgo_toggle_highlight
равным ‘1’ и все остальные, у которых этого поля нет. -
Сортировка: Используем
orderby
для сортировки сначала по метаполю (в порядке убывания, чтобы ‘highlighted’ посты шли первыми), а затем по заголовку в алфавитном порядке.
Видимость и SEO
Этот подход позволяет организовать ваши данные таким образом, чтобы в первую очередь пользователю показывались наиболее значимые посты, что способствует улучшению пользовательского опыта и, как следствие, может положительно сказаться на SEO.
Пожалуйста, убедитесь, что ваш код протестирован в безопасной среде, прежде чем внедрять его на рабочем сайте, чтобы избежать непредвиденных ошибок.