WooCommerce:根据所选支付方式修改结账按钮文本遇问题求助
WooCommerce 按支付方式修改结账提交按钮文本解决方案
问题根源
之前的代码失效或文本自动恢复,是因为WooCommerce结账页在切换支付方式时会触发AJAX刷新,部分前端脚本会重置提交按钮的默认文本,只靠PHP钩子无法持久化修改。
完整解决方案(PHP + JavaScript)
以下代码可实现:页面加载时根据默认选中的支付方式设置按钮文本,切换支付方式时实时更新,同时避免AJAX刷新导致的文本重置。
1. PHP 代码(添加到主题functions.php或自定义插件)
// 注册支付方式对应的按钮文本,方便后续调用 function wc_get_payment_button_texts() { return array( 'cod' => '确认订单,货到付款', 'cheque' => '提交订单,等待支票付款', 'bacs' => '提交订单,完成银行转账', 'paypal' => '前往PayPal完成支付' // 可按需添加更多支付方式 ); } // 初始加载时设置默认按钮文本 add_filter('woocommerce_order_button_text', 'wc_set_default_payment_button_text'); function wc_set_default_payment_button_text($default_text) { $available_gateways = WC()->payment_gateways()->get_available_payment_gateways(); $selected_method = WC()->session->get('chosen_payment_method'); // 如果有选中的支付方式,返回对应文本,否则用默认 if ($selected_method && isset(wc_get_payment_button_texts()[$selected_method])) { return wc_get_payment_button_texts()[$selected_method]; } // 无选中状态时,默认显示第一个可用支付方式的文本(可选) foreach ($available_gateways as $gateway) { if (isset(wc_get_payment_button_texts()[$gateway->id])) { return wc_get_payment_button_texts()[$gateway->id]; } } return $default_text; } // 将按钮文本数据传递到前端JS add_action('wp_footer', 'wc_pass_payment_button_texts_to_js'); function wc_pass_payment_button_texts_to_js() { if (!is_checkout() || is_wc_endpoint_url()) return; wp_localize_script('jquery', 'wcPaymentButtonTexts', array( 'texts' => wc_get_payment_button_texts(), 'defaultText' => __('Place order', 'woocommerce') // WooCommerce默认按钮文本 )); }
2. JavaScript 代码(添加到主题自定义JS或通过PHP输出)
jQuery(document).ready(function($) { // 定义更新按钮文本的核心函数 function updateCheckoutButtonText() { var selectedMethod = $('input[name="payment_method"]:checked').val(); var $submitButton = $('button#place_order'); if (selectedMethod && wcPaymentButtonTexts.texts[selectedMethod]) { $submitButton.text(wcPaymentButtonTexts.texts[selectedMethod]); } else { $submitButton.text(wcPaymentButtonTexts.defaultText); } } // 页面加载完成后执行一次 updateCheckoutButtonText(); // 监听支付方式切换事件 $('form.checkout').on('change', 'input[name="payment_method"]', function() { updateCheckoutButtonText(); // 延迟执行,规避WooCommerce AJAX刷新后的文本重置 setTimeout(updateCheckoutButtonText, 500); }); // 监听结账页面的AJAX更新事件(如更新购物车、计算运费后) $(document.body).on('updated_checkout', function() { updateCheckoutButtonText(); }); });
使用说明
- PHP代码添加到当前主题的
functions.php文件,或创建自定义插件引入。 - JavaScript代码可通过主题的自定义JS功能添加,或用
wp_add_inline_script钩子绑定到前端(推荐后者,避免JS加载顺序问题)。 - 根据需求修改
wc_get_payment_button_texts()函数中的支付方式ID和对应文本。
内容的提问来源于stack exchange,提问作者Brad Harley
相关产品推荐
相关产品推荐

