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


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、blu-rayなどのリリースタイプが含まれます。その下のレベルは地域です。リージョン1、リージョン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つである用語を追加してページを更新すると、子用語が表示されます。 ここに画像の説明を入力してください


いくつかの調査を行った後、用語キャッシュを使用して何かを行う必要があるようです。キャッシュを更新するために一貫してキャッシュをクリアできるかどうか、またはどのようにキャッシュをクリアできるかわかりません。
マニーフルーモンド

回答:


25

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

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

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


キャッシュの問題だと感じました。各子を挿入する前または後にこれを挿入する必要がありますか?
マニーフルーモンド

2
余分な更新を行いますが、すべての子用語を挿入した後にdelete_optionコードを配置するとうまくいきます。ありがとう、スクライブ。これは、あきらめた担当者ポイントに値するものでした。うまくいけば、これは同様の問題に他人を助け
マニーFleurmond

ありがとう!私はこれに4時間を費やしました。admin GUIを介して用語を追加する前後にdbの差分を作成するというアイデアにたどり着くとすぐに、オプションが表示され、Googleに何が来るかがわかりました。
ヴィクランダーあたり

6

私の2セント-アップロードされたCSVファイルを介してカタログカテゴリ/製品管理を可能にするWooCommerceプラグインの拡張機能を構築しています。カテゴリを生成するときにこの同じ問題に遭遇しました。キャッシュされた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;

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

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


返事が遅れて申し訳ありません。それをキャッチしていただきありがとうございますが、私が持っていた問題を解決したとは思わない。
マニーフルーモンド

1

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

delete_option('veda_release_type');
wp_cache_flush();

トップレベルのカテゴリを追加した後、第2レベルのカテゴリを追加してから再度実行し、wordpressがすべてをクリアして単体テストに合格できるようにします。これは、別の回答で言及されている「2番目のページの読み込み/追加の更新」の必要性を回避します。


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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.