Отображение текущей пользовательской таксономии записей в WordPress
Я создал пользовательские таксономии на 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>
Это лишь одна из многих таксономий, которые я хочу перечислить.
Проблема заключается в том, что приведенный выше код отображает все "Рабочие дисциплины", которые имеют по крайней мере одну должность, а не текущую таксономию должностей.
Как я могу разобраться в этом проблема?
2 answers
Как отобразить текущие таксономии и термины после публикации
Вот измененный код из Кодекса (см. Ссылку ниже), в котором будут отображаться все таксономии текущего сообщения с прилагаемыми терминами:
<?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>
Ссылка
Исходный пример кода в Кодекс:
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 чтобы сгруппировать их (по идентификатору и по родителю).
Функция изменена для использования с объектами:
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();?>
Примечание: просто работаем с детскими терминами одного уровня.