我在Woocommerce产品类别页面上依靠pre_get_posts和URL查询设置自定义Woocommerce搜索功能 . 分类和元值过滤器工作正常,但我在添加关键字搜索时遇到问题(我想搜索产品 Headers 和描述) . 我在搜索表单中有一个文本输入,它附加到url作为?partdescription = FOO,我试图 grab 该变量并将其插入主查询中 .
这是我到目前为止:
add_action('pre_get_posts','alter_query');
function alter_query($query) {
global $wp_query;
// checks if we're on a shop category page
if ($query->is_main_query() && is_product_category()) {
// Set up Filters from URL Query
$urlQuery = $_GET;
// Part Description
$description = isset($urlQuery['partdescription']) ? $urlQuery['partdescription'] : NULL;
// Only modify the query for the parts category
if ($query->query_vars['product_cat'] == 'parts') {
if (!empty($description)) $query->set('s', $description);
}
}
}
这种方法适用于设置分类和元查询,但修改's'会抛出一大堆这样的错误:
[19-Jul-2018 20:47:59 UTC] WordPress database error Unknown column 'Array' in 'group statement' for query SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.ID IN (129,131,132,150,151,152,256,257,258,259,260,263,271,272,273,275,321,371,427,428) AND wp_posts.post_type = 'nav_menu_item' AND ((wp_posts.post_status = 'publish')) GROUP BY Array ORDER BY wp_posts.menu_order ASC made by require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), include('/themes/x/woocommerce.php'), x_get_view, X_View_Router::render, include('/themes/cvbs/framework/views/integrity/woocommerce.php'), get_header, locate_template, load_template, require_once('/themes/x/header.php'), x_get_view, X_View_Router::render, include('/themes/x/framework/legacy/cranium/headers/views/header/base.php'), x_get_view, X_View_Router::render, include('/themes/cvbs/framework/legacy/cranium/headers/views/integrity/wp-header.php'), x_get_view, X_View_Router::render, include('/themes/x/framework/legacy/cranium/headers/views/global/_navbar.php'), x_get_view, X_View_Router::render, include('/themes/x/framework/legacy/cranium/headers/views/global/_nav-primary.php'), ubermenu, wp_nav_menu, wp_get_nav_menu_items, get_posts, WP_Query->query, WP_Query->get_posts
它还使我的主导航和小部件菜单消失 .
任何帮助,将不胜感激!
EDIT July 24th:
仍在继续这个,我发现了一些类似的问题here和here . 这些帖子的解决方案是使用 $query->is_main_query()
,但我已经在我的代码中使用了该检查 . 我可以在这些问题和我的问题之间注意到的唯一区别是它们是用于设置 meta_key
,而我正在尝试设置 s
. 是 s
只能在搜索页面上修改的内容吗?有什么办法可以在存档页面上模仿它的功能吗?
1 回答
解决了这个问题,在这里发布我的解决方案,万一它可以帮助任何人 . 因为我试图改变Woocommerce产品的查询,我能够使用不同的钩子而不是
pre_get_posts
:其余的代码最终或多或少相同,只是使用新的
$query
变量而不是global $wp_query
.$query->is_main_query()
也不再需要了 .Reference for Modifying the WooCommerce Product Query