カスタム投稿タイプを削除した後に、孤立した投稿を削除するためのコードです。
それは動作しますが、このコードは...
global $wpdb;
$wpdb->query(
$wpdb->prepare(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type='attorneys'"
)
);
...このエラーが発生しています。
PHPに関するお知らせ:wpdb :: prepareは と誤って と呼ばれていました。 wpdb :: prepare()の照会引数にはプレースホルダーが必要です。
それで、Andrew Nacinによるmake.wordpress.orgの 説明 を読んだ後、私(sorta)はそれを集める...私には2番目の議論が欠けている。
それなら このスタックポスト を読んだ後、prepare()
関数さえ必要なのかと疑問に思います。 未知の値を保持している変数はありますか 私はこれについてはっきりしていません。
...何が足りないの?
更新:このコードも動作しますが、prepare()なしで安全ですか。
global $wpdb;
$wpdb->query(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type='attorneys'"
);
お知らせ下さい。
ユーザーから入力を受け取るときは、常に$wpdb->prepare
を使用することをお勧めします。これはSQLインジェクションに対してクエリを保護するのに役立ちます。詳細については、 Codex を確認してください。
$wpdb->prepare
を使用するときは、変数をクエリに渡す必要があります。あなたのケースでは、ハードコードされた値を使っているので$wpdb->prepare
の使用をスキップすることができます。しかし、変数に関して同じ値がある場合は、以下のように変更する必要があります。
$post_type = 'attorneys';
$wpdb->query(
$wpdb->prepare(
"DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
WHERE a.post_type=%s",
$post_type
)
);