Я создал пользовательские таксономии в WordPress, и я хочу отображать текущие почтовые таксономии на почте в списке.
Я использую следующий код для отображения пользовательской таксономии «Дисциплина работы»:
<ul> <?php $args = array('taxonomy' => 'job_discipline'); ?> <?php $tax_menu_items = get_categories( $args ); foreach ( $tax_menu_items as $tax_menu_item ):?> <li> Job Discipline: <a href="<?php echo get_term_link($tax_menu_item,$tax_menu_item->taxonomy); ?>"> <?php echo $tax_menu_item->name; ?> </a> </li> <?php endforeach; ?> </ul>
Это всего лишь одна из многих таксономий, которые я хочу перечислить.
Проблема в том, что в приведенном выше коде отображаются все «Дисциплины работы», в которых есть хотя бы одно сообщение, а не текущая таксономия.
Как я могу решить эту проблему?
Вот модифицированный код из Codex (см. Ссылку ниже), в котором будут отображаться все таксономии текущего сообщения с прилагаемыми терминами:
<?php // get taxonomies terms links function custom_taxonomies_terms_links() { global $post, $post_id; // get post by post id $post = &get_post($post->ID); // get post type by post $post_type = $post->post_type; // get post type taxonomies $taxonomies = get_object_taxonomies($post_type); $out = "<ul>"; foreach ($taxonomies as $taxonomy) { $out .= "<li>".$taxonomy.": "; // get the terms related to post $terms = get_the_terms( $post->ID, $taxonomy ); if ( !empty( $terms ) ) { foreach ( $terms as $term ) $out .= '<a href="' .get_term_link($term->slug, $taxonomy) .'">'.$term->name.'</a> '; } $out .= "</li>"; } $out .= "</ul>"; return $out; } ?>
Это используется следующим образом:
<?php echo custom_taxonomies_terms_links();?>
Результат может выглядеть так, если в текущем столбце есть country
и city
таксономии:
<ul> <li> country: <a href="http://example.com/country/denmark/">Denmark</a> <a href="http://example.com/country/russia/">Russia</a> </li> <li> city: <a href="http://example.com/city/copenhagen/">Copenhagen</a> <a href="http://example.com/city/moscow/">Moscow</a> </li> </ul>
Исходный пример кода в Codex:
http://codex.wordpress.org/Function_Reference/get_the_terms#Get_terms_for_all_custom_taxonomies
Надеюсь, это поможет – я уверен, что вы можете адаптировать это к своему проекту 😉
Но что, если я хочу отображать только некоторые из них, а не все? Кроме того, я хотел бы назвать их сам, а не давать имена таксономии с подчеркиваниями. Любая идея, как я могу это достичь?
Вот одна из таких модификаций:
function custom_taxonomies_terms_links() { global $post; // some custom taxonomies: $taxonomies = array( "country"=>"My Countries: ", "city"=>"My cities: " ); $out = "<ul>"; foreach ($taxonomies as $tax => $taxname) { $out .= "<li>"; $out .= $taxname; // get the terms related to post $terms = get_the_terms( $post->ID, $tax ); if ( !empty( $terms ) ) { foreach ( $terms as $term ) $out .= '<a href="' .get_term_link($term->slug, $tax) .'">'.$term->name.'</a> '; } $out .= "</li>"; } $out .= "</ul>"; return $out; }
На всякий случай кто-то хочет отобразить их сгруппированными родителями.
Это в основном тот же ответ, что и выше. Я использовал этот ответ в форме другого сообщения: https://stackoverflow.com/a/12144671, чтобы сгруппировать их (по id и родительским).
Функция изменена для использования с объектами:
function object_group_assoc($array, $key) { $return = array(); foreach($array as $object) { $return[$object->$key][] = $object; } return $return; }
Конечная функция:
// get taxonomies terms links function custom_taxonomies_terms_links() { global $post, $post_id; // get post by post id $post = &get_post($post->ID); // get post type by post $post_type = $post->post_type; // get post type taxonomies $taxonomies = get_object_taxonomies($post_type); $out = "<ul>"; foreach ($taxonomies as $taxonomy) { $out .= "<li>".$taxonomy.": "; // get the terms related to post $terms = get_the_terms( $post->ID, $taxonomy ); if ( !empty( $terms ) ) { $terms_by_id = object_group_assoc($terms, 'term_id'); $terms_by_parent = object_group_assoc($terms, 'parent'); krsort($terms_by_parent); foreach ( $terms_by_parent as $parent_id => $children_terms ){ if($parent_id != 0){//Childs //Add parent to out string $parent_term = $terms_by_id[$parent_id][0]; //[0] because object_group_assoc return each element in an array $out .= '<li><a href="' .get_term_link($parent_term->slug, $taxonomy) .'">'.$parent_term->name.'</a>'; //Add children to out string $out .= '<ul>'; foreach ($children_terms as $child_term) { $out .= '<li><a href="' .get_term_link($child_term->slug, $taxonomy) .'">'.$child_term->name.'</a></li>'; } $out .= '</ul></li>'; } else {//parent_id == 0 foreach ($children_terms as $child_term) { if(!array_key_exists($child_term->term_id, $terms_by_parent)){//Not displayed yet becouse it doesn't has children $out .= '<li><a href="' .get_term_link($child_term->slug, $taxonomy) .'">'.$child_term->name.'</a></li>'; } } $out .= '</ul></li>'; } } } $out .= "</li>"; } $out .= "</ul>"; return $out; }
Используется одинаково:
<?php echo custom_taxonomies_terms_links();?>
Примечание: просто работайте с условиями одного уровня для детей.