Order или Orderby в tax_query (Как определить порядок терминов в WP_Query)

29 июн. 2016 г., 13:15:31
Просмотры: 15.6K
Голосов: 0

Я пытаюсь разобраться, как можно определить порядок терминов в моем 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();

    ?>
0
Все ответы на вопрос 1
1

Из документации get_terms:

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',    
]);
29 июн. 2016 г. 13:28:14
Комментарии

Отлично!! Работает идеально, совсем упустил из виду массив get_terms. Ещё раз спасибо! :)

tmgale12 tmgale12
29 июн. 2016 г. 14:47:30