Tout le monde a des solutions pour cela ...
Je construis une application dans laquelle j'ai deux taxomanies coutumières héritières agissant en tant que catégories personnalisées. Donc, j'ai la taxonomie cat1 et cat2.
Ce que je veux faire, c'est copier un terme avec ses enfants de cat1 à cat2. Peut-être quelque chose comme:
set_term_taxonomy($term_id, array("cat1, "cat2"));
où le même terme, avec ses enfants, pourrait être dans plus d'une taxonomie. La raison de 2 taxonomies est qu’il s’agit de 2 inventaires différents.
A dû écrire une méthode pour le faire. Voici la méthode ... espérons que cela aidera quelqu'un d'autre;)
syntaxe:
copy_terms($term->term_id, "taxonomy1", "taxonomy2", 0); //will copy to root of destination
/**
* Copy a term and its descendants from one taxonomy to another.
* Both taxonomies have to be hierarchical. Will copy across
* posts as well.
*
* @param int $term the term id to copy
* @param string $from the taxonomy of the original term
* @param string $to the destination for the taxonomy
* @param int $parent the parent term_id to add the taxonomy to
* @return type true|WP_Error
*/
function copy_terms($term, $from, $to, $parent=0) {
//check for child terms
$term = get_term($term, $from);
$child_terms = get_terms($from, array(
'hide_empty' => false,
'parent' => $term->term_id
));
//check for child products
$child_prods = new WP_Query(array(
'tax_query' => array(
array(
'taxonomy' => $from,
'terms' => $term->term_id
)
)
));
//work out new slug
if($parent==0) $slug = $to."-".sanitize_title($term->name);
else{
$parent_term = get_term($parent, $to);
$slug = $parent_term->slug."-".sanitize_title($term->name);
}
//add term to new taxonomy
$parent = wp_insert_term($term->name, $to, array(
'description' => $term->description,
'parent' => $parent,
'slug' => $slug
));
if(is_wp_error($parent)) return $parent;
$parent = get_term($parent['term_id'], $to);
if(is_wp_error($parent)) return $parent;
//loop through folders first
foreach($child_terms as $child){
copy_terms($child->term_id, $from, $to, $parent->term_id);
}
//loop through products
foreach($child_prods->posts as $child){
wp_set_post_terms($child->ID, $parent->term_id, $to, true);
}
return true;