改造WooCommerce SKU加购插件 支持URL参数批量添加多商品到购物车
WooCommerce 改造SKU加购插件支持多商品批量加购
改造方案
原插件仅支持URL传入单个商品ID或SKU完成加购,无法处理逗号分隔的多SKU参数。改造后插件完全兼容原有单商品加购逻辑,同时支持多SKU/多ID批量加购。
改造逻辑如下:
- 提前拦截页面请求,识别
add-to-cart参数 - 若参数包含英文逗号,拆分为独立的商品标识数组
- 逐个匹配标识对应的商品ID,校验商品可购买状态后加入购物车
- 处理完成后跳转,避免WooCommerce默认逻辑重复执行
- 保留原插件单SKU转ID的核心能力,兼容旧链接
改造后完整代码
/** * Plugin Name: WooCommerce: 支持SKU/多SKU批量加购 * Description: 支持URL传入单个商品ID、单个SKU、逗号分隔多个SKU/ID实现自动加购 * Version: 1.1 * Author: 基于Remi Corson版本改造 */ if ( ! defined( 'ABSPATH' ) ) { exit; // 禁止直接访问文件 } class WC_Add_to_Cart_by_SKU { public function __construct() { define( 'WC_ADD_TO_CART_BY_SKU_VERSION', '1.1' ); define( 'WC_ADD_TO_CART_BY_SKU_PATH', untrailingslashit( plugin_dir_path( __FILE__ ) ) ); define( 'WC_ADD_TO_CART_BY_SKU_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) ); // 注册多SKU加购处理逻辑 add_action( 'template_redirect', array( $this, 'process_multi_sku_add_to_cart' ) ); // 保留单SKU转商品ID的兼容逻辑 add_filter( 'woocommerce_add_to_cart_product_id', array( $this, 'get_product_id_by_product_sku' ) ); } /** * 批量处理多SKU/多ID加购 */ public function process_multi_sku_add_to_cart() { if ( ! isset( $_REQUEST['add-to-cart'] ) ) { return; } $add_to_cart_raw = wp_unslash( $_REQUEST['add-to-cart'] ); // 无逗号分隔走原生单商品逻辑,不额外处理 if ( strpos( $add_to_cart_raw, ',' ) === false ) { return; } // 拆分参数,过滤空值 $product_items = array_filter( array_map( 'trim', explode( ',', $add_to_cart_raw ) ) ); if ( empty( $product_items ) ) { return; } // 清除原生参数,避免重复处理 unset( $_REQUEST['add-to-cart'] ); wc_nocache_headers(); $added_count = 0; foreach ( $product_items as $item_identifier ) { // 获取真实商品ID $product_id = $this->get_product_id_by_product_sku( $item_identifier ); $product = wc_get_product( $product_id ); // 跳过不存在、不可购买的商品 if ( ! $product || ! $product->is_purchasable() ) { continue; } // 默认加购数量1,可根据需求修改第二个参数 if ( WC()->cart->add_to_cart( $product_id, 1 ) ) { $added_count++; } } // 加购完成后跳转,默认跳购物车,可自行修改地址 if ( $added_count > 0 ) { $redirect_url = apply_filters( 'woocommerce_add_to_cart_redirect', wc_get_cart_url() ); wp_safe_redirect( $redirect_url ); exit; } } /** * 根据SKU查询对应商品ID,兼容纯数字ID传参 */ public function get_product_id_by_product_sku( $add_to_cart ) { // 纯数字直接判定为商品ID返回 if ( is_numeric( $add_to_cart ) ) { return (int)$add_to_cart; } global $wpdb; $product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key='_sku' AND meta_value='%s' LIMIT 1", $add_to_cart ) ); return $product_id ? (int)$product_id : $add_to_cart; } } new WC_Add_to_Cart_by_SKU();
使用说明
- 将上述代码保存为独立PHP文件,上传至站点
wp-content/plugins/目录,在WordPress后台插件列表激活即可使用 - 完全兼容原有单商品加购链接:支持
?add-to-cart=数字ID和?add-to-cart=商品SKU两种格式 - 多商品批量加购直接用英文逗号分隔多个SKU/ID即可,示例格式:
https://你的站点域名/?add-to-cart=SKU001,SKU002,123,访问链接后会自动将所有有效商品加入购物车
自定义调整
- 若需要修改加购后跳转地址,替换代码中
wc_get_cart_url()为目标地址即可,比如跳首页用home_url() - 若需要修改单个商品默认加购数量,调整
WC()->cart->add_to_cart( $product_id, 1 )里的数字1为需要的数量即可 - 代码会自动跳过无效、下架、无库存的商品,不会中断加购流程
内容的提问来源于stack exchange,提问作者Khalid Mayson
相关产品推荐
相关产品推荐

