私はWPDBやSQL全般に慣れていませんが、自分のプロジェクト用のカスタムテーブルがあり、それにメタデータを割り当てようとしています。行が存在する場合は更新し、挿入されていない場合は実行します。 WPDB CodexでInsertとUpdateの両方を読んだことがありますが、どちらも実際には "どちらか"の状況にはなりませんでした。私はアップデートで作業できると思ったので、私のコードはこれまでのところ次のようになります。
$wpdb->update(
$wpdb->prepare(
$wpdb->prefix.'item_info',
array(
'post_id' => $post_id,
'item_stock' => $item_stock
),
array('post_id' => $post_id)
)
);
WordPressは "IF exists Update、ELSE Insert"のようなものを持っていますか、それともこれを達成するためにカスタムSQLを実行する必要がありますか。それを挿入する?
まず、prepare
を間違って使っています。 $wpdb->update
の引数を$wpdb->prepare
で囲んでいるようです。それはうまくいきません。実際には、update
に単一の引数、つまりprepare
の出力を渡しています。次のような単純なことを試してみてください。そうしないと、うまくいかないのがわかります。
$post_id = 123;
$item_stock = 567;
var_dump(
$wpdb->prepare(
$wpdb->prefix.'item_info',
array(
'post_id' => $post_id,
'item_stock' => $item_stock
),
array('post_id' => $post_id)
)
);
そして$wpdb->update()
はあなたのためにprepare
を実行します 。
次に、これが私の場合、ヘルパー関数bloatをスキップして適切なON DUPLICATE KEY UPDATE
クエリを作成します。
$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // debug
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // debug
$wpdb->query($sql);
これはpost_id
が UNIQUE
インデックスまたはPRIMARY KEY
であると仮定します。あなたのテーブル構造が私の考えであるものであれば、データベースにそれを処理させてください。
$wpdb->replace
を試しましたか。 WP Codexによると:
行が存在する場合はテーブル内の行を置き換えるか、行がまだ存在しない場合はテーブルに新しい行を挿入します。
私はいくつかのプラグインを試してみましたが、一意のIDの重複エラーなどを回避しようとするとうまくいきます。
行が最初に存在するかどうかを確認する必要があります。
ほとんどの場合、更新しようとしている行のIDまたは主キーを取得して、更新されている場合は$wpdb->update
、更新されていない場合は$wpdb->insert
を取得します。