根据层次结构在自定义分类中查找术语

时间:2015-02-16 作者:Sudar

我有一个分层自定义分类法,即单个术语名称可以在不同级别重复,但不能在单个分层路径中重复。

让我用一个例子来解释一下

News
News > Regional
News > International
News > International > country
Sports
Sports > News
Sports > News > Football
在上述示例中,“新闻”一词重复了两次,但其层次路径不同。

给定此自定义分类结构和术语,我需要一种方法来查找是否存在给定的层次结构路径,如果存在,则获取子术语id。

我对搜索的输入是Sports > News > Football 我需要找到这样一条路径是否存在,如果存在,那么叶项的id(Football 在上述情况下)

有没有办法使用内置的WordPress功能?

1 个回复
最合适的回答,由SO网友:David Gard 整理而成

您可以通过递归检查每个级别来实现这一点,以查看它是否存在,并将上面的级别作为其父级。

虽然我从来没有在愤怒中使用过此代码,但它已经过测试并正常工作,尽管我不能说它的效率有多高,特别是如果您有一条很长的层次结构路径。

将此代码放入functions.php -

/**
 * Return whether or not a given hierarchical taxonomy structure exists
 *
 * @param required array $path  The hierarchical path to check
 * @param string $category      The taxonomy to search
 * @param integer $parent       The parent of the first term
 *       (usually ignored when called by the user, this parameter is primarily
 *        for use when the function is recursivly called)
 * @return boolean              Whether or not the given path exists
 */
function taxonomy_path_exists($path, $taxonomy = \'category\', $parent = 0){

    if(!is_array($path) || empty($path))    // Ensure that the \'$path\' is given as an array, and id not empty
        return false;

    if(term_exists($path[0], $taxonomy)) : // The term exists, recursivly check if the given children exist

        $term = get_term_by(\'slug\', $path[0], $taxonomy);   // Get this term as an object
        unset($path[0]);                                    // Remove this level so that it doesn\'t get retested
        $path = array_values($path);                        // Reset the keys within the \'$path\' array

        /**
         * Check if the \'$path\' array is now empty (meaning that all levels have been exhusted)
         * or if the next level exists
         */
        if(empty($path) || path_exists($path, $taxonomy, $term->term_id)) :
            return ture;
        else :
            return false;
        endif;

    else :  // The term does not exist

        return false;

    endif;

}
要使用此函数,请传递要检查的路径数组及其所属的类别。我已经猜到了你的术语slug,你正在使用category, 但你可以根据需要修改。

此代码也适用于零件路径,因此如果要删除\'football\' 例如,它仍然有效。

将此代码放在您希望检查给定层次结构路径的模板中-

$path = array(
    \'sports\',
    \'sports-news\',
    \'football\'
);
echo (taxonomy_path_exists($path, \'category\')) ? \'Yes\' : \'No\';

结束

相关推荐

将选定列表值(分类)保存在wp中:wp_set_Object_Terms

在我的管理部分,我有其他字段(如价格或品牌-这是分类法)。编辑或创建新零件时,我会设置其他数据。价格节约没有任何问题,但从选择列表中保存值有些奇怪-它没有保存:wp_set_object_terms($post_id, $_POST[\'part_brand\'], \'brands\', true); 根据wp doc:此函数从分类法选择更新值。但对我来说,这不起作用。您可以在此处看到的所有代码:http://pastebin.com/N4gZL3uN如何在wp中保存选择列表(分类法)中的值?