【问题标题】:Refresh function based on chosen shipping method in WooCommerce checkout page基于 WooCommerce 结帐页面中选择的运输方式的刷新功能
【发布时间】:2021-09-16 04:00:47
【问题描述】:

所以我有这个代码,它检测交付方式并添加额外的选择选项。

add_filter( 'woocommerce_review_order_before_payment', 'localdealers_checkout_fields' );
function localdealers_checkout_fields() {
    $chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
    $chosen_shipping = $chosen_methods[0];

    if ( 0 === strpos( $chosen_shipping, 'local_pickup:2' ) ) {
        
        echo '<div id="localdealers_checkout_field" class="row"><div class="col-12 col-lg-6 offset-lg-6">
        <h3>' . __('Local dealer', 'my_theme_slug') . 
        '<span>(extra paid)</span></h3>'
        ;

        // The selector
        woocommerce_form_field( 'local_dealers', array(
        'type'        => 'select',
        'required'    => true,
        'class'       => array('my-field-class form-row-wide'),
        'label'       => __('Chose location', 'my_theme_slug'),
        'options'     => array(
            '' => __('Location address', 'my_theme_slug'),
            'option1' => 'Address 1',
            'option2' => 'Address 2'
        )
        ), WC()->checkout->get_value( 'local_dealers' ));
        echo '</div></div>';
    }
}

问题在于,当更改交付选项时,此函数不会被触发。所以它只适用于页面重新加载。

jQuery('body').trigger('update_checkout'); 没有帮助。

有什么想法吗?

【问题讨论】:

    标签: jquery wordpress woocommerce checkout shipping-method


    【解决方案1】:

    您可以使用 jQuery 显示/隐藏您的自定义字段

    所以你得到:

    function action_woocommerce_review_order_before_payment() {
        echo '<div id="localdealers_checkout_field" class="row"><div class="col-12 col-lg-6 offset-lg-6">
        <h3>' . __('Local dealer', 'my_theme_slug') . '<span>(extra paid)</span></h3>';
    
        // The selector
        woocommerce_form_field( 'local_dealers', array(
            'type'        => 'select',
            'required'    => true,
            'class'       => array('my-field-class form-row-wide'),
            'label'       => __('Chose location', 'my_theme_slug'),
            'options'     => array(
                ''        => __('Location address', 'my_theme_slug'),
                'option1' => 'Address 1',
                'option2' => 'Address 2'
            )
        ), WC()->checkout->get_value( 'local_dealers' ));
        
        echo '</div></div>';
        
        // Chosen shipping method
        $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
        $chosen_shipping_method = substr( $chosen_shipping_methods[0], 0, strpos( $chosen_shipping_methods[0], ':' ) );
        
        ?>
        <script type="text/javascript">
        jQuery(function($) {
            var selector = '#localdealers_checkout_field';
            // Once DOM is loaded
            <?php if ( $chosen_shipping_method != 'local_pickup' ) { ?>
                $( selector ).hide();
            <?php } ?>
            
            // On live "change event"
            $( 'form.checkout' ).on( 'change', 'input[name^="shipping_method"]', function() {
                var c_s_m = $( this ).val();
                
                // Check if string contains substring
                if ( c_s_m.indexOf( 'local_pickup' ) >= 0 ) {
                    $( selector ).show();   
                } else {
                    $( selector ).hide();               
                }
            });
        });
        </script>
        <?php
    }
    add_action( 'woocommerce_review_order_before_payment', 'action_woocommerce_review_order_before_payment', 10, 0 );
    

    【讨论】:

    • 谢谢。经过小的修改 ot 工作,但它仍然是 js 级别,我正在寻找 ajax / php 所以我删除了整个列表。该选择中有许多选项的潜力,因此这将是更快的解决方案。
    • @Mastafu 您的问题中没有提到 ajax。如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。请阅读What should I do when someone answers my question?
    • 你说得对,我好像忘了说:)我们先不说了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 2019-05-04
    • 1970-01-01
    • 2015-01-11
    • 2018-02-05
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多