###実現したいこと
update_post_meta
を一括でwp_postmeta
にINSERT
したいです。
###質問の背景
カスタムフィールドが1件の記事につき数十個あり、更新のパフォーマンスを懸念しています。
そこでupdate_post_meta
の
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (1, 'key1', 'one'); INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (2, 'key2', 'two'); INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (10, 'key10', 'ten');
のような処理を以下のように一括でできる関数を作ろうと考えました。
INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (1, 'key1', 'one'), (2, 'key2', 'two'), (10, 'key10', 'ten');
###該当のソースコード
一括で登録する関数はできたように思います。以下my_update_post_metas
です。
// 登録する値たち $post_id = 1; $update = ['color'=>'red','class'=>'low']; $result = my_update_post_metas( $post_id, $update ); var_dump( $result ); // 一括でpost_metaを登録 function my_update_post_metas( $post_id, $update ){ global $wpdb; $formats = ''; $values = []; foreach ( $update as $meta_key => $meta_value ) { $formats .= '('; $formats .= '%d, '; $formats .= '%s, '; $formats .= my_get_sql_format( $meta_value ); $formats .= '), '; $values[] = $post_id; $values[] = $meta_key; $values[] = $meta_value; } $formats = rtrim($formats,', '); $sql = $wpdb->query( $wpdb->prepare( " INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES $formats ", $values )); return $sql; } // %dや%sなどを取得 function my_get_sql_format( $v ){ $format; $type = gettype( $v ); if ( $type == 'string' ) { $format = '%s'; } elseif ( $type == 'integer' ) { $format = '%d'; } return $format; }
###発生している問題
問題となっているのは、「値があれば更新、なければ登録」という処理です。
普通のupdate_post_meta
には備わっている処理なので、今回のmy_update_post_metas
にも実装したいのです。
###試したこと
ON DUPLICATE KEY UPDATE
を以下# ここ
のように追加しました。しかしこれでは実現できませんでした。
function my_update_post_metas( $post_id, $update ){ /* 上と同じコードがこの部分に入るので省略 */ // 以下にON DUPLICATE KEY UPDATEを追加 $sql = $wpdb->query( $wpdb->prepare( " INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES $formats ON DUPLICATE KEY UPDATE meta_value = VALUES (meta_value); # ここ ", $values )); return $sql;
なぜできないのかわからないので、ひとまず簡易なものでON DUPLICATE KEY UPDATE
をを試してもみました。以下test
です。するとこちらはできました。
つまり3
があれば変更されました
と更新され、なければ登録されました。
test(); function test(){ global $wpdb; $sql = $wpdb->query( " INSERT INTO wp_posts (ID, post_author, post_content) VALUES (3,8,'変更されました') ON DUPLICATE KEY UPDATE post_content = VALUES (post_content); " ); }
結局my_update_post_metas
を簡易にしただけのtest
ができたのですが、それではどうやってmy_update_post_metas
を直せばいいのかわからないという状況です。
ご意見、ご回答をどうぞ宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。