是否在没有分页的情况下再次运行搜索查询没有结果?

时间:2014-01-29 作者:Oskar

更新:

这个问题已经不重要了。我切换了一些代码,所以现在过滤工作正常了。

看起来查询不起作用,因为我触发了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

1 个回复
SO网友:Eric Holmes

事实证明,您的SQL转储提供了丰富的信息。。SQL语句中的1=2或1=0表示您通过WP_Query 无效。

在您的tax_query 您指定\'field\'=>\'term_id\', 这不是一个有效的选项-应该是\'field\'=>\'id\'.

结束

相关推荐

JQuery在微件后端不起作用

我创建了一个小部件,它应该使用jQuery在两个视图之间切换,并实现jQuery UI日期选择器。我想知道为什么我的jQuery代码不起作用,因为我注意到日期选择器也不起作用。控制台既不抛出错误也不抛出警告。这是我在widget类中的代码:function form($instance) { wp_enqueue_script(\'jquery-datepicker\', get_bloginfo(\'template_url\').\'/styles/jquery-ui-1.10.4.c