WooCommerce筛选小部件自定义query string丢失问题求助
解决WooCommerce自定义库存筛选参数被移除的问题
1. 修改库存筛选链接,保留现有查询参数
你原来的链接只添加了stockstatus参数,没有保留当前URL里已有的分层导航、排序等参数,所以切换其他筛选时会丢失。把链接代码改成这样:
<a class="_widget_click" href="<?php echo esc_url(add_query_arg('stockstatus', 'instock', remove_query_arg('paged'))); ?>">Show In Stock Products</a>
这里remove_query_arg('paged')是为了切换筛选时重置到第一页,避免出现页码不对导致无结果的情况。
2. 注册自定义查询变量,让WooCommerce识别它
把这段代码加到主题的functions.php里,确保stockstatus参数不会被系统过滤掉:
function register_stockstatus_query_var($vars) { $vars[] = 'stockstatus'; return $vars; } add_filter('query_vars', 'register_stockstatus_query_var'); add_filter('woocommerce_get_query_vars', 'register_stockstatus_query_var');
3. 让分层导航链接自动带上库存参数
添加下面的钩子,确保用户点击分层导航的选项时,stockstatus参数会被保留在新URL里:
function add_stockstatus_to_layered_nav_links($link, $term, $query_type) { if (isset($_GET['stockstatus']) && $_GET['stockstatus'] === 'instock') { $link = add_query_arg('stockstatus', 'instock', $link); } return $link; } add_filter('woocommerce_layered_nav_link', 'add_stockstatus_to_layered_nav_links', 10, 3);
4. 让排序操作保留库存参数
处理排序下拉菜单的链接和参数,确保切换排序时stockstatus不丢失:
// 给排序参数添加库存筛选标识 function add_stockstatus_to_ordering_args($args) { if (isset($_GET['stockstatus']) && $_GET['stockstatus'] === 'instock') { $args['stockstatus'] = 'instock'; } return $args; } add_filter('woocommerce_get_catalog_ordering_args', 'add_stockstatus_to_ordering_args'); // 修改排序链接,带上库存参数 function add_stockstatus_to_ordering_links($sort_link) { if (isset($_GET['stockstatus']) && $_GET['stockstatus'] === 'instock') { $sort_link = add_query_arg('stockstatus', 'instock', $sort_link); } return $sort_link; } add_filter('woocommerce_catalog_orderby_link', 'add_stockstatus_to_ordering_links');
5. 确保库存筛选规则生效(可选,若你之前没处理)
如果还没实现库存筛选的逻辑,把这段代码加到functions.php里,当stockstatus=instock时自动过滤有库存的商品:
function filter_instock_products($query) { if (is_shop() || is_product_category() || is_product_tag()) { if (isset($_GET['stockstatus']) && $_GET['stockstatus'] === 'instock') { $meta_query = $query->get('meta_query', array()); $meta_query[] = array( 'key' => '_stock_status', 'value' => 'instock', 'compare' => '=' ); $query->set('meta_query', $meta_query); } } } add_action('pre_get_posts', 'filter_instock_products');
这样修改后,不管是点击库存筛选链接,还是切换分层导航、排序选项,stockstatus=instock参数都会一直保留在URL里,库存筛选和其他筛选条件就能同时生效了。
内容的提问来源于stack exchange,提问作者Web Design
相关产品推荐
相关产品推荐

