用户通过 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;
}
}
}
我建议修改 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;
}
}