Вопрос или проблема
У меня есть код для пользовательского типа записи, для пользовательской таксономии для отображения записей категории. Я использую 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(); // Восстановление глобальных данных ?>
Основные моменты в этом коде:
-
Параметры запроса: Используются параметры
meta_key
иorderby
для сортировки по значению вашего метаполя. Методmeta_value_num
позволяет правильно сортировать числовые значения. -
tax_query: Если вы хотите фильтровать записи по определенной таксономии, используйте параметр
tax_query
. В вашем случае можно указать вашу пользовательскую таксономиюbrendovi
. -
Сброс данных: Не забудьте использовать
wp_reset_postdata()
после того, как вы закончите вывод ваших записей. Это важно, чтобы восстановить глобальные переменные и избежать проблем с другими циклами в WordPress.
Заключение
Следуя этому примеру, вы сможете успешно отсортировать записи вашего пользовательского типа по значению метаполя "field_4". Данный подход не только будет более оптимальным, но и обеспечит правильное отображение записей на вашем сайте.