WooCommerce点击加购直接跳转PayPal购物车及钩子替代方案咨询
替代方案:实现商品页点击「加入购物车」直接跳转PayPal购物车(WooCommerce PayPal Payments)
核心思路
放弃依赖旧的woocommerce_paypal_args钩子,改为拦截默认加入购物车行为,通过PayPal Payments插件的内置功能或直接构造结账链接,完成商品添加并跳转至PayPal页面。
方案1:改造PayPal快速结账按钮(推荐)
利用PayPal Payments自带的快速结账功能,替换商品页默认的「加入购物车」按钮,点击直接进入PayPal结账流程:
- 隐藏默认加入购物车按钮
add_action('woocommerce_single_product_summary', function() { // 移除默认加入购物车按钮的渲染动作 remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30); }, 20);
- 在原位置输出PayPal快速结账按钮
add_action('woocommerce_single_product_summary', function() { global $product; // 仅对简单商品生效,可自行扩展到可变商品 if ($product->is_type('simple')) { echo '<div class="paypal-direct-checkout">'; // 调用插件内置模板生成结账按钮 wc_get_template('single-product/paypal-button.php', [ 'product' => $product, 'button_type' => 'checkout', // 指定为直接结账类型 ]); echo '</div>'; } }, 30);
方案2:拦截加入购物车请求并跳转
保留原「加入购物车」按钮外观,拦截点击后的请求,添加商品到购物车后直接跳转至PayPal结账:
add_action('template_redirect', function() { // 仅处理商品页的加入购物车POST请求 if (is_product() && isset($_POST['add-to-cart']) && !empty($_POST['add-to-cart'])) { $product_id = absint($_POST['add-to-cart']); $product = wc_get_product($product_id); if (!$product || !$product->is_purchasable()) return; // 清空现有购物车(可选,根据需求保留或移除) WC()->cart->empty_cart(); // 添加当前商品到购物车 WC()->cart->add_to_cart($product_id); // 构造PayPal Payments快速结账URL $paypal_checkout_url = wc_get_checkout_url() . '?paypal_payments_action=express_checkout'; wp_safe_redirect($paypal_checkout_url); exit; } });
方案3:调用PayPal REST API直接生成订单
需要更灵活控制时,直接调用PayPal API创建订单并跳转:
add_action('template_redirect', function() { if (is_product() && isset($_POST['add-to-cart']) && !empty($_POST['add-to-cart'])) { $product_id = absint($_POST['add-to-cart']); $product = wc_get_product($product_id); if (!$product) return; // 从插件设置中获取PayPal API凭证 $paypal_settings = get_option('woocommerce_ppcp_settings'); $client_id = $paypal_settings['client_id']; $client_secret = $paypal_settings['client_secret']; $env = $paypal_settings['environment'] === 'sandbox' ? 'sandbox' : 'live'; // 获取API访问令牌 $token_url = $env === 'sandbox' ? 'https://api-m.sandbox.paypal.com/v1/oauth2/token' : 'https://api-m.paypal.com/v1/oauth2/token'; $token_res = wp_remote_post($token_url, [ 'headers' => [ 'Authorization' => 'Basic ' . base64_encode($client_id . ':' . $client_secret), 'Content-Type' => 'application/x-www-form-urlencoded', ], 'body' => 'grant_type=client_credentials', ]); if (is_wp_error($token_res)) return; $token_data = json_decode(wp_remote_retrieve_body($token_res), true); $access_token = $token_data['access_token']; // 创建PayPal订单 $order_url = $env === 'sandbox' ? 'https://api-m.sandbox.paypal.com/v2/checkout/orders' : 'https://api-m.paypal.com/v2/checkout/orders'; $order_res = wp_remote_post($order_url, [ 'headers' => [ 'Authorization' => 'Bearer ' . $access_token, 'Content-Type' => 'application/json', ], 'body' => json_encode([ 'intent' => 'CAPTURE', 'purchase_units' => [[ 'amount' => [ 'currency_code' => get_woocommerce_currency(), 'value' => $product->get_price(), ], 'description' => $product->get_name(), ]], 'application_context' => [ 'return_url' => wc_get_checkout_url() . '?paypal_return=1', 'cancel_url' => get_permalink($product_id), ], ]), ]); if (is_wp_error($order_res)) return; $order_data = json_decode(wp_remote_retrieve_body($order_res), true); // 跳转至PayPal订单确认页 foreach ($order_data['links'] as $link) { if ($link['rel'] === 'approve') { wp_safe_redirect($link['href']); exit; } } } });
注意事项
- 方案1依赖插件内置模板,需确保PayPal Payments为最新版本,避免模板路径变更。
- 方案2中的
paypal_payments_action=express_checkout是插件识别快速结账的标识,不同版本可能有差异,需测试验证。 - 方案3需确保服务器支持
wp_remote_post,且PayPal API凭证配置正确。 - 所有代码建议添加到主题
functions.php或自定义插件中,不要修改核心文件。
内容的提问来源于stack exchange,提问作者Pushan
相关产品推荐
相关产品推荐

