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

如何修改WooCommerce代码实现购买后隐藏/显示Elementor制作的区块?

基于现有WooCommerce代码实现购买后切换区块显示

当然可以修改现有代码来实现需求——核心逻辑就是复用原代码里的用户是否已购买当前商品的判断,以此为条件控制不同区块的显示与隐藏。下面提供几种实用的实现方案:


原代码作用回顾

你现有的代码通过woocommerce_is_purchasable过滤器,检测当前用户是否已购买目标商品,若已购买则禁用加入购物车按钮:

add_filter( 'woocommerce_is_purchasable', 'bbloomer_hide_add_cart_if_already_purchased', 9999, 2 ); 
function bbloomer_hide_add_cart_if_already_purchased( $is_purchasable, $product ) {
   if ( wc_customer_bought_product( '', get_current_user_id(), $product->get_id() ) ) {
      $is_purchasable = false;
   }
   return $is_purchasable;
}

我们可以基于其中的wc_customer_bought_product()判断逻辑,扩展出区块切换功能。


方案1:直接在模板中添加判断(最直观)

如果你有权限修改商品页面模板(比如single-product.php或自定义区块模板),可以直接插入条件判断代码,控制不同区块的显示:

<?php
global $product;
// 检查当前用户是否已购买该商品
$has_purchased = wc_customer_bought_product( '', get_current_user_id(), $product->get_id() );
?>

<!-- 未购买时显示的区块 -->
<?php if ( !$has_purchased ) : ?>
<div class="before-purchase-section">
    <!-- 这里放未购买时要展示的内容:比如商品详情、加入购物车按钮等 -->
</div>
<?php endif; ?>

<!-- 已购买时显示的区块 -->
<?php if ( $has_purchased ) : ?>
<div class="after-purchase-section">
    <!-- 这里放购买后要展示的内容:比如下载链接、专属福利、售后入口等 -->
</div>
<?php endif; ?>

方案2:扩展函数+短代码(无需修改模板)

如果不想改动模板,可以扩展原代码,添加全局函数和短代码,直接在WordPress编辑器中调用:

第一步:添加扩展代码到主题functions.php

// 保留原有的加入购物车按钮控制代码
add_filter( 'woocommerce_is_purchasable', 'bbloomer_hide_add_cart_if_already_purchased', 9999, 2 ); 
function bbloomer_hide_add_cart_if_already_purchased( $is_purchasable, $product ) {
   if ( wc_customer_bought_product( '', get_current_user_id(), $product->get_id() ) ) {
      $is_purchasable = false;
   }
   return $is_purchasable;
}

// 新增全局判断函数:检查用户是否已购买指定商品
function custom_check_purchased_status( $product_id = null ) {
    if ( !$product_id ) {
        global $product;
        $product_id = $product->get_id();
    }
    // 复用核心判断逻辑
    return wc_customer_bought_product( '', get_current_user_id(), $product_id );
}

// 新增短代码:在编辑器中快速插入条件区块
add_shortcode( 'purchase_conditional_block', 'custom_purchase_conditional_shortcode' );
function custom_purchase_conditional_shortcode( $atts ) {
    $atts = shortcode_atts( array(
        'product_id' => get_the_ID(), // 默认取当前页面商品ID
        'before_content' => '请先购买商品查看专属内容',
        'after_content' => '感谢购买!这里是你的专属内容'
    ), $atts );
    
    $has_purchased = custom_check_purchased_status( $atts['product_id'] );
    return $has_purchased ? $atts['after_content'] : $atts['before_content'];
}

第二步:在编辑器中使用短代码

比如在商品详情页的编辑器中插入:

[purchase_conditional_block product_id="123" before_content="<div class='buy-first'>点击下方按钮购买后即可查看教程</div>" after_content="<div class='purchased'>教程链接:<a href='xxx'>下载地址</a></div>"]

方案3:CSS配合Body类(适合前端控制)

如果需要纯前端控制显示,可以给页面Body添加状态类,再用CSS切换区块:

第一步:添加Body类代码到functions.php

add_filter( 'body_class', 'custom_add_purchase_status_body_class' );
function custom_add_purchase_status_body_class( $classes ) {
    // 仅在商品详情页添加类
    if ( is_product() ) {
        global $product;
        $has_purchased = wc_customer_bought_product( '', get_current_user_id(), $product->get_id() );
        $classes[] = $has_purchased ? 'product-purchased' : 'product-not-purchased';
    }
    return $classes;
}

第二步:添加CSS样式

/* 未购买时:隐藏已购区块,显示未购区块 */
.product-not-purchased .after-purchase-section {
    display: none;
}
.product-not-purchased .before-purchase-section {
    display: block;
}

/* 已购买时:隐藏未购区块,显示已购区块 */
.product-purchased .before-purchase-section {
    display: none;
}
.product-purchased .after-purchase-section {
    display: block;
}

内容的提问来源于stack exchange,提问作者Hossam Elrayes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:10:29