Ограничьте количество отображаемых терминов таксономии
У меня есть 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 терминами.
Вопрос:
Как я могу ограничить количество терминов, применяемых к двум?
Спасибо
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
Этот код протестирован и работает.
Вы также можете использовать 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, ' '));
}
Я предполагаю, что ваш конечный результат представляет собой строку, разделенную запятыми - Действие, Драма, Приключение, Биография, Анимация.
Чтобы показать только два элемента, вы можете
$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, ' ') );
}