Попытка вывести термины пользовательской таксономии с помощью get_categories
Я использую этот небольшой фрагмент кода, чтобы попытаться вывести термины пользовательской таксономии для использования в метабоксе с выпадающим списком, но он ничего не показывает при реализации (хотя работает с дефолтной таксономией 'category')
$partners = array();
$partners_obj = get_categories(array('taxonomy' => 'partner-cat'));
$partners[''] = '-';
foreach ($partners_obj as $partner) {
$partners[$partner->cat_ID] = $partner->cat_name;;
}
Как видите, моя пользовательская таксономия называется 'partner-cat' и есть записи в пользовательском типе записей, относящиеся к 2 разным терминам этой таксономии.
Любая помощь будет очень ценной.

get_categories()
получает таксономии типа 'категории', в частности http://core.trac.wordpress.org/browser/tags/3.6/wp-includes/category.php#L0, для получения пользовательских таксономий следует использовать get_terms(), здесь http://codex.wordpress.org/Function_Reference/get_terms
$terms = get_terms( 'partner-cat', 'orderby=count&hide_empty=0' );
$count = count($terms);
if ( $count > 0 ){
echo "<ul>";
foreach ( $terms as $term ) {
echo "<li>" . $term->name . "</li>";
}
echo "</ul>";
}
Убедитесь, что вы указали правильный ярлык (slug), который зарегистрировали для таксономии, и измените WP_DEBUG на true в вашем конфигурационном файле, чтобы проверить наличие ошибок. Возможно, вы пытаетесь получить таксономию до её регистрации, и в этом случае не будет результатов, а также вы получите ошибку.
Можете ли вы вставить ваш код для регистрации таксономии?

Я даже не подумал об этом! Я добавлял функцию метабокса ДО функции пользовательской таксономии. Я поменял их местами, и теперь всё работает идеально. Спасибо!

Пустые ли таксономические термины? По умолчанию они не отображаются. Вы можете попробовать использовать:
$partners_obj = get_terms( 'partner-cat', array('hide_empty' => false) );
Обратите внимание, что get_categories()
использует get_term()
для получения ваших терминов.
Ваш foreach
также не совсем правильный. Вместо этого следует обращаться к term_id
и name
.
foreach ($partners_obj as $partner) {
$partners[$partner->term_id] = $partner->name;
}
Полный код:
$partners = array();
$partners_obj = get_terms( 'taxo-name-here', array('hide_empty' => false) );
echo '<pre>' . print_r( $partners_obj, true ) . '</pre>';
echo '<hr>';
$partners[''] = '-';
foreach ($partners_obj as $partner) {
$partners[$partner->term_id] = $partner->name;;
}
echo '<pre>' . print_r( $partners, true ) . '</pre>';

Нет, в обоих есть записи. get_terms( 'partner-cat', array('hide_empty' => false) );
тоже не сработал... Это странно, потому что с обычными категориями записей всё работает нормально

Я попробовал этот вариант, но всё равно не получилось, хотя он выдал ошибку о недопустимой таксономии... Я несколько раз проверил название, и оно верное, так что не понимаю, в чём проблема

get_terms
возвращает wP_Error
, когда таксономия не существует. Можешь попробовать с другой таксономией? Как ты её создаёшь? Кодом или плагином?

Я только что попробовал с другой пользовательской таксономией - та же ошибка. Потом попробовал со стандартной "category" - сработало. Обе пользовательские таксономии существуют и в обеих есть записи... Создаю её кодом, без плагинов

можешь показать код, который ты использовал для таксономии? Добавь его в свой вопрос

Исправил. В конце концов решение оказалось простым, @dot1 подсказал мне проверить, какую функцию я вызываю первой, и всё что нужно было сделать — поставить мою пользовательскую таксономию первой, после чего всё заработало как надо. Спасибо за помощь

Если вы используете пользовательские типы записей (CPT) и, предположим, вы создали пользовательскую таксономию для этого типа записей, например:
У вас есть тип записей с названием "Продукты" и таксономия с названием "Категории продуктов".
Если вам нужно отобразить таксономию CPT на странице продуктов внутри цикла, я бы рекомендовал использовать следующую функцию согласно кодексу WordPress:
http://codex.wordpress.org/Function_Reference/get_terms
Код для получения таксономии CPT для типа записей "products" должен выглядеть следующим образом:
$categories = get_terms( 'products', 'orderby=count&hide_empty=0' );
Затем для отображения таксономий используйте этот код:
<?php foreach($categories as $category):
print $category->slug;print $category->name;
?>

Просто совет: лучше использовать переменные типа $terms
и $term
при работе с функциями для терминов, такими как get_terms
. Это менее запутанно, чем использование переменной типа $categories
:-)

Способ WordPress:
$categories = (array) get_terms('partner-cat', array('hide_empty' => false));
foreach (array_keys($categories) as $k)
{
_make_cat_compat($categories[$k]);
}
Это прямое использование реализации, которую WordPress применяет в функции get_categories(), расположенной в файле wp_includes\category.php

<?php
$args = array(
'type' => '', // необязательный параметр
'number' => '',
'hide_empty' => 0,
'taxonomy' => 'product_cat' // название вашей пользовательской таксономии
);
$categories = get_categories($args);
//echo "<pre>"; print_r($categories);
foreach($categories as $cat){
$catid = $cat->term_id;
$thumbnail_id = get_woocommerce_term_meta($catid, 'thumbnail_id', true );
$image = wp_get_attachment_url( $thumbnail_id );
$catname = $cat->name;
$catpage = $cat->slug;
?>
