我有这个代码来删除自定义帖子类型后的孤立帖子。
这是可行的,但这个代码。。。
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::prepareincorrectly. wpdb::prepare()的查询参数必须有占位符。
所以,在阅读之后the explanation 正在制作。wordpress。Andrew Nacin,我(sorta)推测。。。好我错过了第二个论点。
然后在阅读之后this stack post, 我想知道我是否需要prepare()
作用Are there 是否有包含未知值的变量?我不清楚。
。。。我错过了什么?
更新:这段代码也可以工作,但不带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\'"
);
请告知。
最合适的回答,由SO网友:Chittaranjan 整理而成
通常建议使用$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
)
);