Упорядочить записи по заголовку и значению пользовательского поля?

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

Я хочу сортировать записи по заголовку, но всегда показывать избранные записи первыми. У меня есть код ниже для сортировки записей по заголовку. Теперь я хотел бы всегда показывать записи, которые имеют метаполе ‘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' );

Объяснение кода:

  1. Проверка основного запроса: Мы проверяем, что это идет обработка основного запроса, и он не относится к админке, чтобы избежать воздействия на административные страницы WordPress.

  2. Meta Query: Мы создаем метазапрос с relation => 'OR', чтобы включать сообщения с wiloke_listgo_toggle_highlight равным ‘1’ и все остальные, у которых этого поля нет.

  3. Сортировка: Используем orderby для сортировки сначала по метаполю (в порядке убывания, чтобы ‘highlighted’ посты шли первыми), а затем по заголовку в алфавитном порядке.

Видимость и SEO

Этот подход позволяет организовать ваши данные таким образом, чтобы в первую очередь пользователю показывались наиболее значимые посты, что способствует улучшению пользовательского опыта и, как следствие, может положительно сказаться на SEO.

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

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

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