it-swarm.com.de

Übergeordnete Begriffe automatisch zuweisen, wenn ein untergeordneter Begriff ausgewählt ist

Ich verfüge über eine tiefe hierarchische Taxonomie und möchte, dass alle übergeordneten Begriffe zugewiesen werden, wenn ich einen untergeordneten Begriff auswähle. Ich benötige es für die Kategoriestruktur einer Online-Auflistung/klassifizierten Site.

CPT-Name: product

Taxonomiename: product_cat

4
Sisir

Einhängen in 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-Schleife sorgt dafür, dass wir nach oben gehen, bis wir die obersten Terme erreichen.

12
Sisir

Der Code hat einige Fehler, wie oben angegeben. Verwenden Sie den folgenden Code, um auch im Schnellbearbeitungsmodus zu arbeiten: Wie kann man sich in die Schnellbearbeitungsaktion einhängen? (zur Verfügung gestellt von 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

Verbessert! Thks @Sisir

Jetzt können Sie mehr als einen Beitragstyp und einen Begriff definieren.

Sie können zulässige Beitragstypen im Array ($ arrayPostTypeAllowed) und zulässige Begriffe im Array ($ arrayTermsAllowed) definieren.

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

Die Optionen über soll funktionieren, diese Funktion funktioniert für jedes Objekt, wenn Begriffe festgelegt werden, und mit set_object_terms können Sie die Aktion die Hierarchie durchlaufen lassen

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 );
        }

    }

}

Diese Liste enthält Updates oder Patches, wenn ich sie später hinzufüge: https://Gist.github.com/tripflex/65dbffc4342cf7077e49d641462b46ad

1
sMyles