更改现有定期付款的 woocommerce 订阅率

Posted

技术标签:

【中文标题】更改现有定期付款的 woocommerce 订阅率【英文标题】:Changing woocommerce subscription rate for existing recurring payments 【发布时间】:2016-05-07 06:45:03 【问题描述】:

我们提高了订阅价格,但到目前为止,续订仍以旧价格进行,尽管新订阅者以新价格进行。

有什么方法可以使价格上涨反映在现有订阅者的定期付款中。

谢谢

【问题讨论】:

【参考方案1】:

使用可用的 Woo 订阅 API,您可以:

    检索所有“有效”订阅的列表,其中包括您正在使用的产品。 更新订阅项目的价格。

此 sn-p 将包括产品 44 和 99 的订阅。它将所有订阅项目的价格更新为 75 美元。

$product_ids = [ 44, 99 ];
$price = '75';
$subs = wcs_get_subscriptions_for_product( $product_ids, 'subscription', [
    'subscription_status' => 'active',
] );

foreach ( $subs as $sub ) 
    foreach ( $sub->get_items() as $item ) 
        wc_save_order_items( $sub->get_id(), [
            'order_item_id' => [
                $item->get_id(),
            ],
            'line_subtotal' => [
                $item->get_id() => $price,
            ],
            'line_total'    => [
                $item->get_id() => $price,
            ],
        ] );

        echo "Subscription $sub->get_id() price updated to $price. <br />";
    

在大约 150 个项目之后似乎遇到了内存问题,因此您可以将结果限制为 100 个并使用偏移量对它们进行分页。

$subs = wcs_get_subscriptions_for_product( $product_ids, 'subscription', [
    'subscription_status' => 'active',
    'limit' => 100,
    'offset' => 0, // set to increments of 100.
] );

如果你想根据不同的产品设置不同的价格。


foreach ( $subs as $sub ) 
    foreach ( $sub->get_items() as $item ) 
        switch ( $item->get_data()['product_id'] ) 
            case 44:
                $price = '64';
                break;
            case 99:
                $price = '47';
                break;
            default:
                return;
        
    

如果您只想更改支持更改价格的支付网关的价格(例如!PayPal Standard)。

foreach ( $subs as $sub ) 
    if ( ! \in_array( $sub->get_payment_method(), [ 'stripe', 'manual' ] ) ) 
        continue;
    

把它们放在一起。

$product_ids = [ 44, 99 ];
$price = '75';
$subs = wcs_get_subscriptions_for_product( $product_ids, 'subscription', [
    'subscription_status' => 'active',
    'limit' => 100,
    'offset' => 0, // set to increments of 100.
] );
foreach ( $subs as $sub ) 
    if ( ! \in_array( $sub->get_payment_method(), [ 'stripe', 'manual' ] ) ) 
        continue;
    
    foreach ( $sub->get_items() as $item ) 
        switch ( $item->get_data()['product_id'] ) 
            case 44:
                $price = '64';
                break;
            case 99:
                $price = '47';
                break;
            default:
                return;
        

        wc_save_order_items( $sub->get_id(), [
            'order_item_id' => [
                $item->get_id(),
            ],
            'line_subtotal' => [
                $item->get_id() => $price,
            ],
            'line_total'    => [
                $item->get_id() => $price,
            ],
        ] );

        echo "Subscription $sub->get_id() price updated to $price. <br />";
    

【讨论】:

【参考方案2】:

我发现这样做的方法是修改 woocommerce 数据库。

需要更改三个值

1) 在“wp_woocommerce_order_itemmeta”表中的“_line_total”值

2) 在“wp_woocommerce_order_itemmeta”表中的“_line_subtotal”值 这是基于商品 ID,在“wp_woocommerce_order_items”表中按订单号查找

3) 在“wp_postmeta 表”中,“_order_total”值 这是基于订单号的,如订阅列表中所示

执行此操作的一些代码:

$query = "SELECT order_item_id FROM wp_woocommerce_order_items where order_id=$orderno";
if ($result = $mysqli->query($query))

    while ($row = $result->fetch_object())
    
        $itemid = $row->order_item_id;
        $itemquery = "SELECT meta_value FROM wp_woocommerce_order_itemmeta where order_item_id=$itemid and meta_key='_variation_id'";
        if ($itemresult = $mysqli->query($itemquery))
        
            $variationid = $itemresult->fetch_object()->meta_value;
           .... verify that have the right product.....
        

        $sql = "UPDATE wp_woocommerce_order_itemmeta SET meta_value='$newamount' where order_item_id=$itemid and meta_key='_line_total'";
        $modresult = $mysqli->query($sql);

        $sql = "UPDATE wp_woocommerce_order_itemmeta SET meta_value='$newamount' where order_item_id=$itemid and meta_key='_line_subtotal'";
        $modresult = $mysqli->query($sql);
    



$sql = "UPDATE wp_postmeta SET meta_value='$newamount' where post_id=$orderno and meta_key='_order_total'";
printf("SQL: $sql\n", FILE_APPEND);
$modresult = $mysqli->query($sql);
printf("Update order total result:" . print_r($modresult, true)."\n");

【讨论】:

【参考方案3】:

您需要为此同步续订,否则他们将获得旧费率

默认情况下,续订同步功能处于关闭状态。要启用续订同步:

转到:WooCommerce > 设置 > 订阅

点击同步续订复选框

点击保存更改按钮

阅读更多Here

【讨论】:

这是否会使订阅的所有付款在当月的同一天支付,因为我们需要它们在注册日期的每月周年纪念日继续重复。

以上是关于更改现有定期付款的 woocommerce 订阅率的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Woocommerce 订阅中设置下一个付款日期?

Paypal 定期付款,月底额外免费订阅

如何在贝宝定期付款和订阅之间切换?

复制/复制订单 Woocommerce

Paypal API 定期付款余额

Woocommerce 订阅显示下一个付款日期