Запрос строки упорядочить по пользовательскому полю

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

У меня есть код для пользовательского типа записи, для пользовательской таксономии для отображения записей категории. Я использую Advanced Custom Fields.

Что я хочу, так это отсортировать записи по значению настраиваемого поля, и я задумывался, как я могу это сделать?

Например, если записи имеют настраиваемое поле под названием “рейтинг”, как я могу отсортировать записи от наименьшего значения к наибольшему?

Вот пример кода

<?php $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'brendovi' ) ); ?>
            <?php if (have_posts()): query_posts($query_string.'&posts_per_page=-1&orderby=date&order=ASC');  ?>
            <?php while( have_posts() ) : the_post(); ?>

Это код, который работает отлично для отображения самых последних записей пользовательского типа, и у них есть настраиваемые поля под названиями field_1, field_2, field_3. И пользователи будут заполнять эти поля числовыми значениями. А затем на одной записи я сделаю расчет, суммируя эти значения и деля на 3, чтобы получить среднее значение. Давайте назовем это field_4.

Я застрял на отображении записей и сортировке их по этому field_4 с помощью строки запроса.

Возможно, мне не нужна строка запроса?

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

$the_query = new WP_Query(array(
    'post_type'         => 'your_cpt',
    'posts_per_page'    => -1,//получить их все
    'meta_key'          => 'field_4',
    'orderby'           => 'meta_value',
    'order'             => 'DESC'
));

?>
<?php if( $the_query->have_posts() ): ?>
    <ul>
    <?php while( $the_query->have_posts() ) : $the_query->the_post(); 

        $class = get_field('field_4');

        ?>
        <li <?php echo $class; ?>>
            <a href="https://wordpress.stackexchange.com/questions/287546/<?php the_permalink(); ?>"><?php the_title(); ?></a>
        </li>
    <?php endwhile; ?>
    </ul>
<?php endif; ?>

<?php wp_reset_query();  // Восстановить глобальные данные поста  ?>

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

Для того чтобы отсортировать записи пользовательского типа по значению метаполя, вам нужно использовать класс WP_Query в WordPress с указанием необходимых параметров. В вашем примере вы хотите отсортировать записи по метаполю "field_4", которое представляет собой среднее значение, рассчитанное на основе других полей.

Вот шаги, которые помогут вам добиться необходимого результата:

1. Настройка параметров WP_Query

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

2. Пример кода для сортировки

Ниже приведен пример кода, который вы можете использовать для сортировки записей вашего пользовательского типа по значению метаполя "field_4":

<?php 
$term = get_term_by('slug', get_query_var('term'), 'brendovi');

$args = array(
    'post_type'      => 'your_cpt',  // Укажите ваш пользовательский тип записей
    'posts_per_page' => -1,          // Получить все записи
    'meta_key'      => 'field_4',    // Метаполе, по которому будет сортировка
    'orderby'       => 'meta_value_num',  // Сортировка по числовым значениям
    'order'         => 'ASC',        // Порядок сортировки (возрастанию)
    'tax_query'     => array(        // Фильтрация по таксономии (если необходимо)
        array(
            'taxonomy' => 'brendovi', 
            'field'    => 'slug', 
            'terms'    => get_query_var('term')
        ),
    ),
);

$the_query = new WP_Query($args);

if ($the_query->have_posts()) : ?>
    <ul>
        <?php while ($the_query->have_posts()) : $the_query->the_post(); 
            $rating = get_field('field_4'); // Получение значения "field_4"
        ?>
            <li>
                <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                <span>Рейтинг: <?php echo esc_html($rating); ?></span>
            </li>
        <?php endwhile; ?>
    </ul>
<?php else : ?>
    <p>Записи не найдены.</p>
<?php endif; ?>

<?php wp_reset_postdata(); // Восстановление глобальных данных ?>

Основные моменты в этом коде:

  1. Параметры запроса: Используются параметры meta_key и orderby для сортировки по значению вашего метаполя. Метод meta_value_num позволяет правильно сортировать числовые значения.

  2. tax_query: Если вы хотите фильтровать записи по определенной таксономии, используйте параметр tax_query. В вашем случае можно указать вашу пользовательскую таксономию brendovi.

  3. Сброс данных: Не забудьте использовать wp_reset_postdata() после того, как вы закончите вывод ваших записей. Это важно, чтобы восстановить глобальные переменные и избежать проблем с другими циклами в WordPress.

Заключение

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

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

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