web-dev-qa-db-fra.com

Mise à jour de la valeur taxonomique du type de message dans la requête

J'ai une situation où j'ai environ 5000 enregistrements importés dans un type de message personnalisé (voyage) avec une catégorie de taxonomie (pays). Étant donné que j'importe depuis plusieurs endroits et que chaque source semble utiliser une description différente pour certains pays, je souhaite mettre à jour le terme référence de cet article en une description uniforme.

Donc, disons que la taxonomie 'pays' a, entre autres, ces valeurs:


+---------+-------------+
| term_id | name        |
+---------+-------------+
|  1248   | Zuid Afrika |
+---------+-------------+
|  3845   | zuid-afrika |
+---------+-------------+

Je souhaite mettre à jour le terme référence à "pays" qui comporte un duplicata dans chaque message "voyage" vers un nouvel identifiant défini.


$terms = array(
    '3845' => '1248'
);
$args = array(
    'posts_per_page'    => -1,
    'post_type'         => 'travel',
    'post_status'       => 'publish'
);
global $post;
$my_query = new WP_Query($args);
if($my_query->have_posts()){
    while ($my_query->have_posts()) : $my_query->the_post();
        /*
            This is the part where i get lost, what i want is something like this, but this doesn't work
        */
        if(in_array($post->term_id,$terms){
            update term reference with value $terms[$post->term_id];
        }
    }
    endwhile;
    wp_reset_query();
}

Toute aide serait vraiment appréciée parce que je suis à peu près bloquée en ce moment

Modifier: Je ne souhaite pas supprimer les catégories de taxonomie, car ces scripts seront exécutés après les importations. Par conséquent, si les doublons sont supprimés, ils seront importés immédiatement, mais avec un identifiant de terme différent.

2
Maurice

Malheureusement, la solution de webtoure ne fonctionnant pas, j'ai décidé de plonger dans la structure de la base de données de Wordpress et de proposer le code de travail suivant:


global $wpdb;
$taxonomy = 'country';
$environment = 0;

function _get_term_taxonomy_id($term_id){
    global $wpdb;
    $results = $wpdb->get_results("
        SELECT tt.term_taxonomy_id
        FROM wp_term_taxonomy AS tt
        LEFT JOIN wp_terms AS t ON t.term_id = tt.term_id
        WHERE t.term_id = '$term_id'
    ");
    foreach($results as $result){
        return $result->term_taxonomy_id;
    }
}

/* MERGE */
foreach($merge_map as $from => $to){
    $from_id = _get_term_taxonomy_id($from);
    $to_id = _get_term_taxonomy_id($to);
    if($environment == 1){
        $wpdb->update( 
            'wp_term_relationships', 
            array( 
                'term_taxonomy_id' => $to_id
            ), 
            array( 'term_taxonomy_id' => $from_id )
        );
        echo 'UPDATE '.$from_id.' with '.$to_id.' DONE
';
    }
}

/* UPDATE PARENT */
foreach($parent_map as $term_id => $parent_id){
    if($environment == 1){
        $wpdb->update( 
            'wp_term_taxonomy', 
            array( 
                'parent' => $parent_id
            ), 
            array( 'term_id' => $term_id )
        );
        echo 'UPDATE parent of '.$term_id.' with '.$parent_id.' DONE
';
    }
}
0
Maurice

Il y a pas mal de choses à faire ici et, avec le chiffre de 5 000 posts que vous mentionnez, ce sera une tâche coûteuse de le faire via WordPress lui-même. Cependant, voici ce que j’ai trouvé ( Je n’ai pas testé cela, vous voudrez peut-être l’utiliser d’abord sur une sauvegarde et voir si cela fonctionne ):

global $wpdb;

/* The ( 'from_term_id', 'to_term_id' ) map. */
$terms_map = array(
    '3845' => '1248',
    /* ... The rest of your mapping */
);

$taxonomy = 'country';
$obj_terms = wp_get_object_terms( $post->ID, $taxonomy );

/* Loop through each object term */
foreach ( $obj_terms as $term ) {
    /* See if the obj term_id is a key in $terms_map */
    if ( isset( $terms_map[$term->term_id] ) ) {
        /* We have a valid key. We now need the term_taxonomy_ids */
        /* for both 'from_term_id' and 'to_term_id' */
        $to_term = get_term( $terms_map[$term->term_id], $taxonomy );

        $from_term_tax_id = $term->term_taxonomy_id;
        $to_term_tax_id = $to_term->term_taxonomy_id;

        /* Update the '{prefix}_term_relationships' table */
        $update_res = $wpdb->update( 
            $wpdb->term_relationships, /* The table to update */
            array( 'term_taxonomy_id' => $to_term_tax_id ), /* Data to be updated */
            array( 'object_id' => $post->ID, 'term_taxonomy_id' => $from_term_tax_id ), /* Where clause */
            array( '%d' ), /* Format of the data is int */
            array( '%d', '%d' ) /* Format of the where clause is int */
        );

        /* Finally, you may wish to update the term count for each term */
        wp_update_term_count( array( $from_term_tax_id, $to_term_tax_id ), $taxonomy );
    }
}

Comme je l'ai déjà mentionné, cela risque de s'avérer trop coûteux. Dans ce cas, vous devrez écrire un script séparé PHP et travailler directement sur la base de données.

1
webtoure

Si je comprends bien votre besoin, le moyen le moins pénible de le faire consiste à utiliser le plugin Term Management Tools . Vous pouvez réorganiser vos termes dans l'interface d'administration une fois importés.

EDIT: il s'avère que je n'ai pas bien compris vos exigences :)

0
vancoder