在分层分类中插入术语

时间:2011-02-02 作者:Manny Fleurmond

我在插入术语方面确实有一些问题。下面是我的场景:我有一个名为veda\\u release\\u type的分类法:

//Release Type and Region
        $labels = array(
            \'name\'=> _x(\'Release Types/Regions\', \'taxonomy general name\' ),
            \'singular_name\' => _x(\'Release Type/Region\', \'taxonomy singular name\'),
            \'search_items\' => __(\'Search Release Types/Regions\'),
            \'popular_items\' => __(\'Popular Release Types/Regions\'),
            \'all_items\' => __(\'All Release Types/Regions\'),
            \'edit_item\' => __(\'Edit Release Type/Regions\'),
            \'edit_item\' => __(\'Edit Release Type/Region\'),
            \'update_item\' => __(\'Update Release Type/Region\'),
            \'add_new_item\' => __(\'Add New Release Type/Region\'),
            \'new_item_name\' => __(\'New Release Type/Region Name\'),
            \'separate_items_with_commas\' => __(\'Seperate Release Types/Regions with Commas\'),
            \'add_or_remove_items\' => __(\'Add or Remove Release Types/Regions\'),
            \'choose_from_most_used\' => __(\'Choose from Most Used Release Types/Regions\')
        );
        $args = array( 
            \'hierarchical\' =>true,  
            \'labels\' => $labels,  
            \'query_var\' => true,  
            \'rewrite\' => array(\'slug\' =>\'release_type\')     
        );
        register_taxonomy(\'veda_release_type\', \'veda_release\',$args);
这显然是等级制度。顶层包含发行类型ieDVD、blu-ray。下面的级别是区域,即区域1、区域2等。因此,我想要的层次结构是:DVD--区域0--区域1--区域2--区域3--区域4--区域5--区域6Blu射线--区域A--区域B--区域C

我在类中创建了一个名为insert\\u term的函数,以检查是否存在一个术语,如果不存在,则插入该术语:

public function insert_term ($term, $taxonomy, $args = array()) {
        if (isset($args[\'parent\'])) {
            $parent = $args[\'parent\'];
        } else {
            $parent = 0;
        }
        $result = term_exists($term, $taxonomy, $parent);
        if ($result == false || $result == 0) {
            return wp_insert_term($term, $taxonomy, $args);             
        } else {
            return (array) $result;
        }       
}
然后我调用所述函数插入术语:

    $dvd = $this->insert_term(\'DVD\',\'veda_release_type\');
    $this->insert_term(\'Region 0\',\'veda_release_type\',array(\'parent\'=>$dvd[\'term_id\']));
    $this->insert_term(\'Region 1\',\'veda_release_type\',array(\'parent\'=>$dvd[\'term_id\']));
    $this->insert_term(\'Region 2\',\'veda_release_type\',array(\'parent\'=>$dvd[\'term_id\']));
    $this->insert_term(\'Region 3\',\'veda_release_type\',array(\'parent\'=>$dvd[\'term_id\']));
    $this->insert_term(\'Region 4\',\'veda_release_type\',array(\'parent\'=>$dvd[\'term_id\']));
    $this->insert_term(\'Region 5\',\'veda_release_type\',array(\'parent\'=>$dvd[\'term_id\']));
    $this->insert_term(\'Region 6\',\'veda_release_type\',array(\'parent\'=>$dvd[\'term_id\']));

    $bd = $this->insert_term(\'Blu-Ray\', \'veda_release_type\');
    $this->insert_term(\'Region A\',\'veda_release_type\',array(\'parent\'=>$bd[\'term_id\']));
    $this->insert_term(\'Region B\',\'veda_release_type\',array(\'parent\'=>$bd[\'term_id\']));
    $this->insert_term(\'Region C\',\'veda_release_type\',array(\'parent\'=>$bd[\'term_id\']));
我遇到的问题是,即使这些术语输入到数据库中,它们也不会显示在分类页面上。最多会出现顶级术语。我必须尝试各种方法,直到它迫使WordPress认识到次级术语。有没有人遇到过这种情况,或者可以推荐一种更好的方法?

编辑:注意到了其他一些事情:我尝试从数据库中删除这些术语,然后停用并重新激活声明这些术语的插件。两个父术语显示在术语页面中,但子术语不显示。子术语确实会显示在要创建新术语的“父”下拉菜单中。当我添加一个其父项是子项之一的项并刷新页面时,子项就会显示出来。enter image description here

7 个回复
最合适的回答,由SO网友:scribu 整理而成

层次结构是缓存的,不会正确地失效。这是一个bug,自WP 3.1起仍未解决。

解决方法是delete_option("{$taxonomy}_children"); 直接地

请参阅\\u get\\u term\\u hierarchy()函数。

SO网友:BWDesign

我的2美分-我正在为WooCommerce插件构建一个扩展,该插件允许通过上传的CSV文件进行目录类别/产品管理。我在生成类别时遇到了同样的问题。清除缓存的商业类别的解决方案是调用delete_option("product_cat_children"); 在创建类别和子类别的循环之后。希望这对其他人有帮助!

SO网友:t31os

您可能正在从term_exists($term, $taxonomy, $parent) 如果调用时设置了分类法。它是在您发布的示例代码中设置的,所以我假设这就是问题所在。

inserts语句引用键时需要一个数组。。

例如:。

$bd[\'term_id\']
$dvd[\'term_id\']
。。但实际上你可能从term_exists.

确定这是否是问题所在的一种快速方法是更新此行。

return $result;
至。。

return is_object( $result ) ? (array) $result : $result;
如果我是对的,这就是问题所在,应该可以解决它,尽管我不认为这是一个优雅的解决方案。

希望这就是您所寻求的答案/帮助:)

SO网友:Manny Fleurmond

只是最后一次更新:这在WP 3.9中得到了修复:https://core.trac.wordpress.org/ticket/14485

SO网友:Steve

谢谢这个问题帮助很大。我正在努力进行单元测试,发现我必须

delete_option(\'veda_release_type\');
wp_cache_flush();
在添加我的顶级类别之后,然后在添加第二级类别之后再次执行此操作,以允许wordpress清除所有内容并通过单元测试。这解决了此处另一个答案中提到的“第二次页面加载/额外刷新”的需要。

SO网友:T.Todua

我的解决方案:

(可能需要清理缓存记录…)

$PARENT_CAT= wp_insert_term(\'Parent_category_NAME\',\'category\',  array(\'slug\'=> \'Parent_category_NAME\'));
delete_option("category_children");
wp_cache_flush();

    $child= wp_insert_term(\'children_category_NAME\',\'category\',array( \'slug\'=>\'children_category_NAME\', \'parent\' =>$PARENT_CAT[\'term_id\']));
    delete_option("category_children");
    wp_cache_flush();

SO网友:Dev

我在woocommerce product\\u cat taxonomy上遇到了同样的问题,我曾经通过rest API生成过类别,我尝试过以下解决方案,效果很好:)

add_action( \'admin_init\', \'updateTermChildren\' );
function updateTermChildren(){    
   _get_term_hierarchy(\'product_cat\');
}`

结束

相关推荐

以AutoFocus主题为灵感设计一个定制的Archive.php

我一直在尝试使用Autofocus theme 在不同的主题中,通过复制粘贴索引中的代码。php中的自动聚焦主题到我的新归档文件中。php文件。我还从函数中复制了相关函数。php从Autofocus开始,我还尝试将一些css转换到新主题。我已经尝试了很长一段时间,并多次调整,但我无法让它工作。我同时获得图像和文本,但与自动对焦主题中的样式不同,而且绝对不会在前屏幕上使用自动对焦的裁剪。我错过什么了吗?如果我把所有的功能都抄了,难道不行吗。将php导入到新的中并复制所有css?