質問

カスタム投稿タイプを削除した後に孤立した投稿を削除するためのこのコードを持っています。

それは動作しますが、このコード...

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()のquery引数にはプレースホルダが必要です。

だから、 Make.wordpress.orgの説明 Andrew Nacin、I(sorta)を集める...ええ。。

読んだ後、このスタックPOST prepare()関数が必要な場合は疑問に思います。 未知の値を保持している任意の変数はありますか?私はこれではっきりしていません。

...私は何が足りないのですか?

アップデート:このコードは機能しますが、w / o 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
     )
);
.

ライセンス: CC-BY-SA帰属
所属していません wordpress.stackexchange
scroll top