Asignar automáticamente términos principales cuando se selecciona un término secundario

3

Tengo una taxonomía jerárquica profunda y quiero tener todo el término principal asignado cuando selecciono un término secundario. Lo necesito para la estructura de categorías en un sitio de listado / clasificado en línea.

Nombre de CPT: product

Nombre de taxonomía: product_cat

    
pregunta Sisir 25.05.2013 - 14:11

4 respuestas

10

Conexión a save_post .

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

Mientras que el bucle garantiza que subamos hasta que alcancemos los términos de nivel superior.

    
respondido por el Sisir 25.05.2013 - 14:11
4

El código tiene algunos errores como se indica anteriormente. Use el siguiente código para hacer que funcione también en el modo de edición rápida: ¿Cómo conectar la acción de edición rápida? (proporcionado por 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');
     }
  }
}
    
respondido por el Traveler 10.07.2014 - 13:26
2

¡Mejorado! Gracias @Sisir

Ahora, puede definir más de un tipo de publicación y término.

Puede definir los tipos de publicaciones permitidas en la matriz ($ arrayPostTypeAllowed) y los términos permitidos en la matriz ($ 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);
                }
            }
        }
    }
}
    
respondido por el Marcio Dias 17.07.2015 - 22:54
1

Las opciones sobre deberían funcionar, esta función funcionará para cualquier objeto siempre que se establezcan los términos, y usar set_object_terms le permite dejar que la acción maneje la jerarquía

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

    }

}

Esta esencia tendrá actualizaciones o parches si los agrego más tarde: enlace

    
respondido por el sMyles 19.08.2016 - 20:15

Lea otras preguntas en las etiquetas