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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:12:32