更新:
这个问题已经不重要了。我切换了一些代码,所以现在过滤工作正常了。
看起来查询不起作用,因为我触发了indexTaxonomyCounts
来自模板的函数?
但我现在有另一个问题,但将为此写一个不同的问题。
原始问题:
我想通过一些分类法和元过滤器过滤我的定制产品。这适用于常规查询,但不适用于我的搜索结果。至少,过滤是有效的,但获得正确的计数却不起作用。
我所做的是:
我加入了pre_get_posts
钩住并使用$\\u GET中的数据创建分类法和元查询。
然后我存储刚才创建的查询(包括筛选),以便在结果页上计算每个分类法/元过滤器的结果总数。
但当我再次运行存储的搜索查询时(但现在使用posts_per_page=-1
) 我没有结果?不知道为什么。搜索是否执行与常规查询不同的查询?
也许通过一些代码片段更清楚。
以下功能正常工作,搜索结果将被过滤并全部显示:
add_action(\'pre_get_posts\', array($this, \'pre_get_posts_hook\'));
public function pre_get_posts_hook( $query_obj )
{
//check if this isn\'t the internal query, since that doesn\'t need filtering ^^
if( empty($query_obj->query_vars[\'internal-query\']) || $query_obj->query_vars[\'internal-query\'] != true ) {
$tax_query = array();
$meta_query = array();
if(isset($_GET[\'someMetaFilter\']) {
foreach(explode(\',\', $_GET[\'someMetaFilter\']) as $tax_value) {
$meta_query[] = array(
\'key\' => urldecode($tax_value),
\'value\' => array(\'\'),
\'compare\' => \'NOT IN\',
);
}
}
if(isset($_GET[\'someTaxonomyFilter\']) {
foreach(explode(\',\', $_GET[\'someTaxonomyFilter]) as $tax_id) {
$ids[] = urldecode($tax_id);
}
$tax_query[] = array(
\'taxonomy\' => $type,
\'field\' => \'term_id\',
\'terms\' => array_map(\'intval\', $ids),
\'include_children\' => false,
\'operator\' => \'AND\'
);
}
if(count($tax_query)) {
$tax_query[\'relation\'] = \'AND\';
$query_obj->set(\'tax_query\', $tax_query);
}
if(count($meta_query)) {
$meta_query[\'relation\'] = \'AND\';
$query_obj->set(\'meta_query\', $meta_query);
}
//only set it if we have set a specific filter set
if(count($tax_query) || count($meta_query)) {
self::$query_vars = $query_obj->query_vars;
}
return $query_obj;
}
从结果页调用此函数,以计算分类的所有计数。但这只会导致0个结果:S
我唯一要做的就是获取以前使用的query\\u vars并设置post_per_page
到-1(这样我就可以得到所有的结果,而不仅仅是这个页面的结果)
public static function indexTaxonomyCounts()
{
if (isset(self::$query_vars)) {
$query_vars = self::$query_vars;
$query_vars[\'posts_per_page\'] = -1;
$query_vars[\'internal-query\'] = true; //to prevent the pre_get_posts_hook to adjust the query
$wpQuery = new WP_Query($query_vars);
//somehow in the regular query, this works. But when I do this in a search result page, the $wpQuery->have_posts() is empty! But the result page does have 30+ results or something :S
// The Loop
if ( $wpQuery->have_posts() ) {
while ( $wpQuery->have_posts() ) {
...
do some calculations based on the taxonomy and such
...
}
}
/* Restore original Post Data */
wp_reset_query();
}
}
我尝试了很多东西,我甚至不知道还有什么。我复制了query\\u vars,我复制了WpQuery。我试图通过添加
?s=$_GET[\'s\']
或者别的什么。但没有结果。
因此,如果有人知道这是什么原因,我将不胜感激!
其他信息(1)
好的,我做了一些日志记录(使用
posts_request
过滤器和我有2个转储数据。它太大了,不能倒在这里。
所以我把它们上传到我的Dropbox:
这一个有效:https://www.dropbox.com/s/a07defqjx1d95j0/regular-page.php
而这一个没有:https://www.dropbox.com/s/zboiw4fjqojotw7/search-page.php
正如您在上面的代码片段中所看到的,我只使用了相同的query\\u vars。这两个query\\u vars只是略有不同,但我不确定是什么原因造成的。
这个SELECT * FROM mug_posts WHERE 1=2
这很奇怪,但搜索确实会返回结果-所以我想搜索会进行其他查询???
附加信息(2)
好吧,它变得更奇怪了。我简化了逻辑,去掉了整个分类过滤等等。在
pre_get_posts
我存储查询,并在页面上调用一个函数,该函数检查存储的查询并再次运行。但我没有得到任何结果!
public function pre_get_posts_hook( $query_obj )
{
if( $query_obj->is_page() == false ) {
if( $query_obj->query_vars[\'post_type\'] == \'products\' ) {
if ( ($query_obj->is_main_query() == false && $this->filterIsActive())
|| $query_obj->is_search()) {
self::$query_vars = $query_obj->query_vars;
}
}
}
return $query_obj;
}
public static function indexTaxonomyCounts()
{
if (isset(self::$query_vars)) {
$query_vars = self::$query_vars;
$wpQuery = new WP_Query($query_vars);
echo $wpQuery->have_posts(); // -> false
/* Restore original Post Data */
wp_reset_query();
}
}
我打印了常规页面和搜索页面的query\\u vars,它们几乎完全相同:
在常规页面上查询变量:https://www。dropbox。com/s/nxy75avclwtr5xt/results。搜索页面上的php查询变量:https://www。dropbox。com/s/g72nhsfwej9q95c/无结果。php
(很抱歉有这么奇怪的链接,但我还没有足够的声誉来发布更多链接)
您可能会认为,由于查询变量(几乎)相同,它们会给出相同的结果。否:P