我有一个函数,它添加了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函数使用它的功能?
最合适的回答,由SO网友:Jacob Peattie 整理而成
is_search()
仅当主查询用于搜索结果时,才为true。使用创建自己的查询时new WP_Query
, 您没有使用主查询。此外,AJAX请求甚至没有主查询,因此is_search()
, is_archive()
等。不工作。
如果要检查特定查询是否为搜索,应使用is_search()
查询的方法,如下所示:
$query->is_search();
The
posts_join
和
posts_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
也您应该始终使用传递给过滤器的查询对象来检查这些内容,否则您的更改将应用于搜索页面上的所有查询,包括菜单、小部件和辅助查询,而不仅仅是特定的搜索查询。