Вывод терминов для пользовательских типов записей

30 мая 2017 г., 16:15:47
Просмотры: 18.3K
Голосов: 0

Мне удалось вывести все термины, принадлежащие пользовательской таксономии, с помощью следующего кода:

$args = array('post_type' => 'my_post_type','number' => '999');
$terms = get_terms( 'my_taxo',
          [
            'hide_empty' => true,
            'orderby' => 'wpse_last_word',
          ] , $args );

foreach ( $terms as $term ) { 
    echo '' . $term->name . ''; 
}

Этот код дает желаемые результаты на моем локальном сервере (xampp). По сути, он выводит все термины, назначенные конкретной записи. Но когда я загружаю код на рабочий сервер, код перестает работать как ожидалось. Вместо этого он показывает все термины без фильтрации. Я даже обновил версию PHP на рабочем сервере, чтобы она соответствовала локальному серверу, но это не помогло.

Может ли кто-нибудь указать на проблему в моем коде?

0
Все ответы на вопрос 2
13

Ваш код неправильный. Я не знаю, как он работает у вас на локальном сервере. Причины:

  1. Вы вызываете get_terms() с 3 параметрами, хотя эта функция принимает только 2 параметра. Последний параметр лишний.
  2. Во-вторых, get_terms() возвращает все термины таксономии, а не термины, связанные с конкретной записью.

Для получения терминов, связанных с записью, вы можете использовать wp_get_post_terms.

Использование wp_get_post_terms внутри цикла WordPress:

Для каждой записи вы получите её термины, вызвав wp_get_post_terms следующим образом:

// Делаем что-то, если определённое значение массива существует в записи
$term_list = wp_get_post_terms($post->ID, 'your_taxonomy', array("fields" => "all"));
// Затем можно запустить цикл foreach для отображения терминов таксономии
foreach($term_list as $term_single) {
    echo $term_single->slug; // делаем что-то здесь
}

Для использования вне цикла:

// Делаем что-то, если определённое значение массива существует в записи
// И каким-то образом вам нужно получить ID записи для передачи ниже
$term_list = wp_get_post_terms($post_id, 'your_taxonomy', array("fields" => "all"));
// Затем можно запустить цикл foreach для отображения терминов таксономии
foreach($term_list as $term_single) {
    echo $term_single->slug; // делаем что-то здесь
}

Надеюсь, это поможет.

30 мая 2017 г. 16:38:20
Комментарии

можешь показать мне скрипт, который нужно использовать.

Roshan Deshapriya Roshan Deshapriya
30 мая 2017 г. 16:39:34

Ты посетил ссылку? @rosh8111

CodeMascot CodeMascot
30 мая 2017 г. 16:40:15

Спасибо, я проверю кодекс и дам знать, если всё заработает. Спасибо, что указал на это. - @the_dramatist

Roshan Deshapriya Roshan Deshapriya
30 мая 2017 г. 20:35:27

Привет, я протестировал все возможные скрипты, но ничего не выводит названия терминов для поста, который принадлежит CPT. Не могли бы вы любезно опубликовать код, который решит эту проблему? Обратите внимание, что мой код находится вне цикла, и я сейчас использую:
$args = array('post_type' => 'projects','number' => '1'); $terms = wp_get_post_terms($post_id, 'Client',array("fields" => "names"), $args); foreach( $terms as $term ){ echo '<h5>' . $term->name . '</h5>'; }

Roshan Deshapriya Roshan Deshapriya
30 мая 2017 г. 23:51:42

Не могли бы вы уточнить, что именно вы пытаетесь достичь? Лучше отредактируйте вопрос и поясните подробнее! @rosh8111

CodeMascot CodeMascot
31 мая 2017 г. 00:48:38

Хорошо, у меня есть пользовательский тип записи под названием "projects", в нем я создал таксономию "Clients", где на бэкенде я ввожу клиентов. Таким образом, каждый раз при публикации проекта я выбираю клиента, которого хочу отобразить на фронтенде.

Roshan Deshapriya Roshan Deshapriya
31 мая 2017 г. 01:22:38

Итак, вам нужно отобразить термины, связанные с одним постом, верно? И внутри цикла WordPress или вне цикла WordPress? Если вне цикла, то в каком шаблоне - single.php или archive.php?

CodeMascot CodeMascot
31 мая 2017 г. 07:42:28

@rosh8111 ознакомьтесь с обновленным ответом.

CodeMascot CodeMascot
31 мая 2017 г. 07:51:06

У меня есть собственный пользовательский шаблон, фактически эта страница загружается в пользовательском single.php, связанном с пользовательским типом записи. Я сообщу вам результаты, спасибо за помощь.

Roshan Deshapriya Roshan Deshapriya
31 мая 2017 г. 07:56:12

Я проверил код, который вы мне дали, к сожалению, он не возвращает никаких результатов, просто пустой вывод. Я пробовал даже с query post. Ничего не работает...

Roshan Deshapriya Roshan Deshapriya
31 мая 2017 г. 10:36:07

Сначала замените your_taxonomy на название вашей таксономии clients. Затем сделайте print_r($term_list) и пришлите результат сюда вместе со скриншотом страницы администрирования вашей пользовательской таксономии. @rosh8111

CodeMascot CodeMascot
31 мая 2017 г. 11:30:24

[link]http://pad10.net/assets/tax_error.jpg, во вложении скриншот моей настройки и результатов, которые я получаю.

Roshan Deshapriya Roshan Deshapriya
31 мая 2017 г. 12:18:17

Очевидно, это ничего не вернет. Вам нужно передать ID записи в $post_id. В вашем случае $post_id пустой, как я понимаю. Вы можете получить ID записи из global $post, а затем использовать $post->ID.

CodeMascot CodeMascot
31 мая 2017 г. 12:31:47
Показать остальные 8 комментариев
0

После нескольких исследований я нашел нижеприведенный скрипт, который выполняет работу. Спасибо @the_dramatist за указание правильного направления. Я использовал global $post, но не совсем корректным образом.


global $post;
$loop = new WP_Query(array('post_type' => 'myCPT', 'posts_per_page' => -1));
while ($loop->have_posts()) : $loop->the_post();
$terms = wp_get_post_terms($post->ID, 'my_taxonomy');                   
foreach($terms as $term_single) {
echo '' . $term_single->slug. '';
}
endwhile;

Если кто-то получает пустые результаты после этого, просто удалите категории и заново создайте и примените их.

31 мая 2017 г. 13:46:19