web-dev-qa-db-ja.com

子用語が選択されたときに親用語を自動的に割り当たる

私は深い階層的分類法を持っています、そして私は私が子供用語を選ぶとき割り当てられるすべての親用語を持ちたいです。オンラインリスティング/機密扱いのサイトのカテゴリ構成に必要です。

CPT名: product

分類名: product_cat

4
Sisir

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ループは、トップレベルの用語にぶつかるまで確実に上方向に進むようにします。

12
Sisir

上記のようにコードにはいくつかのバグがあります。クイック編集モードでも作業するには、次のコードを使用します。 クイック編集アクションにフックする方法?提供者: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');
     }
  }
}
4
Traveler

改善しました! 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);
                }
            }
        }
    }
}
2
Marcio Dias

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

1
sMyles