
本文将解决 WooCommerce 中使用 woocommerce_product_query hook 在主商店页面工作正常,但在产品分类页面失效的问题。通过使用 pre_get_posts action hook,我们可以确保自定义筛选器在所有产品页面(包括主商店和分类页面)上都能正确应用。
woocommerce_product_query 钩子主要用于修改 woocommerce 产品查询,允许开发者根据自定义条件筛选产品。然而,在某些情况下,尤其是在产品分类页面,这个钩子可能无法正常工作,导致自定义筛选失效。
使用 pre_get_posts 钩子
pre_get_posts 是一个更通用的钩子,它在 WordPress 执行任何查询之前被触发。通过使用这个钩子,我们可以修改主查询,确保自定义筛选器在所有页面上都能生效。
以下是使用 pre_get_posts 钩子实现自定义筛选的示例代码:
function custom_product_filter($query) {
// 检查是否是主查询,并且是产品类型的查询
if( ! is_admin() && $query->is_main_query() && $query->get('post_type') == 'product') {
// 获取 URL 参数中的自定义键值
$custom_key_value = isset($_GET['my_custom_key']) ? $_GET['my_custom_key'] : '';
// 如果自定义键值存在,则设置 meta_query
if (!empty($custom_key_value)) {
$meta_query = array(
array(
'key' => 'my_custom_key',
'value' => $custom_key_value,
'compare' => '=='
)
);
$query->set( 'meta_query', $meta_query );
}
}
}
add_action( 'pre_get_posts', 'custom_product_filter' );
登录后复制
代码解释:
- custom_product_filter($query) 函数: 定义了一个名为 custom_product_filter 的函数,它接收 $query 对象作为参数。$query 对象包含了当前查询的所有信息。
- ! is_admin(): 确保代码只在前台执行,避免在 WordPress 后台产生影响。
- $query->is_main_query(): 检查当前查询是否是主查询。这可以防止修改其他查询,例如侧边栏或页脚中的查询。
- $query->get(‘post_type’) == ‘product’: 检查查询的 post_type 是否为 product,确保只修改产品查询。
- isset($_GET[‘my_custom_key’]) ? $_GET[‘my_custom_key’] : ”;: 安全的获取 URL 中的 my_custom_key 参数,如果不存在则赋值为空字符串。
- if (!empty($custom_key_value)): 确保 my_custom_key 参数不为空才执行后续的meta query 设置。
-
$meta_query 数组: 定义了一个 meta_query 数组,用于指定自定义字段的筛选条件。
- ‘key’ => ‘my_custom_key’:指定要筛选的自定义字段的键名。
- ‘value’ => $custom_key_value:指定要筛选的自定义字段的值,从 URL 参数中获取。
- ‘compare’ => ‘==’:指定比较运算符,这里使用 == 表示等于。
- $query->set( ‘meta_query’, $meta_query ): 将 meta_query 设置到 $query 对象中,从而修改查询。
- add_action( ‘pre_get_posts’, ‘custom_product_filter’ ): 将 custom_product_filter 函数挂载到 pre_get_posts 钩子上,以便在每次查询之前执行。
注意事项:
- 确保将代码添加到你的主题的 functions.php 文件或自定义插件中。
- 根据你的实际需求修改自定义字段的键名和值。
- 测试代码在主商店页面和产品分类页面是否都能正常工作。
- 根据需要添加额外的条件判断,例如检查用户是否登录,或者根据其他 URL 参数进行筛选。
总结:
通过使用 pre_get_posts 钩子,我们可以有效地解决 woocommerce_product_query 在产品分类页面失效的问题。这种方法不仅简单易用,而且适用于各种自定义筛选场景,可以帮助你更好地控制 WooCommerce 产品的展示。请记住,在修改 WordPress 查询时,务必谨慎,并进行充分的测试,以确保代码的正确性和稳定性。
以上就是WooCommerce 产品分类页面筛选失效问题解决方案的详细内容,更多请关注php中文网其它相关文章!