WooCommerce中添加指定分类商品到购物车时如何仅执行一次脚本
实现WooCommerce添加指定分类商品时单次执行清空localStorage脚本
核心逻辑
wc_add_notice能实现跳转后单次展示、刷新即消失的效果,本质是WooCommerce将提示数据存在用户Session中,渲染完成后立即销毁对应数据。直接复用这套Session存储机制即可实现需求,不需要嵌套钩子。
可直接使用的代码
将以下代码加入主题的functions.php或自定义功能插件中:
// 1. 添加指定分类商品到购物车时,在Session中写入临时执行标记 add_action('woocommerce_add_to_cart', 'set_clear_storage_flag', 10, 2); function set_clear_storage_flag( $cart_item_key, $product_id ){ $target_category_id = 30; // 替换为你需要判断的商品分类ID $product_categories = get_the_terms($product_id, 'product_cat'); if ( empty($product_categories) || is_wp_error($product_categories) ) { return; } foreach ( $product_categories as $category ) { if ( $category->term_id === $target_category_id ) { WC()->session->set('run_clear_localstorage', true); break; } } } // 2. 结账页检测标记,输出脚本后立即删除标记保证仅执行一次 add_action('wp_footer', 'output_clear_storage_script'); function output_clear_storage_script(){ // 仅在结账页面执行逻辑 if ( !is_checkout() ) { return; } // 检测是否存在待执行标记 if ( WC()->session->get('run_clear_localstorage') ) { // 先删除标记,页面刷新后不会再触发 WC()->session->__unset('run_clear_localstorage'); // 输出清空localStorage的脚本 ?> <script> localStorage.clear(); </script> <?php } }
原有代码失效原因
- 原有代码错误地将
add_action('wp_footer')写在了woocommerce_add_to_cart的回调函数内部。WooCommerce添加购物车完成后会执行302跳转,跳转后的结账页是全新的请求,不会保留上一个请求中注册的钩子回调,因此脚本根本不会被输出到页面。 - 额外注意:
woocommerce_add_to_cart是动作钩子(Action),不是过滤器(Filter),原代码用add_filter挂载不符合WordPress开发规范,建议替换为add_action。 - 上述代码完全匹配需求:仅当添加的商品属于指定分类时触发,跳转至结账页时执行一次脚本,页面刷新后脚本不再加载。
内容的提问来源于stack exchange,提问作者wp-ap
相关产品推荐
相关产品推荐

