Wie aktualisiert man Datensätze mit $ wpdb?

Ich migriere non-wp database zu WordPress (zum ersten Mal in meinem Leben und hoffentlich das letzte).

Da sowohl neue als auch alte Websites mehrsprachig sind, ist es eine meiner Aufgaben, die Artikel mit ihren Übersetzungen zu verbinden. Ich verwende das WPML-Plugin für die Unterstützung mehrerer Sprachen auf WordPress. Dieses Plugin erstellt eine Tabelle wp_icl_translations mit folgender Struktur:

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

trid ist die ID der ursprünglichen Beitrags-ID und alle Übersetzungen eines ursprünglichen Beitrags haben den gleichen Wert für das trid . Wenn der Post ein Original ist, ist trid dasselbe wie element_id was die Post-ID ist, und source_language_code ist NULL .

Ein paar Notizen zu den Posts, die ich habe:

  • Nicht alle Beiträge sind in alle Sprachen übersetzt (ich habe 8 Sprachen)
  • Es gibt Beiträge, die nur Originaleinträge in einer beliebigen Sprache haben

In der alten database hatten Beiträge item_id das für alle Übersetzungen eines Artikels gleich war. Als ich sie migrierte, fügte ich diese item_id als meta_value für jeden meta_value hinzu. Ich habe das gleiche für den Sprachcode getan, also war ich in der Lage, eine benutzerdefinierte Tabelle zu erstellen, in der ich eine Verbindung zwischen den Post-IDs der WordPress-database und item_ids und Sprachcodes der alten database hätte. Diese benutzerdefinierte Tabelle id_item_lid hat die folgende Struktur:

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

Kurz gesagt, ich muss die trid Spalte von wp_icl_translations mit den Post-IDs von Posts aktualisieren, die dieselbe item_id in der Tabelle item_id id_item_lid .

Hier ist die function, die ich mir ausgedacht habe:

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

Die Idee dahinter ist, die Aufzeichnungen der ersten Reihe zu nehmen und sie mit der nächsten zu vergleichen. Aber nichts passiert. Ich mache diese Art der databasemanipulation zum ersten Mal, also weiß ich nicht, wo ich mit dem Debuggen anfangen soll.

Jede Hilfe und Richtung wird sehr geschätzt.

Wenn Sie weitere Informationen benötigen, zögern Sie nicht zu fragen.

Vielen Dank!

Solutions Collecting From Web of "Wie aktualisiert man Datensätze mit $ wpdb?"

Logik meiner function war alles falsch, sollte das Ergebnis in $trans_array vor der foreach-Schleife sortiert haben.

Hier ist der aktualisierte Code, der funktioniert, wenn jemand es benötigt:

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

Dies ist ein bisschen eine schmutzige Lösung, wenn das Debuggen wahr ist, gibt es einige Warnungen im Admin bezüglich der ursprünglichen Post-Sprache, wenn es fehlt, könnte vielleicht ein bisschen mehr verfeinert werden, aber ich konnte nicht belästigt werden.