在 WordPress 中显示当前的帖子自定义分类
Posted
技术标签:
【中文标题】在 WordPress 中显示当前的帖子自定义分类【英文标题】:Display current post custom taxonomy in WordPress 【发布时间】:2013-03-08 07:45:44 【问题描述】:我在 WordPress 上创建了自定义分类法,我想在列表中显示帖子上的当前帖子分类法。
我正在使用以下代码来显示一个名为“Job Discipline”的自定义分类:
<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>
这只是我想列出的众多分类法之一。
问题是上面的代码显示了所有至少有一个帖子的“工作学科”,而不是当前的帖子分类。
我该如何解决这个问题?
【问题讨论】:
问题截图:docs.google.com/file/d/0BwVSqH5yzcN-Wm1YY29CdUxfbkk/edit 你会在wordpress.stackexchange.com得到更好的答案。 【参考方案1】:如何显示当前帖子分类法和术语
这是来自 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;
【讨论】:
可爱!这是结果截图:docs.google.com/file/d/0BwVSqH5yzcN-d3dSLVdPeUpPUUk/edit 但是如果我只想显示其中的一部分而不是全部怎么办?另外,我想自己命名它们,而不是用下划线给出分类名称。知道如何实现吗? 工作就像一个魅力!非常感谢你的帮助伙伴。 :) 这是一个隐藏未分配分类的更新版本:wordpress.stackexchange.com/questions/130993/… 谢谢!对我来说真正重要的金块是:get_the_terms( $post->ID, $taxonomy );
我以前只有get_terms($taxonomy)
,这是不正确的。
很高兴它帮助了@tkm【参考方案2】:
以防万一有人想按父级分组显示它们。
基本上和上面的答案一样。我在另一个帖子中使用了这个答案: https://***.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();?>
注意:仅使用一级子术语。
【讨论】:
以上是关于在 WordPress 中显示当前的帖子自定义分类的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress:如何通过自定义分类法在作者页面中显示帖子计数
使用 Ajax 的带有自定义分类法的 Wordpress 多个自定义帖子类型过滤器 - 所有新创建的帖子都不会在响应中显示
在 Wordpress 自定义帖子类型循环中使用 ACF 分类字段作为变量