私はプラグインを作成していて、テーブル上のMySQL Triggerの作成を自動化したいです。問題は$ wpdb-> queryがマルチパートステートメントやフォーマットされたクエリを受け付けないように見えることです。
PhpMyAdminで次のクエリを印刷して実行すると成功を返します。また、1行でクエリをすべてフォーマットしても成功を報告することに気付きましたが、この場合はトリガーは作成されません。
$wpdb->query(
"DELIMITER //
DROP TRIGGER IF EXISTS {$wpdb->get_blog_prefix($site->id)}post_queue_insert//
CREATE TRIGGER {$wpdb->get_blog_prefix($site->id)}queue_insert BEFORE INSERT ON {$wpdb->get_blog_prefix($site->id)}posts
FOR EACH ROW BEGIN
INSERT INTO {$wpdb->base_prefix}post_queue (action_id, action_type, action_status, action_timestamp, sync_complete, SITE_ID) VALUES (NEW.ID, NEW.post_type, NEW.post_status, UNIX_TIMESTAMP(now()), 0, {$site->id});
END//
DELIMITER ;"
);
使用できる他の機能、またはクエリを正常に実行するための形式を設定する別の方法はありますか?
多くの試行錯誤の末、ついにmysqliを使った解決策を考え出しました。クエリはプラグインの更新時にのみ実行されるため、私はそれを許容できる解決策と考えています。
$mysqli = new mysqli();
$mysqli->connect(DB_Host, DB_USER, DB_PASSWORD, DB_NAME);
$sql = "
DROP TRIGGER IF EXISTS {$wpdb->get_blog_prefix($site->id)}post_queue_insert;
CREATE TRIGGER {$wpdb->get_blog_prefix($site->id)}post_queue_insert BEFORE INSERT ON {$wpdb->get_blog_prefix($site->id)}posts
FOR EACH ROW BEGIN
INSERT INTO {$wpdb->base_prefix}post_queue (action_id, action_type, action_status, action_event, action_timestamp, sync_complete, SITE_ID) VALUES (NEW.ID, NEW.post_type, NEW.post_status, 'insert', UNIX_TIMESTAMP(now()), 0, {$site->id});
END;
";
$mysqli->multi_query($sql);
$mysqli->close();