在分层分类法中插入术语


17

我在插入字词方面确实遇到了一些问题。这是我的场景:我有一个名为veda_release_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);

这显然是荒唐的。顶层包含发行类型,例如DVD,蓝光。在该级别下的是区域,即。区域1,区域2等。因此,我想要的层次结构是:DVD –区域0 –区域1 –区域2 –区域3 –区域4 –区域5 –区域6 Blu-Ray- -区域A-区域B-区域C

我在类中创建了一个名为insert_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识别次级术语为止。有没有人遇到这个问题或可以推荐更好的方法?

编辑:注意其他事项:我试图从数据库中删除这些条款,然后停用并重新激活声明该条款的插件。两个父术语显示在术语页面中,但子术语则不显示。子条款确实显示在要创建新条款的“父母”下拉菜单中。当我添加一个其父代是子术语之一的术语并刷新页面时,将显示子术语。 在此处输入图片说明


在进行了一些研究之后,似乎可能需要对术语“缓存”做一些事情。不知道是否或如何能一致地清除缓存以更新缓存。
曼尼·弗勒蒙德

Answers:


25

层次结构已缓存,没有正确失效。这是一个错误,从WP 3.1开始至今尚未解决。

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

请参见_get_term_hierarchy()函数。


我感觉这是一个缓存问题。我应该在插入每个孩子之前还是之后插入它?
Manny Fleurmond

2
需要额外刷新,但是在插入所有子项之后放置delete_option代码可以解决问题。谢谢,抄写员。这完全值得我放弃代表代表。希望这对其他有类似问题的人
有所

谢谢!我刚刚花了4个小时。当我想到通过admin GUI添加术语前后对数据库进行比较的想法时,我看到了该选项,并且知道Google会怎么做。
Per Wiklander 2013年

6

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


2

term_exists($term, $taxonomy, $parent)如果在调用时设置了分类标准,则可能会从中收到一个对象。它设置在您发布的示例代码中,所以我假设这就是问题所在。

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

例如。

$bd['term_id']
$dvd['term_id']

..但是您实际上可能是从取回一个对象term_exists

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

return $result;

至..

return is_object( $result ) ? (array) $result : $result;

如果我是对的,那就是问题所在,那应该解决它,尽管我不会称其为优雅的解决方法。

希望这是您正在寻找的答案/帮助.. :)


这么晚才回复很抱歉。感谢您发现问题,但我认为这不能解决我遇到的问题。
Manny Fleurmond

1

谢谢。这个问题很有帮助。我在单元测试中苦苦挣扎,发现我必须做

delete_option('veda_release_type');
wp_cache_flush();

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


1

我的解决方案:

(也许需要清除缓存记录。)

$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();

请说明您的答案以及仅发布代码。
s_ha_dum

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.