Please double check if the combination of codes are correct
Functions.php
cart) wc_load_cart();
$items = array();
foreach (WC()->cart->get_cart() as $ci_key => $ci) { $pid = isset($ci[‘product_id’]) ? (int)$ci[‘product_id’] : 0; $vid = isset($ci[‘variation_id’]) ? (int)$ci[‘variation_id’] : 0; $qty = isset($ci[‘quantity’]) ? wc_stock_amount($ci[‘quantity’]) : 0; $var = isset($ci[‘variation’]) && is_array($ci[‘variation’]) ? $ci[‘variation’] : array(); if ($pid && $qty > 0) { $items[] = array( ‘product_id’ => $pid, ‘variation_id’ => $vid, ‘variation’ => array_map(‘wc_clean’, $var), ‘quantity’ => $qty, ); } } return $items;
}
/**
从快照恢复购物车
*/
function pc_restore_cart_from_items($items) {
if (!WC()->cart) wc_load_cart();
WC()->cart->empty_cart();
foreach ((array)$items as $it) {
$pid = isset($it[‘product_id’]) ? (int)$it[‘product_id’] : 0;
$vid = isset($it[‘variation_id’]) ? (int)$it[‘variation_id’] : 0;
$qty = isset($it[‘quantity’]) ? wc_stock_amount($it[‘quantity’]) : 0;
$var = isset($it[‘variation’]) && is_array($it[‘variation’]) ? array_map(‘wc_clean’, $it[‘variation’]) : array();
if ($pid && $qty > 0) { WC()->cart->add_to_cart($pid, $qty, $vid, $var); }
}
WC()->cart->calculate_totals();
}
/**
生成瞬态键名
*/
function pc_transient_key($token) {
return ‘pc_partial_payload_’ . sanitize_key($token);
}
/* -------------------------------------------------
AJAX: 当购物车为空时恢复购物车
------------------------------------------------- */
add_action(‘wp_ajax_pc_rehydrate_cart’, ‘pc_rehydrate_cart’);
add_action(‘wp_ajax_nopriv_pc_rehydrate_cart’, ‘pc_rehydrate_cart’);
function pc_rehydrate_cart() {
check_ajax_referer(‘woocommerce-cart’, ‘security’);
$raw = isset($_POST[‘items’]) ? wp_unslash($_POST[‘items’]) : ‘’;
$items = is_string($raw) ? json_decode($raw, true) : (array)$raw;
if (!is_array($items)) {
wp_send_json_error(array(‘message’ => ‘无效的商品数据’), 400);
}
if (!WC()->cart) wc_load_cart();
if (!WC()->cart->is_empty()) {
wp_send_json_success(array(‘message’ => ‘购物车非空’));
}
foreach ($items as $it) {
$pid = isset($it[‘product_id’]) ? (int)$it[‘product_id’] : 0;
$vid = isset($it[‘variation_id’]) ? (int)$it[‘variation_id’] : 0;
$qty = isset($it[‘quantity’]) ? wc_stock_amount($it[‘quantity’]) : 0;
$var = isset($it[‘variation’]) && is_array($it[‘variation’]) ? array_map(‘wc_clean’, $it[‘variation’]) : array();
if ($pid && $qty > 0) { WC()->cart->add_to_cart($pid, $qty, $vid, $var); }
}
WC()->cart->calculate_totals();
wp_send_json_success(array(‘rehydrated’ => true));
}
/* -------------------------------------------------
AJAX: 更新商品数量 (无需刷新页面)
------------------------------------------------- */
add_action(‘wp_ajax_update_cart_item_qty’, ‘pc_update_cart_item_qty’);
add_action(‘wp_ajax_nopriv_update_cart_item_qty’, ‘pc_update_cart_item_qty’);
function pc_update_cart_item_qty() {
check_ajax_referer(‘woocommerce-cart’, ‘security’);
$key = isset($_POST[‘cart_item_key’]) ? wc_clean(wp_unslash($_POST[‘cart_item_key’])) : ‘’;
$qty = isset($_POST[‘qty’]) ? wc_stock_amount($_POST[‘qty’]) : null;
if (!$key || $qty === null) {
wp_send_json_error(array(‘message’ => ‘缺少参数’), 400);
}
if (!WC()->cart) wc_load_cart();
if ($qty <= 0) {
$removed = WC()->cart->remove_cart_item($key);
WC()->cart->calculate_totals();
wp_send_json_success(array(‘removed’ => (bool)$removed));
} else {
$set = WC()->cart->set_quantity($key, $qty, true);
WC()->cart->calculate_totals();
$cart_item = WC()->cart->get_cart_item($key); if (!$cart_item) { wp_send_json_error(array(‘message’ => ‘更新后找不到商品’), 404); } $_product = $cart_item[‘data’]; $subtotal_html = apply_filters(‘woocommerce_cart_item_subtotal’, WC()->cart->get_product_subtotal($_product, $cart_item[‘quantity’]), $cart_item, $key); $line_total_incl_tax = (float)($cart_item[‘line_total’] + $cart_item[‘line_tax’]); wp_send_json_success(array( ‘subtotal_html’ => $subtotal_html, ‘line_total_incl_tax’ => $line_total_incl_tax, ‘removed’ => false ));
}
}
/* -------------------------------------------------
AJAX: 删除选中商品
------------------------------------------------- */
add_action(‘wp_ajax_remove_selected_cart_items’, ‘pc_remove_selected_cart_items’);
add_action(‘wp_ajax_nopriv_remove_selected_cart_items’, ‘pc_remove_selected_cart_items’);
function pc_remove_selected_cart_items() {
check_ajax_referer(‘woocommerce-cart’, ‘security’);
$keys = isset($_POST[‘selected_items’]) ? (array) $_POST[‘selected_items’] : array();
if (!WC()->cart) wc_load_cart();
foreach ($keys as $k) {
$k = wc_clean(wp_unslash($k));
WC()->cart->remove_cart_item($k);
}
WC()->cart->calculate_totals();
wp_send_json_success(true);
}
/* -------------------------------------------------
AJAX: 清空购物车
------------------------------------------------- */
add_action(‘wp_ajax_empty_cart’, ‘pc_empty_cart’);
add_action(‘wp_ajax_nopriv_empty_cart’, ‘pc_empty_cart’);
function pc_empty_cart() {
check_ajax_referer(‘woocommerce-cart’, ‘security’);
if (!WC()->cart) wc_load_cart();
WC()->cart->empty_cart();
wp_send_json_success(true);
}
/* -------------------------------------------------
AJAX: 应用优惠券
------------------------------------------------- */
add_action(‘wp_ajax_apply_coupon’, ‘pc_apply_coupon’);
add_action(‘wp_ajax_nopriv_apply_coupon’, ‘pc_apply_coupon’);
function pc_apply_coupon() {
check_ajax_referer(‘woocommerce-cart’, ‘security’);
$code = isset($_POST[‘coupon_code’]) ? wc_format_coupon_code(wp_unslash($_POST[‘coupon_code’])) : ‘’;
if (!$code) {
wp_send_json_error(array(‘message’ => __(‘请输入优惠券代码’, ‘woocommerce’)), 400);
}
if (!WC()->cart) wc_load_cart();
$applied = WC()->cart->apply_coupon($code);
WC()->cart->calculate_totals();
if (is_wp_error($applied)) {
wp_send_json_error(array(‘message’ => $applied->get_error_message()), 400);
}
if (!$applied) {
wp_send_json_error(array(‘message’ => __(‘优惠券应用失败’, ‘woocommerce’)), 400);
}
wp_send_json_success(true);
}
/* -------------------------------------------------
AJAX: 创建部分结算订单
将快照和选中商品存储在瞬态中
将会话中的token标记
返回结账URL
------------------------------------------------- */
add_action(‘wp_ajax_create_direct_order’, ‘pc_create_direct_order’);
add_action(‘wp_ajax_nopriv_create_direct_order’, ‘pc_create_direct_order’);
function pc_create_direct_order() {
check_ajax_referer(‘woocommerce-cart’, ‘security’);
// 初始化会话
if (!WC()->session) {
WC()->session = new WC_Session_Handler();
WC()->session->init();
}
$selected_keys = isset($_POST[‘selected_items’]) ? (array) $_POST[‘selected_items’] : array();
if (empty($selected_keys)) {
wp_send_json_error(array(‘message’ => __(‘请选择要结算的商品’, ‘woocommerce’)), 400);
}
if (!WC()->cart) wc_load_cart();
// 创建完整购物车快照
$snapshot = pc_snapshot_current_cart();
// 提取选中商品
$selected = array();
foreach (WC()->cart->get_cart() as $ci_key => $ci) {
if (!in_array($ci_key, $selected_keys, true)) {
continue;
}
$pid = isset($ci[‘product_id’]) ? (int)$ci[‘product_id’] : 0; $vid = isset($ci[‘variation_id’]) ? (int)$ci[‘variation_id’] : 0; $qty = isset($ci[‘quantity’]) ? wc_stock_amount($ci[‘quantity’]) : 0; $var = isset($ci[‘variation’]) && is_array($ci[‘variation’]) ? array_map(‘wc_clean’, $ci[‘variation’]) : array(); if ($pid && $qty > 0) { $selected[] = array( ‘product_id’ => $pid, ‘variation_id’ => $vid, ‘variation’ => $var, ‘quantity’ => $qty, ); }
}
if (empty($selected)) {
wp_send_json_error(array(‘message’ => __(‘没有可结算的商品’, ‘woocommerce’)), 400);
}
$token = wp_generate_uuid4();
$payload = array(
‘uid’ => pc_get_cart_uid(),
‘snapshot’ => $snapshot,
‘selected’ => $selected,
‘created’ => time(),
);
set_transient(pc_transient_key($token), $payload, 2 * DAY_IN_SECONDS);
// 将token存入会话
if (method_exists(WC()->session, ‘set’)) {
WC()->session->set(‘pc_partial_token’, $token);
}
$checkout_url = add_query_arg(‘pc_token’, rawurlencode($token), wc_get_checkout_url());
wp_send_json_success(array(‘checkout_url’ => $checkout_url));
}
/* -------------------------------------------------
结账流程处理
根据token虚拟化购物车
处理前确保重新虚拟化
订单标记token
感谢页重建购物车
返回购物车时恢复快照
------------------------------------------------- */
// 进入结账页时虚拟化购物车
add_action(‘woocommerce_before_checkout_form’, ‘pc_virtualize_cart_on_checkout’, 1);
function pc_virtualize_cart_on_checkout() {
if (!isset($_GET[‘pc_token’])) return;
$token = sanitize_text_field(wp_unslash($_GET[‘pc_token’]));
$payload = get_transient(pc_transient_key($token));
if (empty($payload) || empty($payload[‘selected’])) return; if (!WC()->cart) wc_load_cart(); // 仅加载选中商品 pc_restore_cart_from_items($payload[‘selected’]); // 持久化token用于后续AJAX调用 if (method_exists(WC()->session, ‘set’)) { WC()->session->set(‘pc_partial_token’, $token); }
}
// 订单处理前再次确保虚拟化
add_action(‘woocommerce_before_checkout_process’, ‘pc_revirtualize_before_processing’, 1);
function pc_revirtualize_before_processing() {
if (!method_exists(WC()->session, ‘get’)) return;
$token = WC()->session->get(‘pc_partial_token’);
if (!$token) return;
$payload = get_transient(pc_transient_key($token)); if (empty($payload) || empty($payload[‘selected’])) return; pc_restore_cart_from_items($payload[‘selected’]);
}
// 订单标记token
add_action(‘woocommerce_checkout_create_order’, ‘pc_tag_order_with_token’, 10, 1);
function pc_tag_order_with_token($order) {
$token = null;
if (isset($_GET[‘pc_token’])) {
$token = sanitize_text_field(wp_unslash($_GET[‘pc_token’]));
} elseif (method_exists(WC()->session, ‘get’)) {
$token = WC()->session->get(‘pc_partial_token’);
}
if ($token) { $order->update_meta_data(‘_pc_partial_token’, $token); }
}
// 感谢页重建购物车
add_action(‘woocommerce_thankyou’, ‘pc_rebuild_cart_on_thankyou’, 20);
function pc_rebuild_cart_on_thankyou($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$token = $order->get_meta(‘_pc_partial_token’); if (!$token) return; $payload = get_transient(pc_transient_key($token)); if (empty($payload) || empty($payload[‘snapshot’])) { // 清理会话token if (method_exists(WC()->session, ‘set’)) { WC()->session->set(‘pc_partial_token’, null); } delete_transient(pc_transient_key($token)); return; } // 创建已购商品映射表 $purchased = array(); foreach ($order->get_items() as $item) { $pid = (int)$item->get_product_id(); $vid = (int)$item->get_variation_id(); $qty = (int)$item->get_quantity(); $k = pc_build_item_key($pid, $vid); if (!isset($purchased[$k])) $purchased[$k] = 0; $purchased[$k] += $qty; } // 剩余商品 = 快照 - 已购 $remainder = array(); foreach ($payload[‘snapshot’] as $it) { $pid = isset($it[‘product_id’]) ? (int)$it[‘product_id’] : 0; $vid = isset($it[‘variation_id’]) ? (int)$it[‘variation_id’] : 0; $qty = isset($it[‘quantity’]) ? wc_stock_amount($it[‘quantity’]) : 0; $var = isset($it[‘variation’]) ? $it[‘variation’] : array(); $k = pc_build_item_key($pid, $vid); $take = isset($purchased[$k]) ? (int)$purchased[$k] : 0; $left = max(0, $qty - $take); if ($left > 0) { $remainder[] = array( ‘product_id’ => $pid, ‘variation_id’ => $vid, ‘variation’ => $var, ‘quantity’ => $left, ); $purchased[$k] = max(0, $take - $qty); } } // 重建剩余商品的购物车 pc_restore_cart_from_items($remainder); // 清理会话token if (method_exists(WC()->session, ‘set’)) { WC()->session->set(‘pc_partial_token’, null); } delete_transient(pc_transient_key($token));
}
/* -------------------------------------------------
支付取消处理
当订单取消时恢复原始购物车
------------------------------------------------- */
add_action(‘woocommerce_cancelled_order’, ‘pc_restore_cart_on_cancellation’);
function pc_restore_cart_on_cancellation($order_id) {
$order = wc_get_order($order_id);
if (!$order) return;
$token = $order->get_meta(‘_pc_partial_token’);
if (!$token) return;
$payload = get_transient(pc_transient_key($token));
if (empty($payload) || empty($payload[‘snapshot’])) {
delete_transient(pc_transient_key($token));
return;
}
// 恢复完整购物车快照
pc_restore_cart_from_items($payload[‘snapshot’]);
// 清理会话token
if (method_exists(WC()->session, ‘set’)) {
WC()->session->set(‘pc_partial_token’, null);
}
delete_transient(pc_transient_key($token));
}
/* -------------------------------------------------
跨标签页购物车同步
使用localStorage实现
------------------------------------------------- */
add_action(‘wp_footer’, function() {
if (!class_exists(‘WooCommerce’)) return;
?>
session->get(‘original_cart’)) {
$data[‘count’] = count($original);
}
return $data;
});
/* -------------------------------------------------
辅助函数:生成UUIDv4
------------------------------------------------- */
if (!function_exists(‘wp_generate_uuid4’)) {
function wp_generate_uuid4() {
return sprintf(‘%04x%04x-%04x-%04x-%04x-%04x%04x%04x’,
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
}
}
/* -------------------------------------------------
会话初始化保障
------------------------------------------------- */
add_action(‘woocommerce_init’, function() {
if (!WC()->session) {
WC()->session = new WC_Session_Handler();
WC()->session->init();
}
});
Cart.php
" method=“post”>
<input type="hidden" id="selected_items" name="selected_items" value=""> do_action(‘woocommerce_before_cart’);
// Provide tiny context for JS (invisible; no layout change)
$pc_cart_is_empty = WC()->cart->is_empty();
function pc_uid_for_view() {
if (is_user_logged_in()) return ‘user_’ . get_current_user_id();
if (empty($_COOKIE[‘pc_cart_uid’])) {
$token = wp_generate_uuid4();
setcookie(‘pc_cart_uid’, $token, time() + YEAR_IN_SECONDS, COOKIEPATH ?: ‘/’, ‘’, is_ssl(), false);
$COOKIE[‘pc_cart_uid’] = $token;
}
return 'guest’ . sanitize_text_field(wp_unslash($_COOKIE[‘pc_cart_uid’]));
}
$pc_uid = pc_uid_for_view();
?>
<div class="cart-page-section container" style="max-width: 1200px; margin: 0 auto;"> <form class="woocommerce-cart-form" action="<?php echo esc_url( wc_get_cart_url() ); ?>" method="post"> cart->get_cart() as $cart_item_key => $cart_item ) : ?> exists() && $cart_item['quantity'] > 0 && apply_filters('woocommerce_cart_item_visible', true, $cart_item, $cart_item_key) ) : $product_permalink = apply_filters('woocommerce_cart_item_permalink', $_product->is_visible() ? $_product->get_permalink($cart_item) : '', $cart_item, $cart_item_key); $line_total_value = (float) ($cart_item['line_total'] + $cart_item['line_tax']); $variation_id = isset($cart_item['variation_id']) ? (int)$cart_item['variation_id'] : 0; $variation_data = isset($cart_item['variation']) ? $cart_item['variation'] : array(); $variation_json = wp_json_encode($variation_data); ?> <table class="shop_table shop_table_responsive cart woocommerce-cart-form__contents"> <thead> <tr> <th class="product-select" style="width: 8%;"> <input type="checkbox" id="select-all-items"> <label for="select-all-items" style="display: inline-block; margin-left: 5px; cursor: pointer;">全选</label> </th> <th class="product-info"></th> <th class="product-price"></th> <th class="product-quantity"></th> <th class="product-subtotal"></th> <th class="product-remove"></th> </tr> </thead> <tbody> <tr class="woocommerce-cart-form__cart-item <?php echo esc_attr( apply_filters('woocommerce_cart_item_class', 'cart_item', $cart_item, $cart_item_key) ); ?>" data-cart_item_key="<?php echo esc_attr($cart_item_key); ?>" data-product_id="<?php echo esc_attr($product_id); ?>" data-variation_id="<?php echo esc_attr($variation_id); ?>" data-variation="<?php echo esc_attr($variation_json); ?>"> <td class="product-select" data-title="<?php esc_attr_e('Select', 'woocommerce'); ?>"> <input type="checkbox" class="item-checkbox" name="selected_items[]" value="<?php echo esc_attr($cart_item_key); ?>" data-price="<?php echo esc_attr($line_total_value); ?>"> </td> <td class="product-info" data-title="<?php esc_attr_e('Product', 'woocommerce'); ?>"> <div class="product-image"> get_image(), $cart_item, $cart_item_key); if ( ! $product_permalink ) : echo $thumbnail; // PHPCS: XSS ok. else : printf('<a href="%s">%s</a>', esc_url($product_permalink), $thumbnail); // PHPCS: XSS ok. endif; ?> </div> <div class="product-name"> get_name(), $cart_item, $cart_item_key) . ' ' ); else : echo wp_kses_post( apply_filters('woocommerce_cart_item_name', sprintf('<a href="%s">%s</a>', esc_url($product_permalink), $_product->get_name()), $cart_item, $cart_item_key) ); endif; do_action('woocommerce_after_cart_item_name', $cart_item, $cart_item_key); echo wc_get_formatted_cart_item_data($cart_item); // PHPCS: XSS ok. ?> </div> </td> <td class="product-price" data-title="<?php esc_attr_e('Price', 'woocommerce'); ?>"> cart->get_product_price($_product), $cart_item, $cart_item_key); // PHPCS: XSS ok. ?> </td> <td class="product-quantity" data-title="<?php esc_attr_e('Quantity', 'woocommerce'); ?>"> is_sold_individually() ) : $product_quantity = sprintf('1 <input type="hidden" name="cart[%s][qty]" value="1">', $cart_item_key); else : $product_quantity = woocommerce_quantity_input( array( 'input_name' => "cart[{$cart_item_key}][qty]", 'input_value' => $cart_item['quantity'], 'max_value' => $_product->get_max_purchase_quantity(), 'min_value' => '0', 'product_name' => $_product->get_name(), ), $_product, false ); endif; echo apply_filters('woocommerce_cart_item_quantity', $product_quantity, $cart_item_key, $cart_item); // PHPCS: XSS ok. ?> <small class="qty-status" style="display:none;margin-left:8px;color:#666;">保存中…</small> </td> <td class="product-subtotal" data-title="<?php esc_attr_e('Subtotal', 'woocommerce'); ?>"> cart->get_product_subtotal($_product, $cart_item['quantity']), $cart_item, $cart_item_key); // PHPCS: XSS ok. ?> </td> <td class="product-remove" data-title="<?php esc_attr_e('操作', 'woocommerce'); ?>"> ×', esc_url( wc_get_cart_remove_url($cart_item_key) ), esc_attr__('Remove this item', 'woocommerce'), esc_attr($product_id), esc_attr($_product->get_sku()) ), $cart_item_key); ?> </td> </tr> </tbody> </table> </form> </div> <div class="cart-footer-actions sticky-footer" style="position: sticky; bottom: 0; background: white; padding: 15px; border-top: 1px solid #ddd; max-width: 1200px; margin: 0 auto;"> <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> <div class="footer-left"> <input type="checkbox" id="footer-select-all"> <label for="footer-select-all" style="display: inline-block; margin-left: 5px; cursor: pointer;">全选</label> <button type="button" class="button" id="remove-selected-items">刪除選中的商品</button> <button type="button" class="button" id="clear-cart">清空購物車</button> </div> <div class="coupon-section"> <input type="text" name="coupon_code" class="input-text" id="coupon_code" value="" placeholder="输入优惠券代码" style="padding: 8px; width: 200px; border: 1px solid #ddd; border-radius: 4px; margin-right: 5px;"> <button type="button" class="button" id="apply-coupon">应用优惠券</button> </div> </div> <div style="display: flex; justify-content: space-between; align-items: center;"> <div class="selected-summary" style="font-size: 16px; font-weight: bold;"> 已选商品: <span id="selected-count">0</span> 件,共计: <span id="selected-total">RM0.00</span> </div> <a href="<?php echo esc_url( wc_get_checkout_url() ); ?>" class="checkout-button button alt wc-forward" id="partial-checkout">结算</a> </div> </div> form-checkout.php session) return;
// 从会话获取选中商品 $selected_keys = WC()->session->get(‘pc_selected_items’) ?: []; // 存储原始购物车 if(empty(WC()->session->get(‘original_cart’))) { WC()->session->set(‘original_cart’, WC()->cart->get_cart()); // 创建临时结账购物车 $checkout_cart = []; foreach(WC()->cart->get_cart() as $key => $item) { if(in_array($key, $selected_keys)) { $checkout_cart[$key] = $item; } } WC()->session->set(‘checkout_cart’, $checkout_cart); // 更新实际购物车 WC()->cart->empty_cart(); foreach($checkout_cart as $key => $item) { WC()->cart->add_to_cart( $item[‘product_id’], $item[‘quantity’], $item[‘variation_id’], $item[‘variation’] ); } }
}, 5);
if ( ! defined( ‘ABSPATH’ ) ) {
exit;
}
//WC 3.5.0
if ( function_exists( ‘WC’ ) && version_compare( WC()->version, ‘3.5.0’, ‘<’ ) ) {
wc_print_notices();
}
do_action( ‘woocommerce_before_checkout_form’, $checkout );
// If checkout registration is disabled and not logged in, the user cannot checkout.
if ( ! $checkout->is_registration_enabled() && $checkout->is_registration_required() && ! is_user_logged_in() ) {
echo esc_html( apply_filters( ‘woocommerce_checkout_must_be_logged_in_message’, __( ‘You must be logged in to checkout.’, ‘woocommerce’ ) ) );
return;
}
// filter hook for include new pages inside the payment method
$get_checkout_url = apply_filters( ‘woocommerce_get_checkout_url’, wc_get_checkout_url() ); ?>
<form name="checkout" method="post" class="checkout woocommerce-checkout" action="<?php echo esc_url( $get_checkout_url ); ?>" enctype="multipart/form-data" aria-label="<?php echo esc_attr__( 'Checkout', 'woocommerce' ); ?>"> get_checkout_fields() ) : ?> <div class="customer-details" id="customer_details"> </div> <div class="checkout-order-review"> <h3 id="order_review_heading"></h3> <div id="order_review" class="woocommerce-checkout-review-order"> </div> </div> </form> order-create.php session) return;
$checkout_cart = WC()->session->get(‘checkout_cart’) ?: []; $original_cart = WC()->session->get(‘original_cart’) ?: []; // 从原始购物车移除已结算商品 foreach($checkout_cart as $key => $item) { if(isset($original_cart[$key])) { unset($original_cart[$key]); } } // 更新实际购物车 WC()->cart->empty_cart(); foreach($original_cart as $key => $item) { WC()->cart->add_to_cart( $item[‘product_id’], $item[‘quantity’], $item[‘variation_id’], $item[‘variation’], // 必须包含变体属性 $item[‘cart_item_data’]
);
}
// 清理session WC()->session->__unset(‘original_cart’); WC()->session->__unset(‘checkout_cart’);
}
payment-cancel.php
session->get(‘original_cart’)) {
WC()->cart->empty_cart();
foreach($original_cart as $key => $item) {
WC()->cart->add_to_cart(
$item[‘product_id’],
$item[‘quantity’],
$item[‘variation_id’],
$item[‘variation’],
$item[‘cart_item_data’]
);
}
}
// 清理session WC()->session->__unset(‘original_cart’); WC()->session->__unset(‘checkout_cart’); // 重定向到购物车 wp_redirect(wc_get_cart_url()); exit; }
}
these are the full code for these file. If wrong, please give me the full code to be replaced with the current one.