自定义页面或首页上的 WooCommerce 产品筛选器
您把 WooCommerce 产品筛选器放在自定义页面、着陆页或首页上,结果出现了三种情况之一:表单能显示但没有任何产品,每次点击都跳转到商店页,或者页面刷新后毫无变化。这些都不是 bug。[woof] 短代码只输出搜索表单,而插件会根据页面上的其他内容来决定在哪里显示结果。下文说明这一判断是如何进行的,并给出常见场景下的确切短代码配置:筛选器与产品位于同一页面、限定为某一分类或属性的页面,以及把访客送往结果页的首页表单。
自定义页面上的 WooCommerce 产品筛选器会把访客带到哪里
当访客点击筛选 (Filter)(或在开启自动提交时更改某个选项)后,插件脚本会生成类似 ?swoof=1&pa_color=red 的链接,并检查当前页面上是否有可以刷新的产品列表:[woof_products] 的输出、WooCommerce 的 [products] 短代码,或 .woocommerce 容器内的任何 .products 列表。如果找到,结果就在当前页面打开;如果没有找到,访客会被带到商店页,也就是在 WooCommerce → 设置 → 产品 → 商店页面 (WooCommerce → Settings → Products → Shop page) 中选定的页面。
| 页面包含的内容 | 结果显示的位置 |
|---|---|
仅有 [woof] | 商店页,并带有所选的筛选条件 |
[woof] + [woof_products] | 同一页面;设置 is_ajax=1 时无需刷新 |
[woof] + WooCommerce 的 [products] | 同一页面,刷新之后 |
[woof redirect="..."] 且没有 AJAX 产品网格 | redirect 中的 URL |
| 单个产品页面(相关产品不算) | 商店页,或 redirect 的 URL |
在动手搭建之前,有两个结论值得了解。如果 WooCommerce 中没有设置商店页,筛选器就没有可以送访客去的地方,只会刷新当前所在的页面,单个产品页也不例外。另外,如果您的首页上有任何产品区块(精选产品、用 WooCommerce 标记构建的促销轮播),筛选器会把该区块当作结果网格,从而刷新首页,而不是打开商店。
筛选器与产品位于同一页面
如果页面要像一个小型商店那样工作,请放置两个短代码。它们可以位于不同的区块或列中,例如表单放在窄列,产品放在宽列:
[woof]
[woof_products per_page=12 columns=3 is_ajax=1]
per_page:请务必设置。如果不设置,[woof_products]会使用插件 高级 (Advanced) → 选项 (Options) 标签页中的每页产品数 (Products per page);若该值为-1(默认值),则使用 WordPress 的博客页面至多显示 (Blog pages show at most) 设置,大多数网站上是 10。columns:每行的产品数量。主题是否遵循该值,取决于主题的 CSS。is_ajax=1:结果无需刷新页面即可替换,并且地址栏会同步更新,因此筛选后的页面可以分享。设置is_ajax=0时页面会刷新。在自定义页面上,这个属性才是开启 AJAX 的开关;尝试对商店启用 AJAX (Try to ajaxify the shop) 选项只影响商店页和分类归档页。
[woof_products] 使用主题的产品卡片(content-product.php 模板)来渲染产品,并运行标准的 WooCommerce 循环钩子,因此结果数量、排序和分页的显示方式与商店页一致。
WooCommerce 的 [products] 短代码同样可以被筛选:筛选生效时,HUSKY 会把自己的条件添加到该短代码的查询中。[products limit="12" columns="4" paginate="true"] 与 [woof] 并排使用时,以页面刷新的方式工作;若要使用 AJAX,请使用 HUSKY 注册的孪生短代码 [products_woof],属性相同。
把页面限定为某一分类、标签或属性
针对某个品牌、某个地点或“仅限翻新智能手机”的页面,需要一个访客无法清除的固定条件。这就是 taxonomies 属性,两个短代码中都要写上:
[woof taxonomies="product_cat:87+product_tag:105" tax_exclude="product_cat,product_tag"]
[woof_products taxonomies="product_cat:87+product_tag:105" per_page=12 columns=3 is_ajax=1]
语法为 taxonomy:ID。同一分类法的多个 ID 用逗号分隔;不同的分类法用 + 连接,且必须全部匹配。在默认的 OR 逻辑下,product_cat:87,92+pa_brand:14 表示“属于分类 87 或 92,并且品牌为 14”,87 和 92 的子分类中的产品也包含在内。如果您在插件设置中把某个分类法切换为 AND 逻辑,那么该逻辑在这里同样适用于它的 ID。
使用术语 ID,而不是别名或名称
插件会把每个值转换为具有该 ID 的术语。像 cadeau 这样的别名(slug)或像 Yes 这样的名称都不是 ID,无法匹配任何内容,这部分条件会被悄悄丢弃而不报任何错误,于是页面会显示所有产品。要查找 ID,请打开产品 → 分类 (Products → Categories)(或标签 (Tags),或产品 → 属性 → 配置术语 (Products → Attributes → Configure terms)),把鼠标悬停在术语的编辑 (Edit) 链接上,读取链接中 tag_ID= 后面的数字。
分类法名称必须准确:product_cat、product_tag,全局属性则是 pa_ 加属性别名(是 pa_color,而不是 color),或者自定义分类法(例如品牌分类法)的别名。直接在某个产品中输入的自定义属性不是分类法,不能在这里使用。
每个短代码如何处理这个值
- 在
[woof_products]中,它限定产品范围。真正起作用的是这一部分。 - 在
[woof]中,它限定表单的计数范围:开启显示计数 (Show count) 和动态重新计数 (Dynamic recount) 后,选项旁边的数字以及价格范围描述的都是同一个受限集合;开启隐藏空术语 (Hide empty terms) 后,本页面上没有产品的选项会消失。在 AJAX 模式下,每次筛选后表单会使用[woof_products]中的值重新绘制,因此请让两者保持一致,否则第一次点击之后计数就会改变。
该条件不在 URL 中,而是页面的一部分。重置或取消勾选所有选项后会回到该页面,条件依然存在。用 tax_exclude(分类法名称,以逗号分隔)隐藏您已预先筛选的区块,或者用 tax_only 和 by_only 构建一个简短的表单,例如 [woof tax_only="pa_brand,pa_size" by_only="by_price"];by_only="none" 会隐藏价格、文本搜索以及其他非分类法筛选。更多组合见如何在不同页面显示不同的筛选器,完整的属性列表见 [woof] 短代码页面。如果想按自定义字段而不是分类法来预先筛选,请参阅处理搜索数据。
重定向到商店的首页筛选器
最稳妥的首页方案,是一个把访客送往结果页的搜索表单:
[woof redirect="https://example.com/shop/" autosubmit=1 ajax_redraw=1 tax_only="product_cat,pa_size" by_only="none"]
redirect:结果页。可以是商店页,也可以是分类归档页,例如https://example.com/product-category/tires/(因为分类已包含在地址中,结果会停留在该分类内),还可以是包含[woof]和[woof_products]的自定义页面。请使用不带?的干净 URL;插件会在其后追加?swoof=1&...。- 单独使用
autosubmit=1时,访客在第一次更改后就会被送走,适合只有一个下拉菜单的情况。对于有多个字段的表单,请再加上ajax_redraw=1:每次选择只刷新表单(计数、依赖选项),而筛选 (Filter) 按钮才会打开结果页。设置autosubmit=0时,在访客点击筛选 (Filter) 之前什么都不会发生。
导致大多数“重定向不起作用”反馈的规则:
- 在 AJAX 模式下重定向会被忽略。如果同一页面上还有
[woof_products is_ajax=1]或[products_woof],表单会去筛选那个网格。 - 一个页面,一个筛选器。当页面上有多个表单时,脚本会从找到的第一个表单中读取
redirect、autosubmit和ajax_redraw。侧边栏中的第二个表单,或者产品上方的自动筛选器,可能会悄悄覆盖您配置的表单。HUSKY 小工具有自己的重定向到 (Redirect to) 字段,用途相同。 - 首页表单上的
taxonomies条件不会随重定向一起传递;只有访客选择的内容会进入 URL。如果表单只针对一个分类,请重定向到该分类的归档页。
为什么不在静态首页本身上进行筛选
就地筛选在普通页面上可以正常工作,静态首页则是例外:product_cat 或 product_tag 之类的参数同时也是 WordPress 的查询变量,当它们出现在网站根地址上时,WordPress 就不再把该请求当作您的首页。根据主题的不同,访客会看到分类归档页、空白页,或者由 SEO 插件添加的页面未找到 (Page not found) 标题。请把筛选器和 [woof_products] 放在一个普通页面上(例如 /products/),再让首页表单重定向到那里。
仅在访客筛选之后显示产品
对于希望一打开只显示表单的着陆页,请在 [woof_products] 中加入 display_on_search=1。在应用筛选之前,产品区域保持为空;第一次搜索之后,页面才显示结果。文档是针对刷新模式描述这个属性的,因此请与 is_ajax=0 搭配使用。详情见 [woof_products] 短代码页面。
单个产品页、菜单和页面构建器网格
- 单个产品页。产品页侧边栏中的筛选器始终会打开商店页(或其
redirectURL);相关产品和追加销售产品不会被当作结果。 - 菜单和超级菜单。请把分类菜单项链接到真正的分类归档页(
/product-category/.../),而不是包含短代码的页面。归档页无需任何设置即可筛选,并且在筛选过程中保持所在分类。 - 构建器产品网格。Elementor、Divi 或其他构建器中运行自身产品查询的网格不会响应筛选,即使表单仍在页面上。请改用
[woof_products],或者按照筛选 URL 已变化但产品没有变化中的说明,让它的查询可被筛选。 - 分类模板上的
[woof_products]。该短代码不知道自己位于哪个分类归档页上,它是为页面设计的。在分类模板上,除非传入taxonomies,否则它会显示所有产品,因此请在那里保留标准的归档产品循环。
如果仍然不起作用
- 引号是直引号。从文字处理软件或某些网页复制的短代码会带有弯引号(
’pa_age’),WordPress 不接受它们作为属性引号。请在短代码区块中重新输入。 taxonomies中的每个值都是数字形式的术语 ID,分类法名称准确无误,+或:两侧没有空格,并且两个短代码携带相同的值。[woof_products]带有per_page,因此页面不会停在 10 个产品。- 已在 WooCommerce 设置中选定商店页。
- 页面上只有一个筛选表单,或者第一个表单带有您想要的
redirect。 - 页面上的产品网格是
[woof_products]、[products]或[products_woof],而不是带有自身查询的构建器小工具。
如果以上都没有问题,页面仍然异常,请把页面链接以及编辑器中原样的两个短代码发布到 HUSKY 支持论坛。