web-dev-qa-db-ja.com

$ wpdbを使ってレコードを更新するにはどうすればいいですか?

私は非wpデータベースをWordpressに移行しています(私の人生で初めて、そしてうまくいけば最後)。

新旧両方のWebサイトは多言語対応なので、私にとっての作業の1つは、記事とその翻訳を関連付けることです。私はWordPressの多言語サポートにWPMLプラグインを使用しています。このプラグインは、以下の構造を持つテーブルwp_icl_translationsを作成します。

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

tridはオリジナルの投稿IDのIDで、1つのオリジナルの投稿のすべての翻訳はtridに対して同じ値を持ちます。投稿がオリジナルの場合、tridは投稿IDであるelement_idと同じで、source_language_codeNULLです。

私が持っている記事に関するメモのカップル:

  • すべての投稿がすべての言語に翻訳されているわけではありません(8つの言語があります)。
  • 任意の言語の元のエントリのみを持つ投稿があります

古いデータベースでは投稿はitem_idを持っていましたが、これは1つの記事のすべての翻訳で同じです。私がそれらを移行したとき、私はそれぞれの投稿に対してitem_idmeta_valueとして追加しました。私は言語コードについても同じことをしたので、私はワードプレスデータベースのitem idと古いデータベースのitem_idsと言語コードの間の関係を持つことになるカスタムテーブルを作成することができました。このカスタムテーブルid_item_lidは、次のような構造になっています。

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

要するに私はwp_icl_translationstrid列をitem_idテーブルの同じid_item_lidを共有する投稿の投稿IDで更新する必要があります。

これが私が思いついた機能です。

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

その背後にあるアイデアは、最初の行のレコードを取得し、それを次のレコードと比較することです。しかし、何も起こりません。私は初めてこの種のデータベース操作をしているので、どこからデバッグを始めたらいいのかわかりません。

任意の助けと方向は高く評価されています。

あなたがより多くの情報を必要とするならば、尋ねることを躊躇しないでください。

ありがとうございます。

2

私の関数の論理はすべて間違っていました、foreachループの前に$trans_arrayで結果をソートするべきでした。

誰かがそれを必要とするならば、これはうまくいった更新されたコードです:

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

これはちょっと汚い解決策です、デバッグが本当であるとき、それが抜けているならば、おそらくもう少し洗練されることができる、オリジナルのポスト言語に関連した管理者の中にいくつかの警告があります、しかし私は悩まされることができませんでした。

1