我有这个代码可以在删除自定义帖子类型后删除孤立的帖子。

它有效,但是这段代码...

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 上,我(有点)认为……嗯……我错过了第二个论点。

然后读完之后 这个堆栈帖子, ,我想知道我是否需要 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 注入。欲了解更多详情,请查看 法典

当你使用 $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归因
scroll top