在结帐页面上显示付款方式,默认情况下会自动选择第一个付款方式。我需要阻止选择,因此WC最初没有选择付款方式。
到目前为止我尝试了两件事:
jQuery:
jQuery('。payment_methods input.input-radio')。prop('checked',false);
结果:
[<input id="payment_method_paypal" type="radio" class="input-radio" name="payment_method" value="paypal" data-order_button_text="Proceed to PayPal" checked="checked">,
<input id="payment_method_accountfunds" type="radio" class="input-radio" name="payment_method" value="accountfunds" data-order_button_text>]
从payment-method.php Woocommerce模板文件中删除代码:
选中($ gateway-&gt;选择,false);
两者都没有效果。怎么做?请问有什么片段或建议吗?
编辑:
还试过这个:
function wpchris_filter_gateways( $gateways ){
global $woocommerce;
foreach ($gateways as $gateway) {
$gateway->chosen = 0;
}
return $gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'wpchris_filter_gateways', 1);
答案 0 :(得分:4)
好的,搞定了。方法如下:
/wp-content/plugins/woocommerce/assets/js/frontend/checkout.js
进入:
/wp-content/themes/Your-Theme/woocommerce/js/checkout.js
打开新创建的文件并搜索以下代码:
if ($('.woocommerce-checkout').find('input[name=payment_method]:checked').size() === 0) {
$('.woocommerce-checkout').find('input[name=payment_method]:eq(0)').attr('checked', 'checked');
}
它应该在第298行附近。继续发表评论。
将其添加到functions.php文件中:
function wpchris_override_woo_checkout_scripts() {
wp_deregister_script('wc-checkout');
wp_enqueue_script('wc-checkout', get_stylesheet_directory_uri() . '/woocommerce/js/checkout.js', array('jquery', 'woocommerce', 'wc-country-select', 'wc-address-i18n'), null, true);
}
add_action('wp_enqueue_scripts', 'wpchris_override_woo_checkout_scripts');
function wpchris_unselect_payment_method() {
echo "<script>jQuery( '.payment_methods input.input-radio' ).removeProp('checked');</script>";
}
add_action('woocommerce_review_order_before_submit','wpchris_unselect_payment_method' );
function wpchris_filter_gateways( $gateways ){
global $woocommerce;
foreach ($gateways as $gateway) {
$gateway->chosen = 0;
}
return $gateways;
}
add_filter( 'woocommerce_available_payment_gateways', 'wpchris_filter_gateways', 1);
现在,刷新Checkout页面时不应检查默认付款方式。
答案 1 :(得分:2)
我有同样的问题,我已经解决了这个问题:
使用我的子主题checkout-override-js覆盖checkout-js文件。
然后注释掉以下代码:
行:48:this.init_payment_methods();
行:58:
init_payment_methods: function() {
var $payment_methods = $( '.woocommerce-checkout' ).find( 'input[name="payment_method"]' );
// If there is one method, we can hide the radio input
if ( 1 === $payment_methods.size() ) {
$payment_methods.eq(0).hide();
}
// If there are none selected, select the first.
if ( 0 === $payment_methods.filter( ':checked' ).size() ) {
$payment_methods.eq(0).attr( 'checked', 'checked' );
}
// Trigger click event for selected method
$payment_methods.filter( ':checked' ).eq(0).trigger( 'click' );
},
行:113:wc_checkout_form.init_payment_methods();
这将删除默认的付款方式选择。您可以使用这些代码使其符合您的要求。
答案 2 :(得分:2)
没有通过过滤器实现此目标的好方法,这不适用于最新版本的woocommerce 4.x:
//DEPRECATED. Will not work with woocommerce 4.x and above
add_filter( 'pre_option_woocommerce_default_gateway' . '__return_false', 99 );
而不是像其他答案所建议的那样覆盖Woocommerce核心JS文件,而是这样做:
var $paymentCheckboxes = $( ".woocommerce-checkout-payment" ).find( '[name="payment_method"]');
$paymentCheckboxes.attr('checked', false);
答案 3 :(得分:0)
补充@Tosh答案,但添加了JavaScript回调,因此它每次通过ajax进行结帐更新时都会运行。
jQuery(document).ready(function( $ ){
$( document ).on( 'updated_checkout', function() {
var $paymentCheckboxes = $( ".woocommerce-checkout-payment" ).find( '[name="payment_method"]');
$paymentCheckboxes.attr('checked', false);
$('.payment_box').hide();
});
});
经过测试,可以正常工作。
答案 4 :(得分:0)
这些解决方案都不适合我。
我的解决方案是:
让 WooCommerce 表现得像它想要的那样
我在列表顶部添加了一个付款选项(在本例中为 COD)。
使用 CSS,我隐藏了整个 <li>
然后我在“woocommerce_after_checkout_validation”中添加了验证。 如果用户选择了这个,我只是返回了“未选择付款”的错误
似乎工作得很好。
答案 5 :(得分:-1)
在payment-method.php
中,我只是注释掉了这一部分(WooCommerce 4.5.2的第23行)
<?php //checked( $gateway->chosen, true ); ?>
(如果您有子主题,请将修改后的文件放入wp-content/themes/yourchildtheme/woocommerce/checkout/ directory
。)
和
也需要在checkout.min.js
(在wp-content/plugins/woocommerce/assets/js/frontend/
)进行更改。在第80行(WooCommerce 4.5.2)对此进行了注释
/*if ( 0 === $payment_methods.filter( ':checked' ).length ) {
$payment_methods.eq(0).prop( 'checked', true );*/
不幸的是,仅通过将第二个文件复制到子主题文件夹中就不能覆盖它。此解决方案尚不支持更新。但是也许可以继续,并以一种聪明的(尽可能)本机(尽可能)的方式使其经过更新。 Here are some solutions i found for that。
p.s:即使客户更改了邮政编码,地址数据等,该解决方案仍保留了所选的付款方式。