WooCommerce Subscriptions后台新增已支付续费订单计数列
问题背景
当前站点使用WooCommerce Subscription插件,需要实现以下需求:
- 在WordPress后台订阅概览管理页(访问路径:
/wp-admin/edit.php?post_type=shop_subscription)的列表中新增自定义列 - 列功能为统计每个订阅关联的所有已支付续费订单总数量
- 列位置需放置在「结束日期」列相邻位置
原有实现代码无法正常运行,代码如下:
function count_paid_renewals( $subscription ) { $get_paid_count = $subscription->get_payment_count( 'renewal' ); foreach ( $subscription->get_items() as $item ) { ?> <tr> <td><?php esc_html_e( 'Count: ' . $item->get_product()->get_title(), 'woocommerce-subscriptions' ); ?></td> <td> <?php echo esc_html( $get_paid_count ); ?> </td> </tr> <?php } } add_action( 'woocommerce_subscription_before_actions', 'count_paid_renewals', 99, 1 );
原有代码问题点
- 钩子使用错误:挂载的
woocommerce_subscription_before_actions是订阅详情页的动作钩子,仅会在单个订阅的详情编辑页输出内容,完全不会作用于后台订阅列表的列渲染流程 - 逻辑不匹配需求:需求为统计单订阅下已支付续费订单总数,代码额外遍历订阅商品项输出商品标题,和需求无关
- 方法调用参数错误:WooCommerce Subscription的
get_payment_count()方法统计指定类型订单数时,需要先传入订单状态参数、再传入订单类型参数,原代码仅传入订单类型,统计结果不准确
正确实现方案
将以下代码添加到当前主题的functions.php文件,或者自定义功能插件中即可生效:
/** * 订阅列表新增已支付续费次数列,插入到结束日期列后方 */ add_filter( 'manage_edit-shop_subscription_columns', 'add_paid_renewal_count_column', 20 ); function add_paid_renewal_count_column( $columns ) { $new_columns = []; foreach ( $columns as $key => $label ) { $new_columns[ $key ] = $label; // 匹配到结束日期列后,紧跟插入新列 if ( 'end_date' === $key ) { $new_columns['paid_renewal_count'] = __( '已支付续费次数', 'woocommerce-subscriptions' ); } } return $new_columns; } /** * 渲染已支付续费次数列内容 */ add_action( 'manage_shop_subscription_posts_custom_column', 'render_paid_renewal_count_column', 10, 2 ); function render_paid_renewal_count_column( $column, $post_id ) { if ( 'paid_renewal_count' !== $column ) { return; } $subscription = wcs_get_subscription( $post_id ); if ( ! $subscription ) { echo '-'; return; } // 正确传参:第一个参数限定状态为已支付,第二个限定类型为续费订单 $paid_renewal_count = $subscription->get_payment_count( 'paid', 'renewal' ); echo esc_html( $paid_renewal_count ); }
代码说明
- 列位置自动适配:遍历原有列表列配置,在结束日期列(数组键为
end_date)后直接插入新列,无需手动调整其他列的排序,兼容其他插件新增的列表列 - 统计逻辑准确:严格按照方法要求传参,仅统计状态为已支付、类型为续费的关联订单,排除待支付、已取消的续费订单
- 异常兼容:增加订阅对象有效性判断,遇到损坏的订阅数据时输出
-占位,不会触发PHP报错影响后台页面加载
内容的提问来源于stack exchange,提问作者Nik7
相关产品推荐
相关产品推荐

