【问题标题】:Switch Subscription - Add Directly To Cart切换订阅 - 直接添加到购物车
【发布时间】:2018-06-27 21:14:11
【问题描述】:

我试图绕过单个产品页面,因此我为我的订阅创建了一个自定义模板页面。在此页面上,我正在生成按钮以允许用户注册特定订阅或切换他们的订阅。我遇到的问题是让 Switch 订阅 URL 转到购物车而不是单个产品页面。

下面的函数将测试用户是否登录,如果他们没有显示添加订阅到购物车的 URL。如果他们显示我试图将其添加到购物车(或直接结帐)的切换订阅网址。

/**
 * Get Subscription URL ( Initial or Switch Subscription ) by Subscription ID
 *
 * @param Integer $subscription_id
 *
 * @return void
 */
function woo_subscriptions_checkout_url( $subscription_id, $echo = true ) {

    $subscription_id    = intval( $subscription_id );
    $subscription_url   = do_shortcode( '[add_to_cart_url id="' . $subscription_id . '"]' );

    if( is_user_logged_in() && function_exists( 'wcs_get_users_subscriptions' ) ) {

        $user_subscriptions = wcs_get_users_subscriptions();

        if( ! empty( $user_subscriptions ) ) {

            foreach( $user_subscriptions as $subscription ) {

                $subscription_order_id  = $subscription->get_parent_id();
                $subscription_key       = wcs_get_old_subscription_key( $subscription );

                if( ! empty( $subscription_key ) ) {

                    $plan_parent_id     = wp_get_post_parent_id( $subscription_id );
                    $subscription_url   = WC_Subscriptions_Switcher::add_switch_query_arg_post_link( get_permalink( wc_get_page_id( 'subscriptions' ) ), $plan_parent_id );

                    // Failed Test, Goes to Product
                    // $subscription_url    = WC_Subscriptions_Switcher::get_switch_url( $subscription_order_id, array( 'product_id' => $plan_parent_id ), $subscription );

                }

            }

        }

    }

    if( $echo ) {
        echo $subscription_url;
    } else {
        return $subscription_url;
    }

}

附加信息:有 1 个产品以订阅作为变体。我将变体 ID 传递给此函数,希望生成正确的 URL。

【问题讨论】:

    标签: php wordpress woocommerce woocommerce-subscriptions


    【解决方案1】:

    这就是我们得到的。我们可以使用特定的 URL 参数将其添加到购物车:产品、用户订阅 ID、新订阅 ID、订阅订单行号和随机数。难道我们不是在订阅作为变体的单一产品上这样做的。这可能需要在其他订阅案例中进行调整,但希望它对以后的人有所帮助:

    /**
     * Generate cart button based on subscription variation ID
     *
     * @param Array $args
     *
     * @return void
     */
    function prefix_subscriptions_checkout_button( $args = array() ) {
    
        $button_arr = wp_parse_args( $args, array(
            'variation_id'  => 0,
            'btn_class'     => array( 'button', 'button-primary' ),
            'btn_text'      => __( 'Sign Up' ),
            'btn_atts'      => array(),
        ) );
    
        $button_arr['btn_url'] = do_shortcode( '[add_to_cart_url id="' . intval( $button_arr['variation_id'] ) . '"]' );
    
        if( is_user_logged_in() && function_exists( 'wcs_get_users_subscriptions' ) ) {
    
            // Grab an array of user subscriptions
            $user_subscriptions = wcs_get_users_subscriptions();
    
            if( ! empty( $user_subscriptions ) ) {
    
                // Array( 'Subscription ID' => WC_Subscriptions Object );
                foreach( $user_subscriptions as $user_subscription_id => $subscription ) {
    
                    // Loop through the users subscription order items to get the subscription order line item
                    foreach( $subscription->get_items() as $item_line_number => $item_arr ) {
    
                        if( $user_subscription_id == $item_arr['order_id'] ) {
    
                            if( $item_arr['variation_id'] == $button_arr['variation_id'] ) {
    
                                // Change button based on status
                                switch( $subscription->get_status() ) {
    
                                    case 'on-hold':
                                        $button_arr['btn_text']     = __( 'On Hold' );
                                        $button_arr['btn_class']    = array( 'button', 'button-secondary' );
                                        $button_arr['btn_url']      = 'javascript:void(0);';
                                      break;
    
                                    case 'active':
                                        $button_arr['btn_text']     = __( 'Current' );
                                        $button_arr['btn_class']    = array( 'button', 'button-secondary' );
                                        $button_arr['btn_url']      = 'javascript:void(0);';
                                      break;
    
                                    default:
                                        $button_arr['btn_url'] = add_query_arg( array(
                                                'add-to-cart'           => $item_arr['product_id'],
                                                'switch-subscription'   => $user_subscription_id,
                                                'variation_id'          => $button_arr['variation_id'],
                                                'item'                  => $item_line_number,
                                                '_wcsnonce'             => wp_create_nonce( 'wcs_switch_request' )
                                            ),
                                            wc_get_cart_url()
                                        );
                                }
    
                            }
    
                        }
    
                    }
    
                }
    
            }
    
        }
    
        // Create button attributes
        $button_atts = '';
        if( ! empty( $button_arr['btn_atts'] ) && is_array( $button_arr['btn_atts'] ) ) {
            foreach( $button_arr['btn_atts'] as $attribute => $value ) {
                $button_atts .= sprintf( ' %1$s="%2$s"', esc_attr( $attribute ), esc_attr( $value ) );
            }
        }
    
        // Create button Classes
        if( ! empty( $button_arr['btn_class'] ) && is_array( $button_arr['btn_class'] ) ) {
            array_walk( $button_arr['btn_class'], 'esc_attr' );
            $button_arr['btn_class'] = implode( ' ', $button_arr['btn_class'] );
        }
    
        // Display Button
        printf( '<a href="%1$s" class="%2$s"%3$s>%4$s</a>',
            $button_arr['btn_url'],
            esc_attr( $button_arr['btn_class'] ),
            ( ! empty( $button_atts ) ) ? $button_atts : '',
            $button_arr['btn_text']
        );
    
    }
    

    【讨论】:

    • 对于任何想要在实现某些东西之前手动尝试此操作的人,URL 将如下所示:your.url/checkout/?add-to-cart=PRODUCT_ID&amp;switch-subscription=ID_OF_ACTIVE_SUBSCRIPTION&amp;variation_id=VARIATION_ID_TO_CHANGE_TO&amp;item=LINE_ITEM_ID&amp;_wcsnonce=NONCE。您可以从/my-account的订阅切换区获取ID_OF_ACTIVE_SUBSCRIPTIONLINE_ITEM_IDNONCE
    猜你喜欢
    • 1970-01-01
    • 2012-08-06
    • 2023-04-05
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多