首次结帐 woocommerce stripe 后尚未生成付款

问题描述 投票:0回答:1

用户通过 upsell-3 页面后,我需要为他们生成付款。因为它总是在第一个结帐流程页面之后生成。也许我需要用钩子 woocommerce_checkout_order_created 修改函数,因为它在付款生成之前进行?或者与generate_ payment_request函数有关?

add_action('woocommerce_checkout_order_created', 'set_wc_session_original_order_id');
function set_wc_session_original_order_id( $order ) {
    WC()->session->set('original_order_id', $order->get_id());
}

add_action( 'wp_footer', function () {
    if ( ! is_user_logged_in() ) {
        ?>
        <script>
            jQuery('#wc-stripe-new-payment-method').prop('checked', true);
        </script>
        <?php
    }
} );



add_action('template_redirect', 'custom_shop_order_process_redirects');
function custom_shop_order_process_redirects() {
    if ( is_page('upsell-1') && isset($_GET['woocommerce_checkout_place_order']) ) {
        $order_id = WC()->session->get('original_order_id');
        $selected_product_id = isset($_GET['selected_product_id']) ? sanitize_text_field($_GET['selected_product_id']) : '';
        if ( $order_id > 0 && !empty($selected_product_id) ) {
            $order = wc_get_order($order_id);
            $order->add_product(wc_get_product($selected_product_id));
            $order->calculate_totals();
            WC()->session->set('upsell-1-viewed', true);
            wp_redirect('/upsell-2');
            exit;
        }
    } elseif ( is_page('upsell-2') && isset($_GET['woocommerce_checkout_place_order']) ) {
        $order_id = WC()->session->get('original_order_id');
        $selected_product_id = isset($_GET['selected_product_id']) ? sanitize_text_field($_GET['selected_product_id']) : '';
        if ( $order_id > 0 && !empty($selected_product_id) ) {
            $order = wc_get_order($order_id);
            $order->add_product(wc_get_product($selected_product_id));
            $order->calculate_totals();
            WC()->session->set('upsell-2-viewed', true);
            wp_redirect('/upsell-3');
            exit;
        }
    } elseif ( is_page('upsell-3') && isset($_GET['woocommerce_checkout_place_order']) ) {
        $order_id = WC()->session->get('original_order_id');
        $selected_product_id = isset($_GET['selected_product_id']) ? sanitize_text_field($_GET['selected_product_id']) : '';
        if ( $order_id > 0  && !empty($selected_product_id) ) {
            $order = wc_get_order($order_id);
            $order->add_product(wc_get_product($selected_product_id));
            $order->calculate_totals();
            WC()->session->set('upsell-3-viewed', true);
            WC()->session->__unset('original_order_id');
            wp_redirect($order->get_checkout_order_received_url());
            exit;
        }
    }
    
    
    
    
    
    if ( is_page('upsell-1') && isset($_GET['upsell_decline_offer']) ) {
        $order_id = WC()->session->get('original_order_id');
        if ( $order_id > 0 ) {
            WC()->session->set('upsell-1-viewed', true);
            wp_redirect('/upsell-2');
            exit;
        }
    } elseif(is_page('upsell-2') && isset($_GET['upsell_decline_offer'])){
        $order_id = WC()->session->get('original_order_id');        
        if ( $order_id > 0 ) {
            WC()->session->set('upsell-2-viewed', true);
            wp_redirect('/upsell-3');
            exit;
        }
    } elseif(is_page('upsell-3') && isset($_GET['upsell_decline_offer'])){
        $order_id = WC()->session->get('original_order_id');        
        if ( $order_id > 0 ) {
            $order = wc_get_order($order_id);
            WC()->session->set('upsell-3-viewed', true);
            WC()->session->__unset('original_order_id');
            wp_redirect($order->get_checkout_order_received_url());
            exit;   
        }        

    }
    
    
    
    
    
}

add_action('woocommerce_thankyou', 'check_if_upsell_was_viewed', 20);
function check_if_upsell_was_viewed(){
    if ( is_wc_endpoint_url('order-received') ) {
        if(WC()->session->__isset('original_order_id')){
            wp_redirect('/upsell-1');
            if(WC()->session->__isset('upsell-1-viewed')){
                wp_redirect('/upsell-2'); 
                exit;
            } elseif(WC()->session->__isset('upsell-2-viewed')){
                wp_redirect('/upsell-3');
                exit;
            } elseif(WC()->session->__isset('upsell-3-viewed')){
              $order_id = WC()->session->get('original_order_id');
              wp_redirect($order->get_checkout_order_received_url());
              exit;
            }
        }
    }
}

add_action('template_redirect', 'check_if_order_exists_for_upsells');
function check_if_order_exists_for_upsells(){
    if (!WC()->session->__isset('original_order_id')) {
        if (is_page('upsell-1') || is_page('upsell-2') || is_page('upsell-3')) {
             wp_redirect(home_url());
             exit; 
        }
    }
}
php woocommerce stripe-payments hook-woocommerce
1个回答
0
投票

我建议修改 WooCommerce 结帐流程,在

"upsell-3"
页面之后启动付款生成,方法是在 PHP 代码中添加函数调用以在该页面的现有条件逻辑内处理付款。试试下面

elseif ( is_page('upsell-3') && isset($_GET['woocommerce_checkout_place_order']) ) {
     $order_id = WC()->session->get('original_order_id');
     $selected_product_id = isset($_GET['selected_product_id']) ? sanitize_text_field($_GET['selected_product_id']) : '';
     if ( $order_id > 0  && !empty($selected_product_id) ) {
         $order = wc_get_order($order_id);
         $order->add_product(wc_get_product($selected_product_id));
         $order->calculate_totals();

         // Assuming this function exists and handles payment generation
         generate_payment_request($order); 

         WC()->session->set('upsell-3-viewed', true);
         WC()->session->__unset('original_order_id');
         wp_redirect($order->get_checkout_order_received_url());
         exit;
     }
 }
© www.soinside.com 2019 - 2024. All rights reserved.