如何仅为含特定状态的WooCommerce订单显示图片或文本
实现仅显示给有已发货订单用户的内容
首先修正你原代码的关键问题,再给出完整的实现方案:
修正后的订单状态检查函数
原代码可能因WooCommerce订单状态的前缀规则导致查询失效——WooCommerce的自定义订单状态会自动添加wc-前缀,因此shipped状态实际对应的查询参数是wc-shipped。同时优化查询效率,仅返回订单ID而非完整订单对象:
function check_user_has_shipped_orders() { if ( ! is_user_logged_in() ) { return false; } $user_id = get_current_user_id(); // 查询是否存在已发货订单,仅返回ID提升性能 $shipped_orders = wc_get_orders( array( 'limit' => 1, 'customer' => $user_id, 'status' => 'wc-shipped', 'return' => 'ids', ) ); return ! empty( $shipped_orders ); }
三种实现显示指定内容的方式
方式1:短代码调用(适合页面/文章/小工具)
注册短代码后,直接在后台编辑时插入[shipped_user_content]即可显示内容:
add_shortcode( 'shipped_user_content', 'display_shipped_user_content' ); function display_shipped_user_content() { if ( check_user_has_shipped_orders() ) { // 替换为你需要显示的图片或文本 return '<div class="shipped-exclusive">这是仅给已发货订单用户的专属内容<br><img src="你的图片地址" alt="专属标识"></div>'; } return ''; }
方式2:主题模板中直接判断(适合自定义模板位置)
如果要在主题的模板文件(比如header.php、myaccount.php等)中显示内容,直接用条件判断输出:
<?php if ( check_user_has_shipped_orders() ) : ?> <div class="shipped-only-content">仅已完成发货订单的用户可见</div> <?php endif; ?>
方式3:CSS控制元素显示(适合已有目标元素类的情况)
先给body添加标识类,再用CSS控制目标元素的显示隐藏:
- 添加body类的PHP代码:
add_filter( 'body_class', 'add_shipped_user_body_class' ); function add_shipped_user_body_class( $classes ) { if ( check_user_has_shipped_orders() ) { $classes[] = 'has-shipped-orders'; } return $classes; }
- 在主题样式文件(
style.css)中添加CSS:
/* 默认隐藏目标元素 */ .your-target-class { display: none; } /* 当用户有已发货订单时显示 */ .has-shipped-orders .your-target-class { display: block; }
注意事项
- 确认你的自定义订单状态slug确实是
shipped,如果是其他名称(比如order-shipped),要将查询参数改为wc-order-shipped - 所有PHP代码请添加到主题的
functions.php文件或自定义插件中,不要修改WooCommerce核心文件 - 如果网站开启了页面缓存,需确保相关内容的缓存是动态的,避免显示错误
内容的提问来源于stack exchange,提问作者Shane Price
相关产品推荐
相关产品推荐

