【问题标题】:Woocommerce action hook to execute function on subscription renewalWoocommerce 操作钩子在订阅续订时执行功能
【发布时间】:2017-07-19 11:16:42
【问题描述】:

我想知道是否有一个动作挂钩可以检查 woocommerce 中的订阅是否成功续订?顺便说一句,我正在使用 woocommerce 订阅插件。我创建了一个记录订阅订单日期并将其添加到 CSV 文件的功能,该功能在首次购买时完美运行我的意思是当用户购买订阅时,它会成功记录在 CSV 中,因为我正在启动woocommerce_thankyou 操作挂钩上的功能,我面临的唯一问题是我似乎找不到可以在成功续订时执行此功能的挂钩。我尝试使用 woocommerce_subscription_renewal_payment_complete 操作钩子,但它没有工作下面是我创建的功能。

/**
 * Add subscriptions to csv.
 */

add_action( 'woocommerce_subscription_renewal_payment_complete', 'add_subs_to_csv' );
add_action( 'woocommerce_thankyou', 'add_subs_to_csv' );
function add_subs_to_csv( $order_id ) {
    $order = wc_get_order( $order_id );
    $items = $order->get_items();
    foreach ( $items as $key => $value ) {
        $meta_values = $value->get_data();
        foreach ( $meta_values as $meta_key => $meta_value ) {
            if ( $meta_key == 'product_id' && $meta_value == 875 ) {
                $paid_date      = explode( " ", get_post_meta( $order_id, '_paid_date', true ) );
                $subs_paid_date = date( 'd F, Y', strtotime( $paid_date[0] ) );
                wc_add_order_item_meta( $key, 'Delivery Date', $subs_paid_date );
            }
        }

    }
}

【问题讨论】:

    标签: wordpress


    【解决方案1】:

    wcs_renewal_order_created 钩子是您要找的吗?文档说:

    WooCommerce 订阅存储每个订阅的所有详细信息 标准 WooCommerce 订单中的续订,仅使用特殊的元标志 将其链接到订阅。

    这些订单总是通过 wcs_create_renewal_order() 创建的 函数,无论它们是否是为预定的 通过 WooCommerce > 编辑订阅手动更新事件 管理屏幕,或通过订阅端点 WooCommerce REST API。因此,可以添加、删除或 使用此过滤器更新该续订订单上任何内容的值。

    例如,这可用于为特定续订添加折扣 订单,例如每年的第 12 个订单。它也可以用来添加 特定续订订单的一次性费用,例如特殊的年度额外费用 按月付费。

    所以上面的钩子应该在付款后触发,你可能只需要检查它是否已经完成状态,你也可以在你当前的钩子中做:

    /**
     * After WooCommerce Subscriptions Creates Renewal Order
     *
     * @param WC_Order Object $order
     * @param Integer|WC_Subscription Object $subscription
     *
     * @return void
     */
    function add_subs_to_csv( $order, $subscription ) {
    
        if( 'completed' === $order->get_status() ) {
            $items = $order->get_items();
            foreach ( $items as $key => $value ) {
                $meta_values = $value->get_data();
                foreach ( $meta_values as $meta_key => $meta_value ) {
                    if ( $meta_key == 'product_id' && $meta_value == 875 ) {
                        $paid_date      = explode( " ", get_post_meta( $order_id, '_paid_date', true ) );
                        $subs_paid_date = date( 'd F, Y', strtotime( $paid_date[0] ) );
                        wc_add_order_item_meta( $key, 'Delivery Date', $subs_paid_date );
                    }
                }
    
            }
        }
    
    }
    add_action( 'wcs_renewal_order_created', 'add_subs_to_csv', 10, 2 );
    

    【讨论】:

    • 我正在做同样的事情,几乎一样,我会实施你的建议,看看它是否有效......会报告......谢谢
    • return $order 在函数末尾是需要的
    • 我们知道这个钩子是否真的在付款后触发?它的读取方式对我来说是模糊的,在我的情况下是一个非常重要的考虑因素。
    • @armadadrive 最简单的方法是测试它。始终测试您在其他地方获得的代码。您可以在WooCommerce Subscription docs 中阅读有关该钩子的更多信息。
    • @Howdy_McGee 我完全同意,只是没有从开发文档中得到明确的答案,并且想知道在我开始测试自己的解决方案之前是否有人有任何具体知识。谢谢。
    【解决方案2】:

    我在订阅续订时遇到了问题,我用下面的代码解决了这个问题:

    /*
     * FIXED : Membership got PAUSED everytime at automatic subscription renewal
     */
    
    function change_membership_status_active( $subscription , $order ) {
        global $wpdb;
        if( 'completed' === $order->get_status() ) {        
            $membership = $wpdb->get_row( "SELECT * FROM wp_postmeta WHERE meta_key = '_subscription_id' AND meta_value =  $subscription->ID" );
            $mem_id = $membership->post_id;
            $status = 'wcm-active';
            $update_args = array( 'ID' => $mem_id, 'post_status' => $status );
            wp_update_post($update_args);
        }
    }
    add_action( 'woocommerce_subscription_renewal_payment_complete', 'change_membership_status_active', 10, 2 );
    

    【讨论】:

    猜你喜欢
    • 2017-03-21
    • 2020-08-17
    • 2021-07-01
    • 2018-04-04
    • 1970-01-01
    • 2021-02-01
    • 2019-09-18
    • 2016-06-07
    • 2015-11-27
    相关资源
    最近更新 更多