質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

2579閲覧

WordPress「update_post_meta」を爆速にカスタム

marusankakun

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/02/10 12:08

###実現したいこと
update_post_metaを一括でwp_postmetaINSERTしたいです。

###質問の背景
カスタムフィールドが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を直せばいいのかわからないという状況です。

ご意見、ご回答をどうぞ宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ON DUPLICATE KEY UPDATE はその名前の通り、テーブルに対してキーが同じである必要があります。(主キーまたはユニークインデックス)

wp_postmeta の主キーはmeta_idであり、post_idmeta_keyでユニークになるのかもしれませんが、ユニークインデックスは存在しません。そのためmeta_idを指定しないON DUPLICATE KEY UPDATEはエラーになるかと思います。

SQLでやるとするなら

  • DELETEしてINSERTする
  • 一度SELECTして、INSERTとUPDATEを分ける

あたりでしょうか。

私なら大量にデータがありそうであれば、post_id / meta_keyは1つにして、meta_valueの中身を配列にします。

投稿2020/02/10 14:45

Eggpan

総合スコア2665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問