我需要对wordpress插件进行查询,但我无法通过自己解决这个问题。我希望按类别ID限制帖子,如果没有给出任何类别,则显示所有帖子。我的sql是:
$sql = "
SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.post_content, $wpdb->posts.post_excerpt, $wpdb->posts.post_name
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships ON
($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON
($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'product'
AND $wpdb->term_taxonomy.taxonomy = 'product_cat'".
if(!empty($_GET["category"])) {
"AND $wpdb->term_taxonomy.term_id = '".htmlspecialchars($_GET["category"])."'".
}
"ORDER BY post_date DESC";
正如您所理解的那样,我正在尝试通过网址获取类别ID,例如& category = 12 ,但那会给我一个空白页面(没有错误或类似内容)你们可以帮助我吗?是什么?
答案 0 :(得分:3)
您无法将语句连接到 表达式 。您只能连接表达式,因此您必须使用三元组:
"AND $wpdb->term_taxonomy.taxonomy = 'product_cat'".
(!empty($_GET['category']) ?
"AND $wpdb->term_taxonomy.term_id = '". htmlspecialchars($_GET["category"]) . "'" : '')
. "rest of query";
但实际上,这不是查询数据库的方式(它非常不安全......老实说)和它很乱,而且难以维护,和您未在isset
参数上查看$_GET
。
基本上,所有可以(也可能应该)包含分号的内容都是声明:
$foo = "bar";//statement
这个简单的赋值语句包含几个表达式,其中"bar"
是一个。这个陈述恰好也是一个表达,但这不是重点。关键在于:
if ($condition)
{
//STATEMENT(S)
}
不 表达式,因此无法将其合并到单个语句中(就像您的情况一样,将查询字符串赋值给a变量名为$sql
)。
<强> 警告 强>
正如其他人所指出的那样,您的查询是vulnerable to injection。 WP允许你使用prepared statements,你真的应该这样做:
$id = $_POST['some_value'];//check isset first, of course
$wpdb->query(
$wpdb->prepare(
'SELECT foo FROM bar WHERE id = %d',
$id
)
);
答案 1 :(得分:1)
你不能把一个if放在一个字符串的中间。您可以使用连接赋值运算符添加到$sql
变量。
$sql = "SELECT $wpdb->posts.ID, $wpdb->posts.post_title, $wpdb->posts.post_content, $wpdb->posts.post_excerpt, $wpdb->posts.post_name
FROM $wpdb->posts
LEFT JOIN $wpdb->term_relationships ON
($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON
($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
WHERE $wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_type = 'product'
AND $wpdb->term_taxonomy.taxonomy = 'product_cat'";
if(!empty($_GET["category"])) {
$sql .= " AND $wpdb->term_taxonomy.term_id = '".htmlspecialchars($_GET["category"], ENT_QUOTES)."'";
}
$sql .= " ORDER BY post_date DESC";
我还在htmlspecialchars()中添加了ENT_QUOTES
标志,将单引号转换为'
。这样可以增加对注入的保护,不允许人们输入单引号并注入自己的查询。
准备好的陈述
看看Elias&#39;回答使用Wordpress准备好的语句。准备好的陈述比依靠任何就地功能验证输入更安全。
答案 2 :(得分:0)
感谢所有人提供的帮助。 @Devon的代码非常好用。 顺便说一下,我正在为Wordpress的Woocommerce插件编辑XML Export脚本。
原始插件链接是: https://wordpress.org/plugins/beslist-xml-feed-voor-woocommerce/
你可以在这里下载这个插件的编辑版本: https://github.com/eXspet/beslist-xml-edited
我改变了什么:
<kur>USD</kur>
我不是编码员,所以我对安全性了解不多,如果你发现这个插件有任何安全性,请告诉我。再次感谢大家。