用語の挿入に関していくつか問題があります。これが私のシナリオです。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つである用語を追加してページを更新すると、子用語が表示されます。
階層はキャッシュされており、正しく無効化されていません。これはバグです。WP 3.1の時点では未解決です。
回避策はdelete_option("{$taxonomy}_children");
を直接呼び出すことです。
_get_term_hierarchy()関数を参照してください。
私の2セント - 私はアップロードされたCSVファイルを介してカタログカテゴリ/製品管理を可能にするWooCommerceプラグインのための拡張を構築しています。カテゴリを生成するときにも、同じ問題に遭遇しました。キャッシュされたWooCommerceのカテゴリをクリアするための解決策は、カテゴリとサブカテゴリを作成するループの後にdelete_option("product_cat_children");
を呼び出すことでした。これが他の誰かに役立つことを願っています!
呼び出されたときに分類法が設定されている場合は、おそらくterm_exists($term, $taxonomy, $parent)
からオブジェクトを受け取ることができます。それはあなたが投稿したサンプルコードで設定されているので、私はそれが問題だと思います。
あなたのインサートステートメントは、それらがキーを参照するときに配列を期待しています..
例えば。
$bd['term_id']
$dvd['term_id']
..しかし実際にはterm_exists
からオブジェクトを取り戻しているかもしれません。
それが問題かどうかを判断する簡単な方法は、この行を更新することです。
return $result;
に..
return is_object( $result ) ? (array) $result : $result;
私が正しいとそれが問題であれば、それはそれを修正する必要があります、私はそれをエレガントな修正とは呼ばないでしょう。
うまくいけば、それはあなたが探していた答え/助けです.. :)
(多分それはキャッシュレコードをきれいにするのに必要でした..)
$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();
ありがとう。この質問は大いに役に立ちました。私は単体テストに苦労していて、やらなければならないことに気づきました
delete_option('veda_release_type');
wp_cache_flush();
トップレベルのカテゴリを追加した後、2番目のレベルのカテゴリを追加した後にもう一度実行して、ワードプレスですべてをクリアし、ユニットテストに合格するようにします。これは、別の回答で参照されている「2ページ目の読み込み/追加の更新」の必要性を回避するためのものです。
ほんの最後の更新:これはWP 3.9に戻るまでのすべての方法で修正されました: https://core.trac.wordpress.org/ticket/14485