web-dev-qa-db-fra.com

Comment mettre à jour des enregistrements en utilisant $ wpdb?

Je migre la base de données non-wp vers Wordpress (pour la première fois de ma vie et, espérons-le, la dernière).

Étant donné que les nouveaux et les anciens sites Web sont multilingues, l’une des tâches qui me sont confiées est de relier les articles à leurs traductions. J'utilise le plugin WPML pour le support multilingue sur Wordpress. Ce plugin crée une table, wp_icl_translations avec la structure suivante:

element_id | trid       | language_code           | source_language_code
---------------------------------------------------------------------------
(post id)  | (group id) | (of the translated post)| (of the original post)

trid est l'identifiant de l'identifiant de la publication d'origine et toutes les traductions d'une publication d'origine ont la même valeur pour la trid. Si la publication est originale, trid est identique à element_id, qui est l'identifiant de la publication, et source_language_code est NULL.

Quelques notes sur les articles que j'ai:

  • Tous les articles ne sont pas traduits dans toutes les langues (j'ai 8 langues)
  • Il y a des publications qui ont seulement des entrées originales dans n'importe quelle langue

Dans l'ancienne base de données, les articles avaient item_id qui était identique pour toutes les traductions d'un article. Lorsque je les ai migrés, j'ai ajouté ce item_id en tant que meta_value pour chaque publication. J'ai fait la même chose pour le code de langue, ce qui m'a permis de créer un tableau personnalisé dans lequel je pouvais établir une connexion entre les identifiants de publication de la base de données wordpress et item_ids et les codes de langue de l'ancienne base de données. Cette table personnalisée, id_item_lid, a la structure suivante:

id                           | item_id                     | lid
---------------------------------------------------------------------------
post id assigned by wordress | old item_id                 | language code
                             | (translations share this id)|

En bref, je dois mettre à jour la colonne trid de wp_icl_translations avec les identifiants des publications qui partagent le même item_id dans la table id_item_lid.

Voici la fonction que je suis venu avec:

function rkm_translation_update() {
global $wpdb;
$trans_row = $wpdb->get_row("SELECT * FROM id_item_lid", OBJECT, 0);
$id = $trans_row->id;
$item = $trans_row->item_id;
$lid = $trans_row->lid;

$trans_array = $wpdb->get_results("SELECT * FROM id_item_lid");
foreach ($trans_array as $trans) {
    $id_new = $trans->id;
    $item_new = $trans->item_id;
    $lid_new = $trans->lid;
    if ($item === $item_new) {
        $wpdb->update('wp_icl_translations', array('trid' => $id, 'source_language_code' => $lid), array('element_id' => $id_new));
    } else {
        $id = $trans->id;
        $item = $trans->item_id;
        $lid = $trans->lid;
    }
}
}

add_action( 'init', 'rkm_translation_update');

L’idée derrière cela est de prendre les enregistrements de la première rangée et de les comparer à la suivante. Mais rien ne se passe. Je fais ce genre de manipulation de base de données pour la première fois, donc je ne sais pas par où commencer avec le débogage.

Toute aide et direction est très appréciée.

Si vous avez besoin de plus d'informations, n'hésitez pas à demander.

Merci!

2

La logique de ma fonction était complètement fausse. Vous devriez avoir trié le résultat dans $trans_array avant la boucle foreach.

Voici le code mis à jour qui a fonctionné, si quelqu'un en a besoin:

function rkm_translation_update() {
    global $wpdb;
    $trans_row = $wpdb->get_row("SELECT * FROM id_item_lid", OBJECT, 0);
    $id = $trans_row->id;
    $item = $trans_row->item_id;
    $lid = $trans_row->lid;

    $trans_array = $wpdb->get_results("SELECT * FROM id_item_lid ORDER BY item_id");
    foreach ($trans_array as $trans) {
        $id_new = $trans->id;
        $item_new = $trans->item_id;
        $lid_new = $trans->lid;
        if ($item === $item_new) {
            $wpdb->update('wp_icl_translations', array('trid' => $id, 'source_language_code' => $lid), array('element_id' => $id_new, 'element_type' => 'post_post'));
        } else {
             $id = $trans->id;
             $item = $trans->item_id;
             $lid = $trans->lid;
             $wpdb->update('wp_icl_translations', array('trid' => $id, 'source_language_code' => $lid), array('element_id' => $id, 'element_type' => 'post_post'));
        }
    }
}

Ceci est un peu une solution sale, quand le débogage est vrai, il y a quelques avertissements dans l'administrateur liés à la langue de publication originale, si elle est manquante, pourrait probablement être affinée un peu plus, mais je ne pouvais pas être dérangé.

1
Bojana Šekeljić