Ограничьте количество отображаемых терминов таксономии


У меня есть 2 набора таксономий product_cat и tvshows_cat. Для каждого набора есть 12 терминов.

Продукт может содержать до 12 терминов (но никогда не из 2 наборов одновременно).

Я использую этот код для отображения списка терминов на странице продукта:

$cats = get_the_term_list($post->ID, 'product_cat', '', '  ', ''); 
$tvcats = get_the_term_list($post->ID, 'tvshows_cat', '', '  ', ''); 

if (!empty($cats)){
    echo strip_tags($cats, '   ');
}elseif(!empty($tvcats)){
    echo strip_tags($tvcats, '    ');
}

Результат таков:

Боевик, Драма, Приключения, Биография, Анимация

Проблема в том, что в некоторых случаях недостаточно места для отображения всех условия.

Мне нужно ограничить количество терминов 2 терминами.

Вопрос:

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

Спасибо

Author: LoicTheAztec, 2016-09-04

3 answers

Вместо использования функции get_the_term_list() вам следует использовать функцию get_the_terms(), которая даст вам непосредственно массив объектов терминов ( как get_the_term_list() использует get_the_terms() сама, если вы посмотрите на исходный код функции).

Затем, что вы можете создать пользовательскую функцию , чтобы получить то, что вы хотите (я не буду использовать функцию implode() или любую другую функцию php, так как нам нужны только 2 условия.)

Примечание: Вы не нужна функция strip_tags() здесь

Таким образом, ваш код будет:

// This function goes first
function get_my_terms( $post_id, $taxonomy ){
    $cats = get_the_terms( $post_id, $taxonomy );

    foreach($cats as $cat) $cats_arr[] = $cat->name;

    if ( count($cats_arr) > 1) $cats_str = $cats_arr[0] . ', ' . $cats_arr[1]; // return first 2 terms
    elseif ( count($cats_arr) == 1) $cats_str = $cats_arr[0]; // return one term
    else $cats_str = '';

    return $cats_str;
}

Этот код входит в function.php файл вашей активной дочерней темы (или темы) или любые файлы плагинов...

Затем ниже приведен ваш код:

$cats = get_my_terms( $post->ID, 'product_cat' ); 
$tvcats = get_my_terms( $post->ID, 'tvshows_cat' ); 

// Displaying 2 categories terms max
echo $cats . $tvcats;

Этот код помещается в ваш файл шаблонов php


- обновление - ( связано с комментарием автора)

Или без функции, ваш код будет:

// Product categories
$cats = get_the_terms( $post->ID, 'product_cat' );

foreach($cats as $cat) $cats_arr[] = $cat->name;

if ( count($cats_arr) > 1) $cats_str = $cats_arr[0] . ', ' . $cats_arr[1]; // return first 2 terms
elseif ( count($cats_arr) == 1) $cats_str = $cats_arr[0]; // return one term
else $cats_str = '';

// TV shows categories
$tvcats = get_the_terms( $post->ID, 'tvshows_cat' );

foreach($tvcats as $tvcat) $tvcat_arr[] = $tvcat->name;

if ( count($tvcat_arr) > 1) $tvcats_str = $tvcat_arr[0] . ', ' . $tvcat_arr[1]; // return first 2 terms
elseif ( count($tvcat_arr) == 1) $tvcats_str = $tvcat_arr[0]; // return one term
else $tvcats_str = '';

// The Display of 2 categories
echo $cats_str . $tvcats_str;

Этот код отправляется на ваш файлы шаблонов php

Этот код протестирован и работает.

 5
Author: LoicTheAztec, 2016-09-05 01:03:49

Вы также можете использовать explode() с array_slice() для этой проблемы.

Например:

function display_limited_terms($items){
    $filter = explode(',', $items);
    $a = array_slice($filter, 0, 2);
    foreach ($a as $b) {
        echo $b;
    }
}


$cats = get_the_term_list($post->ID, 'product_cat', '', '  ', '');
$tvcats = get_the_term_list($post->ID, 'tvshows_cat', '', '  ', '');

if (!empty($cats)) {

    display_limited_terms(strip_tags($cats, '   '));
} elseif (!empty($tvcats)) {

    display_limited_terms(strip_tags($cats, '   '));
}
 4
Author: hasan movahed, 2016-09-04 09:50:58

Я предполагаю, что ваш конечный результат представляет собой строку, разделенную запятыми - Действие, Драма, Приключение, Биография, Анимация.

Чтобы показать только два элемента, вы можете

$items = "item1, item2, item3, item4";

$filter = explode(',', $items);

for( $i=0; $i<2; $i++ ) {
    echo $filter[$i];
}

Попробуйте заменить приведенный выше код следующим

    function display_limited_terms( $items ) {
        $filter = explode(',', $items);

        for( $i=0; $i<2; $i++ ) {
            echo $filter[$i];
        }
    }


    $cats = get_the_term_list($post->ID, 'product_cat', '', '  ', '');
    $tvcats = get_the_term_list($post->ID, 'tvshows_cat', '', '  ', '');

    if (!empty($cats)){

        display_limited_terms( strip_tags($cats, '   ') );
    }

    elseif(!empty($tvcats)) {

        display_limited_terms( strip_tags($cats, '   ') );
    }
 3
Author: Varun Kumar, 2016-09-04 09:11:15