Возврат таможенной таксономии в порядке размещения - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть цикл для ввода пользовательских терминов таксономии, которые я хотел бы упорядочить по слагу, но когда я добавляю в команду 'orderby', мой цикл прерывается и ничего не возвращает. Без сомнения, я использую неправильный синтаксис, но я не вижу, где для меня жизнь!

<?php

$loop = new WP_Query(
    array(
        'post_type'      => 'camp',
        'orderby'        => 'name',
        'order'          => 'ASC',
        'tax_query' => array(
            array(
                'taxonomy' => 'types',
                'field'    => 'slug',
                'terms'    => $term->slug,
            ),
        )
    )
);

if ($loop->have_posts()) :
while ($loop->have_posts()) : $loop->the_post();
$terms = get_lowest_taxonomy_terms(get_the_terms( get_the_ID(), array(
    'taxonomy' => 'destinations',
    'orderby' => 'slug',
    'order' => 'ASC'                                
)) );
?>

Любая помощь будет очень ценится:)

Добавлена ​​дополнительная функция:

get_lowest_taxonomy_terms работает следующим образом:

get_lowest_taxonomy_terms( $terms ) {
    // if terms is not array or its empty don't proceed
    if ( ! is_array( $terms ) || empty( $terms ) ) {
        return false;
    }

    $filter = function($terms) use (&$filter) {

        $return_terms = array();
        $term_ids = array();

        foreach ($terms as $t){
            if( $t->parent == 0 ) {
                $term_ids[] = $t->term_id;
            }
        }

        foreach ( $terms as $t ) {
            if( $t->parent == false || !in_array($t->parent,$term_ids) )  {
                //remove this term
            }
            else{
                $return_terms[] = $t;
            }
        }

        if( count($return_terms) ){
            return $filter($return_terms);
        }
        else {
            return $terms;
        }

    };

    return $filter($terms);
}

Желаемый выход

Цикл должен запрашивать таксономический тип 'destination', где у этого назначения есть дополнительная таксономия 'type'.

Снимок экрана текущего выхода:

enter image description here

Результаты упорядочены в 3 столбца с помощью CSS, но, как вы можете видеть, сортировка осуществляется не по алфавиту.

1 Ответ

0 голосов
/ 07 ноября 2018

get_the_terms не принимает массив в качестве второго параметра.

get_the_terms (int | object $ post, строка $ taxonomy)

Параметры:

$post (int | object) (обязательно) ID сообщения или объект.

$taxonomy (строка) (обязательно) Имя таксономии.

Подробнее о get_the_terms

По умолчанию get_the_terms не имеет опций сортировки. Но вы можете использовать usort для сортировки возвращаемого массива.

Итак, ваша последняя часть кода должна быть:

$terms = get_lowest_taxonomy_terms(get_the_terms( get_the_ID(), 'destinations' ));

Это быстрый пример того, как вы можете отсортировать его, используя usort:

$terms = get_the_terms( get_the_ID(), 'destinations' );
usort($terms,"so980_sort_terms_alphabetically");
function so980_sort_terms_alphabetically($a,$b) {
    return $a['slug'] > $b['slug'];//using 'slug' as sorting order
}

so980_sort_terms_alphabetically функция должна быть в файле functions.php вашей темы.

Итак, наконец, ваша последняя часть станет:

$terms = get_the_terms( get_the_ID(), 'destinations' );
usort($terms,"so980_sort_terms_alphabetically");
$terms = get_lowest_taxonomy_terms($terms);

Обновление

Я только что проверил это, и он возвращает фатальную ошибку, так как я допустил ошибку. Сообщение об ошибке: Fatal error: Cannot use object of type WP_Term as array.

get_the_terms возвращает объект. Таким образом, использование $a['slug'] вызывало ошибку.

Здесь so980_sort_terms_alphabetically должно быть реализовано следующим образом:

function so980_sort_terms_alphabetically($a,$b) {
    return $a->slug > $b->slug;//using 'slug' as sorting order
}

** Это проверено и работает.

Обновление 2

Поскольку ваши выходные коды недоступны в вашем вопросе, я предполагаю, что вы печатаете внутри цикла. Вместо этого мы будем сохранять возвращенные термины в другом массиве и сортировать их вне цикла, чтобы мы могли получить все термины одновременно.

Вот краткий пример того, как вы можете это сделать:

if ($loop->have_posts()) :
    while ($loop->have_posts()) : $loop->the_post();
        $pre_terms = get_lowest_taxonomy_terms(get_the_terms(get_the_ID(), 'product_tag'));
        if ( $pre_terms ) {
            foreach ( $pre_terms as $pre_term ) {
                $terms[] = $pre_term;
            }
        }
    endwhile;
endif;
usort($terms,"so980_sort_terms_alphabetically");

//a quick test to see if it's working or not
foreach ( $terms as $term ) {
    echo $term->slug;
    echo '<br/>';
}
...