Order или Orderby в tax_query (Как определить порядок терминов в WP_Query)
Я пытаюсь разобраться, как можно определить порядок терминов в моем WP_QUERY.
Я создаю базу знаний. У меня есть пользовательский тип записи (CPT) под названием knowledge-base и таксономия topics.
Мой код выводит все термины темы, затем циклом проходит через 4 записи, имеющие мета-ключ top_four_num, чтобы показать топ-4 вопроса в теме. Затем у меня есть вложенный цикл для остальных записей в этой теме. Они скрыты с помощью JQUERY, пользователь может нажать ссылку 'show all', чтобы их увидеть.
Все работает так, как я хочу, но я не могу понять, как изменить порядок терминов. В настоящее время они выводятся в алфавитном порядке.
Я проверил кодекс, и tax_query не имеет параметров для сортировки. Может ли кто-нибудь подсказать, как можно контролировать порядок в tax_query?
Мой код приведен ниже. Любая помощь будет очень ценной!
<?php
/**
* База знаний
*/
// Подключаем заголовок
get_header();
//* Настраиваем текст в поле поиска
add_filter( 'genesis_search_text', 'sp_search_text' );
function sp_search_text( $text ) {
return esc_attr( 'Задайте нам вопрос...' );
}
// Удаляем div.wrap внутри div.site-inner
add_filter( 'genesis_structural_wrap-site-inner', '__return_empty_string' );
//* Добавляем пользовательский класс к тегу body
add_filter( 'body_class', 'sp_body_class' );
function sp_body_class( $classes ) {
$classes[] = 'KB';
return $classes;
} ?>
<style>.site-inner {
max-width: none!important;
padding-top: 0;
} </style>
<!-- Верхний баннер -->
<div style="text-align: center;" class="top-banner">
<h1 style="color: white;">Демонстрация базы знаний</h1>
<?php get_search_form(); ?>
</div>
<div class="body-kb">
<?php
// Начинаем основной цикл по темам
$_terms = get_terms( array('topic') );
foreach ($_terms as $term) :
$ids = get_field('top_four', false, false);
$term_slug = $term->slug;
$_first = new WP_Query( array(
'post_type' => 'knowledge-base',
'order' => 'ASC',
'orderby' => 'meta_value_num',
'meta_key' => 'top_four_num',
'posts_per_page' => -4,
'tax_query' => array(
array(
'taxonomy' => 'topic',
'field' => 'slug',
'terms' => $term_slug,
),
),
));
if( $_first->have_posts() ) :
?> <div class="container1"><?php
// Выводим название термина
echo '<div class="term-name"><h2>'. $term->name .'</h2></div>';
echo '<hr id="short-line" align="left" width="100">';
while ( $_first->have_posts() ) : $_first->the_post();
?>
<?php
// Счетчик цикла для добавления div к первым возвращенным записям
if( 0 == $_first->current_post ) {
?> <div class="example-left"> <?php
}?>
<?php if( 2 == $_first->current_post ) {
?> </div> <?php
}?>
<?php if( 2 == $_first->current_post ) {
?> <div class="example-right"> <?php
}?>
<?php // выводим информацию о записи ?>
<div class="answers">
<h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
<p><?php get_post_meta( get_the_ID(), 'url', true ); ?></p>
</div>
<?php
endwhile;?>
<?php // Начинаем цикл скрытого контента ?>
<?php $term_slug = $term->slug;
$_second = new WP_Query( array(
'post_type' => 'knowledge-base',
'order' => 'ASC',
'posts_per_page' => 10, // важно для предупреждения о лимите памяти PHP
'meta_key' => 'priority',
'meta_value' => '1',
'meta_compare' => '>=',
'tax_query' => array(
array(
'taxonomy' => 'topic',
'field' => 'slug',
'terms' => $term_slug,
),
),
));
if( $_second->have_posts() ) :
?>
</div>
<!---КНОПКИ СКРЫТИЯ/ПОКАЗА JQUERY-->
<div class="view-more"><a class="arrow-link" data-expand="howitworks-expand">Показать ещё<img class="main-arrow" src="/wp-content/uploads/arrow@2x-1.png" alt="Стрелка раскрытия" title="Раскрыть список"></a></div>
<div class="show-content"><?php
$i = 0;
while ( $_second->have_posts() ) : $_second->the_post();
?>
<?php // Вывод скрытого цикла в две колонки автоматически
if ($i == 0) echo '<div class="one-half first">';
if ($i == (round($_second->post_count / 2))) echo '</div><div class="one-half">';
?> <p class="rest-of-p sub"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p>
<p><?php get_post_meta( get_the_ID(), 'url', true ); ?></p><?php
if ($i == round($_second->post_count)) echo '</div>';
$i++;
?>
<?php endwhile;?>
<?php wp_reset_postdata(); ?>
</div>
<?php endif;?>
<?php // КОНЕЦ ВТОРОГО ЦИКЛА ?>
<!--закрываем контейнер-->
</div>
</div><?php
endif;
endforeach;
?>
</div>
<?php
// Подключаем подвал
get_footer();
?>
orderby (string)
: Поле(я) для сортировки терминов. Допустимые значения: поля термина ('name', 'slug', 'term_group', 'term_id', 'id', 'description'), 'count' для подсчета таксономий термина, 'include' для соответствия порядку параметра $include, 'meta_value', 'meta_value_num', значение $meta_key, ключи массива $meta_query или 'none' для исключения ORDER BY. По умолчанию: 'name'.
Пример:
get_terms([
'taxonomy' => 'topic',
'orderby' => 'field',
'order' => 'ASC/DESC',
]);
