私は非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_code
はNULL
です。
私が持っている記事に関するメモのカップル:
古いデータベースでは投稿はitem_id
を持っていましたが、これは1つの記事のすべての翻訳で同じです。私がそれらを移行したとき、私はそれぞれの投稿に対してitem_id
をmeta_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_translations
のtrid
列を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');
その背後にあるアイデアは、最初の行のレコードを取得し、それを次のレコードと比較することです。しかし、何も起こりません。私は初めてこの種のデータベース操作をしているので、どこからデバッグを始めたらいいのかわかりません。
任意の助けと方向は高く評価されています。
あなたがより多くの情報を必要とするならば、尋ねることを躊躇しないでください。
ありがとうございます。
私の関数の論理はすべて間違っていました、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'));
}
}
}
これはちょっと汚い解決策です、デバッグが本当であるとき、それが抜けているならば、おそらくもう少し洗練されることができる、オリジナルのポスト言語に関連した管理者の中にいくつかの警告があります、しかし私は悩まされることができませんでした。