You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:39:53