基于Term_id的反向遍历分类

时间:2014-09-30 作者:JadedEric

如果子项id已知,是否可以反向遍历层次结构?

例如,我可能有这样一个分类法:

Cars
   - Pink
   - Blue
   - Grey
   - Silver
       - Metallic
       - Matte
       - Unpolished
            - Clear Vinyl
我有“透明乙烯基”的id,现在我想做的是建立一个所有家长的视图,一直到汽车。

我可以得到最上面的父ID,从中我可以“推断”在哪里停止遍历,直到我找到“透明乙烯基”的ID,但这似乎是一项非常乏味的工作。难道我没有理由说“给我所有的父母,让他们为term\\u id=x”吗。

1 个回复
SO网友:JadedEric

感谢@ialocin在上面的评论,我接受了他的recommendation 并根据我的需要进行了调整。如果您了解WordPress是如何从上到下遍历分类层次结构的,那么从下到上遍历分类层次结构实际上相对简单。

function origin_trail_ancestor($cat_id = 0, $link = false, $trail = false) {

    global $wp_query;

    $anchor = "<a href=\\"%s\\">%s</a>";
    $html = \'\';

    $descendant = get_term_by(\'id\', $cat_id, \'taxonomy\');
    $descendant_id = $descendant->term_id;

    $ancestors = get_ancestors($cat_id, \'taxonomy\');
    $ancestors = array_reverse($ancestors);

    $origin_ancestor = get_term_by(\'id\', $ancestors[0], \'taxonomy\');
    $origin_ancestor_id = $origin_ancestor->term_id;

    $ac = count($ancestors);

    $c = 1;

    if ($trail == false) {
        $origin_ancestor_term = get_term_by(\'id\', $origin_ancestor_id, \'taxonomy\');
        $origin_ancestor_link = get_term_link($origin_ancestor_term->slug, $origin_ancestor_term->taxonomy);

        if ($link == true) {
            $html .= sprintf($anchor, $origin_ancestor_link, $origin_ancestor->name);
        }
    }
    else {

        foreach ($ancestors as $ancestor) {
            $ancestor_term = get_term_by(\'id\', $ancestor, \'taxonomy\');
            $ancestor_link = get_term_link($ancestor_term->slug, $ancestor_term->taxonomy);

            if ($c++ == 1) {
                $html .= \'\';
            }
            else if ($c++ != 1 || $c++ != $ac) {
                $html .= \' / \';
            }

            if ($link == true) {
                $html .= sprintf($anchor, $ancestor_link, $ancestor_term->name);
            }
        }

        $descendant_term = get_term_by(\'id\', $descendant_id, \'taxonomy\');
        $descendant_link = get_term_link( $descendant_term->slug, $descendant_term->taxonomy );

        $html .= \' / \';

        $anchor = "<strong>%s</strong>";

        if ($link == true) {
            $html .= sprintf($anchor, $descendant_term->name);
        }
    }

    return $html;
}
然后可用于执行以下操作:

$breadcrumb = sprintf(\'<strong>You are here:</strong> %s / %s\', \'<a href="\' . site_url(\'/suppliers/\') . \'">All Suppliers</a>\', origin_trail_ancestor($main_listing_id, true, true));
在哪里$main_listing_id 是用户正在浏览并希望从中遍历回来的当前分类id的id。

谢谢你,巴德。

结束

相关推荐

Taxonomy term count

我有一个名为“资源”的自定义帖子类型,用于在我的网站上创建资源目录。该CPT具有称为“价格”的分类法。有三个术语因此,当有人在查看我的目录时,他们会在侧栏中看到“价格”以及下面的选项,他们可以单击(例如)免费并查看列出的18种不同的免费资源。我想要的是学期页面我的网站。com/价格/免费要有标题18免费资源我怎样才能做到这一点?