web-dev-qa-db-ja.com

階層分類法に用語を挿入する

用語の挿入に関していくつか問題があります。これが私のシナリオです。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、ブルーレイが含まれています。その下のレベルは地域すなわちです。 DVDリージョン1、リージョン2、リージョン2、リージョン3、リージョン2、リージョン2など。 - 地域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に下位レベルの用語を認識させるまで、さまざまなことを試す必要があります。誰かがこれに遭遇したり、より良い方法をお勧めすることができますか?

編集:何か他のものに気づいた:私はデータベースから用語を削除してから、用語を宣言するプラグインを無効にしてから再度有効にしてみた。 2つの親用語が用語ページに表示されますが、子用語は表示されません。子用語は、新しい用語を作成したい「親」ドロップダウンメニューに表示されます。親が子用語の1つである用語を追加してページを更新すると、子用語が表示されます。 enter image description here

17
Manny Fleurmond

階層はキャッシュされており、正しく無効化されていません。これはバグです。WP 3.1の時点では未解決です。

回避策はdelete_option("{$taxonomy}_children");を直接呼び出すことです。

_get_term_hierarchy()関数を参照してください。

25
scribu

私の2セント - 私はアップロードされたCSVファイルを介してカタログカテゴリ/製品管理を可能にするWooCommerceプラグインのための拡張を構築しています。カテゴリを生成するときにも、同じ問題に遭遇しました。キャッシュされたWooCommerceのカテゴリをクリアするための解決策は、カテゴリとサブカテゴリを作成するループの後にdelete_option("product_cat_children");を呼び出すことでした。これが他の誰かに役立つことを願っています!

6
BWDesign

呼び出されたときに分類法が設定されている場合は、おそらくterm_exists($term, $taxonomy, $parent)からオブジェクトを受け取ることができます。それはあなたが投稿したサンプルコードで設定されているので、私はそれが問題だと思います。

あなたのインサートステートメントは、それらがキーを参照するときに配列を期待しています..

例えば。

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

..しかし実際にはterm_existsからオブジェクトを取り戻しているかもしれません。

それが問題かどうかを判断する簡単な方法は、この行を更新することです。

return $result;

に..

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

私が正しいとそれが問題であれば、それはそれを修正する必要があります、私はそれをエレガントな修正とは呼ばないでしょう。

うまくいけば、それはあなたが探していた答え/助けです.. :)

2
t31os

私の解決策:

(多分それはキャッシュレコードをきれいにするのに必要でした..)

$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();
1
T.Todua

ありがとう。この質問は大いに役に立ちました。私は単体テストに苦労していて、やらなければならないことに気づきました

delete_option('veda_release_type');
wp_cache_flush();

トップレベルのカテゴリを追加した後、2番目のレベルのカテゴリを追加した後にもう一度実行して、ワードプレスですべてをクリアし、ユニットテストに合格するようにします。これは、別の回答で参照されている「2ページ目の読み込み/追加の更新」の必要性を回避するためのものです。

1
Steve

ほんの最後の更新:これはWP 3.9に戻るまでのすべての方法で修正されました: https://core.trac.wordpress.org/ticket/14485

0
Manny Fleurmond