私は深い階層的分類法を持っています、そして私は私が子供用語を選ぶとき割り当てられるすべての親用語を持ちたいです。オンラインリスティング/機密扱いのサイトのカテゴリ構成に必要です。
CPT名: product
分類名: product_cat
save_post
actionにフックする。
add_action('save_post', 'assign_parent_terms', 10, 2);
function assign_parent_terms($post_id, $post){
if($post->post_type != 'product')
return $post_id;
// get all assigned terms
$terms = wp_get_post_terms($post_id, 'product_cat' );
foreach($terms as $term){
while($term->parent != 0 && !has_term( $term->parent, 'product_cat', $post )){
// move upward until we get to 0 level terms
wp_set_post_terms($post_id, array($term->parent), 'product_cat', true);
$term = get_term($term->parent, 'product_cat');
}
}
}
Whileループは、トップレベルの用語にぶつかるまで確実に上方向に進むようにします。
上記のようにコードにはいくつかのバグがあります。クイック編集モードでも作業するには、次のコードを使用します。 クイック編集アクションにフックする方法? ( 提供者:Pieter Goosen )
add_action('save_post', 'assign_parent_terms');
function assign_parent_terms($post_id){
global $post;
if(isset($post) && $post->post_type != 'product')
return $post_id;
// get all assigned terms
$terms = wp_get_post_terms($post_id, 'product_cat' );
foreach($terms as $term){
while($term->parent != 0 && !has_term( $term->parent, 'product_cat', $post )){
// move upward until we get to 0 level terms
wp_set_object_terms($post_id, array($term->parent), 'product_cat', true);
$term = get_term($term->parent, 'product_cat');
}
}
}
改善しました! Thks @Sisir
これで、複数の投稿タイプと用語を定義できます。
許可投稿タイプを($ arrayPostTypeAllowed)配列に、許可用語を($ arrayTermsAllowed)配列に定義できます。
add_action('save_post', 'assign_parent_terms', 10, 2);
function assign_parent_terms($post_id, $post){
$arrayPostTypeAllowed = array('product');
$arrayTermsAllowed = array('product_cat');
//Check post type
if(!in_array($post->post_type, $arrayPostTypeAllowed)){
return $post_id;
}else{
// get all assigned terms
foreach($arrayTermsAllowed AS $t_name){
$terms = wp_get_post_terms($post_id, $t_name );
foreach($terms as $term){
while($term->parent != 0 && !has_term( $term->parent, $t_name, $post )){
// move upward until we get to 0 level terms
wp_set_post_terms($post_id, array($term->parent), $t_name, true);
$term = get_term($term->parent, $t_name);
}
}
}
}
}
shouldの上のオプションは動作します、この関数は項が設定される時はいつでもどんなオブジェクトに対しても動作します、そしてset_object_terms
を使うことはあなたがアクションハンドルが階層をさかのぼることを可能にします
add_action( 'set_object_terms', 'auto_set_parent_terms', 9999, 6 );
/**
* Automatically set/assign parent taxonomy terms to posts
*
* This function will automatically set parent taxonomy terms whenever terms are set on a post,
* with the option to configure specific post types, and/or taxonomies.
*
*
* @param int $object_id Object ID.
* @param array $terms An array of object terms.
* @param array $tt_ids An array of term taxonomy IDs.
* @param string $taxonomy Taxonomy slug.
* @param bool $append Whether to append new terms to the old terms.
* @param array $old_tt_ids Old array of term taxonomy IDs.
*/
function auto_set_parent_terms( $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids ) {
/**
* We only want to move forward if there are taxonomies to set
*/
if( empty( $tt_ids ) ) return FALSE;
/**
* Set specific post types to only set parents on. Set $post_types = FALSE to set parents for ALL post types.
*/
$post_types = array( 'product' );
if( $post_types !== FALSE && ! in_array( get_post_type( $object_id ), $post_types ) ) return FALSE;
/**
* Set specific post types to only set parents on. Set $post_types = FALSE to set parents for ALL post types.
*/
$tax_types = array( 'product_cat' );
if( $tax_types !== FALSE && ! in_array( get_post_type( $object_id ), $post_types ) ) return FALSE;
foreach( $tt_ids as $tt_id ) {
$parent = wp_get_term_taxonomy_parent_id( $tt_id, $taxonomy );
if( $parent ) {
wp_set_post_terms( $object_id, array($parent), $taxonomy, TRUE );
}
}
}
私が後でそれらを追加するならば、この要旨はどんなアップデートまたはパッチも持っているでしょう: https://Gist.github.com/tripflex/65dbffc4342cf7077e49d641462b46ad