所以首先你要确保WHERE
第条。posts_where
将激发(几乎)每个查询,因此您需要确保将其添加到正确的查询中。这可以通过使用conditional tags.
Note: 这个WHERE 1=1
因为它表示有效的WHERE
表达式,并可以使用posts_where
过滤器(即仅通过添加AND X=Y
). 事实上,WordPress硬编码WHERE
并在条件中添加-因此需要一些东西来确保SQL查询有效
add_filter(\'posts_where\', \'wpse55985_posts_where\',10,2);
function wpse55985_posts_where($where, $query){
global $wpdb;
//$query is a WP_Query object
if( $query->is_main_query() && is_tax(\'my-tax\') ){
//This is the main query for the \'my-tax\' taxonomy page
if( isset($_GET[POSTS_END_DATE_NAME]) && isset($_GET[POSTS_START_DATE_NAME]) ){
//Variables are set.
$start = $_GET[POSTS_START_DATE_NAME];
$end = $_GET[POSTS_END_DATE_NAME];
//Append our additional \'WHERE\' clause
$where .= $wpdb->prepare(
" AND {$wpdb->posts}.post_date BETWEEN %s AND %s ", $start,$end
) ;
}
}
return $where
}
解释首先使用
is_main_query()
检查此查询是否为页面的“主”查询。这个
conditionals 所有都与此主查询相关。因此,我正在检查这是否是主查询,并且该查询是针对分类法“my tax”,尤其是正在查看“my tax”分类法页面。因此,上述内容应仅对
my-tax
分类页面。看见
is_tax()
. 否则,我们只需返回
$where
不做任何事情的条款。
检查$_GET
设置您所追求的变量。您应该注册自定义查询变量并使用$query->get()
方法而不是处理$_GET
直接地如果没有设置它们,我们就不会更改查询。
使用$wpdb
类获取post表名称并安全地准备查询。看见this Codex page, 最后一部分this article. 这一部分对于保护自己不受SQL注入的影响至关重要。
请注意,我尚未对此进行测试,可能存在语法错误。