Вопрос или проблема
Я работаю над портфолио с фильтрами на основе пользовательского типа записей. Эти фильтры должны отображать только категории для записей, которые отображаются в портфолио, так как пользователь может указать их по id в шорткоде – [portfolio ids=”1,2,3″]. И я не могу получить список этих id категорий.
Вот простой пример того, что я пытаюсь сделать:
Список id пользовательских записей из шорткода:
$ids
Массив тех же id:
$id_array = explode(',', $ids)
Переменная, представляющая интерес, которая должна вернуть список id категорий:
$cat_ids = ???
Далее мы получаем только категории с нужными id:
$categories = get_categories(
array(
'include' => $cat_ids,
'taxonomy' => 'portfolio_category'
)
);
И, наконец, отображаем наши категории:
echo '<ul>';
echo '<li><a href="#" data-filter="isotope-item" class="active">все</a></li>';
foreach ($categories as $category) {
if( isset( $category->term_id ) ){
echo '<li><a href="#" data-filter="'.$category->category_nicename.'">'.$category->cat_name.'</a></li>';
}
}
echo '</ul>';
Ближайшее, что мне удалось получить, это:
$cat_ids = wp_get_object_terms( $ids, 'portfolio_category', array('orderby' => 'name', 'fields' => 'ids') );
Но он возвращает только один id
Хорошо, я думал, что у меня не осталось вариантов после нескольких часов, проведенных над этой маленькой частью кода. Но как-то мне удалось получить результат, сразу после того, как я безнадежно задал вопрос здесь.
$terms = wp_get_object_terms( $id_array, 'portfolio_category' );
$new_array = array();
foreach($terms as $key => $term) {
$new_array[$key] = $term->term_id;
}
$cat_ids = implode(',', $new_array);
$categories = get_categories(
array(
'include' => $cat_ids,
'taxonomy' => 'portfolio_category'
)
);
Может, кто-то смог бы прокомментировать это решение?
Ответ или решение
Для того чтобы получить список идентификаторов категорий на основе пользовательского типа записи, вы можете воспользоваться следующими шагами. Ваш текущий подход выглядит многообещающе, но давайте рассмотрим его более подробно и оптимизируем.
1. Получение идентификаторов постов
Вы начинаете с идентификаторов постов, переданных в шорткоде. Давайте начнем с этого:
$ids = '1,2,3'; // Пример идентификаторов постов
$id_array = explode(',', $ids); // Преобразуем строку в массив
2. Получение терминов категорий
Следующим шагом будет использование функции wp_get_object_terms
, чтобы получить термины (категории) для заданных идентификаторов постов. Вам нужно указать соответствующий таксономический тип (в данном случае portfolio_category
) и передать ваш массив идентификаторов:
$terms = wp_get_object_terms($id_array, 'portfolio_category');
Важно отметить, что wp_get_object_terms
может вернуть несколько терминов, если они существуют для ваших постов.
3. Формирование массива идентификаторов категорий
После получения терминов вам нужно извлечь их идентификаторы. Для этого вы можете воспользоваться циклом:
$cat_ids = array(); // Создаем пустой массив для хранения идентификаторов категорий
if (!is_wp_error($terms) && !empty($terms)) {
foreach ($terms as $term) {
$cat_ids[] = $term->term_id; // Заполняем массив идентификаторами категорий
}
}
4. Преобразование массива в строку
Если вам нужно получить строку с идентификаторами, вы можете использовать implode
:
$cat_ids_string = implode(',', $cat_ids);
5. Получение категорий по идентификаторам
Теперь, когда у вас есть идентификаторы категорий, вы можете использовать функцию get_categories
, чтобы получить их данные:
$categories = get_categories(array(
'include' => $cat_ids_string,
'taxonomy' => 'portfolio_category'
));
6. Вывод категорий
Наконец, вы можете отобразить результаты в виде списка:
echo '<ul>';
echo '<li><a href="#" data-filter="isotope-item" class="active">all</a></li>';
foreach ($categories as $category) {
echo '<li><a href="#" data-filter="' . esc_attr($category->slug) . '">' . esc_html($category->name) . '</a></li>';
}
echo '</ul>';
Заключение
Таким образом, ваше решение достаточно эффективно, но можно упростить его, используя предложенные улучшения. Важно убедиться, что вы обрабатываете ошибки, которые могут возникнуть при получении терминов. Следуя данным шагам, вы сможете динамически генерировать список категорий для вашего портфолио.
Этот подход не только улучшает читаемость кода, но и их производительность за счет уменьшения количества вызовов функций. Если у вас есть дополнительные вопросы, пожалуйста, дайте знать!