programing

구독 전환 - 카트에 직접 추가

telecom 2023. 10. 12. 21:48
반응형

구독 전환 - 카트에 직접 추가

단일 제품 페이지를 무시하려고 해서 구독을 위한 사용자 지정 템플릿 페이지를 만들었습니다.이 페이지에서는 사용자가 특정 구독을 등록하거나 구독을 전환할 수 있도록 버튼을 생성하고 있습니다.제가 직면한 문제는 단일 제품 페이지가 아니라 스위치 서브스크립션 URL을 카트로 이동하는 것입니다.

카트 URL에 가입 추가가 표시되지 않은 경우 아래 기능은 사용자가 로그인되어 있는지 테스트합니다. 스위치 가입 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개 있습니다.정확한 URL을 생성하기 위해 Variation ID를 이 함수에 전달합니다.

여기 있습니다.제품, 사용자 서브스크립션 ID, 새 서브스크립션 ID, 서브스크립션 오더 라인 번호 및 논스와 같은 특정 URL 인수를 사용하여 카트에 추가할 수 있습니다.우리는 구독을 변형으로 하는 단일 제품에 대해 이 작업을 하지 않았습니까?이는 다른 구독 사례에서 수정해야 할 수도 있지만 향후 누군가에게 도움이 되기를 바랍니다.

/**
 * 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 : https://stackoverflow.com/questions/48327381/switch-subscription-add-directly-to-cart

반응형