“POSTS_WHERE”筛选器未在`wp_ajax`中应用“WP_Query”

时间:2019-03-01 作者:Jam3sn

我有一个函数,它添加了posts_join 和aposts_where 在中搜索WP_Query. 它在普通的php呈现的搜索页面上运行良好。然而,我也将其用于ajax产品搜索和其他posts_join 和aposts_where 似乎不适用。

以下是连接和位置:

function search_by_meta_join($join) {
    global $wpdb;

    if (is_search()) {
        $join .= " LEFT JOIN {$wpdb->postmeta} pm_ean ON {$wpdb->posts}.ID = pm_ean.post_id AND (pm_ean.meta_key = \'ean\') ";
        $join .= " LEFT JOIN {$wpdb->postmeta} pm_code ON {$wpdb->posts}.ID = pm_code.post_id AND (pm_code.meta_key = \'product_code\') ";
    }

    return $join;
}
add_filter(\'posts_join\', \'search_by_meta_join\');

function search_by_meta_where($where) {
    global $wpdb;

    if (is_search()) {
        $where = preg_replace(
            "/\\(\\s*{$wpdb->posts}.post_title\\s+LIKE\\s*(\\\'[^\\\']+\\\')\\s*\\)/",
            "({$wpdb->posts}.post_title LIKE $1) OR (pm_ean.meta_value LIKE $1) OR (pm_code.meta_value LIKE $1) ", $where
        );
    }

    return $where;
}
add_filter(\'posts_where\', \'search_by_meta_where\');
下面是我的ajax函数:

    $args = array(
      \'posts_per_page\' => 12,
      \'post_type\' => \'product\',
//      \'offset\' => filter_var($_GET[\'offset\'], FILTER_SANITIZE_NUMBER_INT),
//      \'post_status\' => \'publish\',
//      \'order\' => \'ASC\',
//      \'orderby\' => \'title\',
    );

    // Search query
    if (isset($_GET[\'searchQuery\']) && $_GET[\'searchQuery\'] != \'\') {
        $args[\'s\'] = filter_var($_GET[\'searchQuery\'], FILTER_SANITIZE_STRING);
    }

    // Category filter
//    if (isset($_GET[\'category\']) && $_GET[\'category\'] !== 0) {
//        $args[\'tax_query\'][] = [
//            \'taxonomy\' => \'product-category\',
//            \'field\' => \'term_id\',
//            \'terms\' => filter_var($_GET[\'category\'], FILTER_SANITIZE_NUMBER_INT),
//        ];
//    }

    $loop = new WP_Query($args);
    $products = array();
正如我所说,它在正常的搜索页面上工作,如下所示:

global $query_string;

wp_parse_str($query_string, $search_query);

$search = new WP_Query($search_query);
我是否缺少ajax函数使用它的功能?

2 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

is_search() 仅当主查询用于搜索结果时,才为true。使用创建自己的查询时new WP_Query, 您没有使用主查询。此外,AJAX请求甚至没有主查询,因此is_search(), is_archive() 等。不工作。

如果要检查特定查询是否为搜索,应使用is_search() 查询的方法,如下所示:

$query->is_search();
Theposts_joinposts_where 过滤器将应用于所有查询,但这些过滤器的回调将当前查询对象作为参数接收,您可以使用它来检查任何搜索查询,以便应用过滤器:

function search_by_meta_join( $join, $query ) { // <-- Note the additional argument.
    global $wpdb;

    if ( $query->is_search() ) { // <-- Note that we are checking the current query, not the main query.
    }

    return $join;
}
add_filter(\'posts_join\', \'search_by_meta_join\', 10, 2 ); // <-- Note the \'2\' which indicates we\'re accepting 2 arguments.

function search_by_meta_where( $where, $query ) { // <-- Note the additional argument.
    global $wpdb;

    if ( $query->is_search() ) { // <-- Note that we are checking the current query, not the main query.

    }

    return $where;
}
add_filter( \'posts_where\', \'search_by_meta_where\', 10, 2 );// <-- Note the \'2\' which indicates we\'re accepting 2 arguments.
无论何时进行筛选,都适用相同的原则pre_get_posts 也您应该始终使用传递给过滤器的查询对象来检查这些内容,否则您的更改将应用于搜索页面上的所有查询,包括菜单、小部件和辅助查询,而不仅仅是特定的搜索查询。

SO网友:HU ist Sebastian

如果使用ajax,is\\u search()return false。您必须定义一个全局变量或常量,以便在过滤器中使用。