如何在WordPress子主题中覆盖WooCommerce加购弹窗插件的get_cart_content()函数
如何在WordPress子主题中重写WooCommerce添加到购物车弹窗插件的get_cart_content()函数
没问题,要在子主题里安全重写这个插件的get_cart_content()函数,我们可以利用PHP类继承+单例实例替换的方法,完全避开修改插件核心文件,这样插件更新时你的自定义代码不会被覆盖。下面是具体实现步骤:
1. 理解插件的单例结构
原插件的Xoo_CP_Core类采用了单例模式,意味着整个站点只会有一个类实例。我们需要先重置这个单例,再用我们的自定义子类替换它。
2. 在子主题的functions.php中添加代码
直接把以下代码复制到你的子主题functions.php文件末尾:
// 创建自定义子类,继承原插件的核心类 class Custom_Xoo_CP_Core extends Xoo_CP_Core { // 重写get_cart_content函数,这里写你的自定义逻辑 public function get_cart_content(){ global $xoo_cp_gl_pden_value; global $woocommerce; // -------------------------- // 这里替换成你的自定义代码 // 示例:生成自定义购物车弹窗内容 $custom_cart_html = '<div class="my-custom-cart-popup">'; // 遍历购物车商品 foreach( $woocommerce->cart->get_cart() as $cart_item_key => $cart_item ){ $_product = apply_filters( 'woocommerce_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key ); if( $_product && $_product->exists() && $cart_item['quantity'] > 0 ){ $product_link = $_product->is_visible() ? $_product->get_permalink( $cart_item ) : ''; $product_name = apply_filters('woocommerce_cart_item_name', $_product->get_name(), $cart_item, $cart_item_key); $product_price = apply_filters('woocommerce_cart_item_price', $_product->get_price_html(), $cart_item, $cart_item_key); $custom_cart_html .= sprintf( '<div class="cart-item"> <a href="%s">%s</a> <div class="item-info"> <a href="%s">%s</a> <span class="qty-price">%d × %s</span> </div> </div>', esc_url($product_link), wp_kses_post($_product->get_image()), esc_url($product_link), wp_kses_post($product_name), $cart_item['quantity'], wp_kses_post($product_price) ); } } // 添加购物车总计和操作按钮 $custom_cart_html .= sprintf( '<div class="cart-footer"> <div class="total">总计: %s</div> <div class="cart-actions"> <a href="%s" class="btn-view-cart">查看购物车</a> <a href="%s" class="btn-checkout">去结算</a> </div> </div>', wp_kses_post($woocommerce->cart->get_cart_total()), esc_url(wc_get_cart_url()), esc_url(wc_get_checkout_url()) ); $custom_cart_html .= '</div>'; // -------------------------- return $custom_cart_html; } } // 替换原插件的单例实例 function override_xoo_cp_core_instance() { // 确保原插件类已经加载 if( !class_exists('Xoo_CP_Core') ) return; // 使用反射访问并重置原类的protected静态实例属性 $reflection = new ReflectionClass('Xoo_CP_Core'); $instance_prop = $reflection->getProperty('instance'); $instance_prop->setAccessible(true); $instance_prop->setValue(null, null); // 初始化我们的自定义子类实例,覆盖原单例 Custom_Xoo_CP_Core::get_instance(); } // 在插件加载完成后执行替换操作(优先级11,确保在插件之后加载) add_action('plugins_loaded', 'override_xoo_cp_core_instance', 11);
3. 自定义代码说明
- 你可以完全修改
get_cart_content()函数里的逻辑,生成符合你需求的购物车弹窗HTML内容。 - 继承原类的好处是,原类的其他功能不受影响,只修改你需要的这个函数。
- 反射的作用是绕过原类
$instance属性的protected权限,重置单例以便我们的子类实例替换它。
注意事项
- 确保你的子主题处于激活状态,所有代码都添加到子主题的
functions.php,不要修改父主题或插件文件。 - 如果插件后续更新改变了
Xoo_CP_Core类的结构(比如函数参数变更),你可能需要同步调整你的自定义代码,但这种情况很少见。 - 测试一下添加商品到购物车的流程,确保弹窗正常显示你的自定义内容。
内容的提问来源于stack exchange,提问作者Harinder Singh
相关产品推荐
相关产品推荐

