J'ai une taxonomie hiérarchique profonde et je souhaite que tous les termes parents soient attribués lorsque je sélectionne un terme enfant. J'en ai besoin pour la structure des catégories sur une liste en ligne/site classé.
Nom du CPT: product
Nom de la taxonomie: product_cat
Accrocher dans 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');
}
}
}
La boucle While garantit que nous allons vers le haut jusqu'à ce que nous atteignions les conditions de premier niveau.
Le code a quelques bugs comme prévu ci-dessus. Utilisez le code suivant pour travailler également dans le mode d’édition rapide: Comment se connecter à l’action de modification rapide? (fourni par 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');
}
}
}
Amélioré! Thks @Sisir
Maintenant, vous pouvez définir plusieurs types et termes de publication.
Vous pouvez définir les types de publication autorisés dans le tableau ($ arrayPostTypeAllowed) et les termes autorisés dans le tableau ($ 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);
}
}
}
}
}
Les options ci-dessus devraient fonctionnent, cette fonction fonctionnera pour tous les objets chaque fois que les termes seront définis, et utiliser set_object_terms
vous permettra de laisser l’action gérer en haut de la hiérarchie.
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 );
}
}
}
Ce Gist aura des mises à jour ou des correctifs si je les ajoute ultérieurement: https://Gist.github.com/tripflex/65dbffc4342cf7077e49d641462b46ad