【问题标题】:Custom checkout field enable or disable payment methods in Woocommerce 3自定义结帐字段启用或禁用 Woocommerce 3 中的付款方式
【发布时间】:2020-05-15 01:38:50
【问题描述】:

所以我正在处理http://www.lichtunie.nl 我们有一个功能齐全的结帐页面,其中包含所需的字段。 问题是这样的: 在荷兰(我们所在的地方),我们有一个叫做 KvK 的东西,如果你创办了一家公司,你需要在那里注册并获得一个 KvK 号码。 我们可以通过网站检查这些数字,看看它们是否合法以及它们的付款历史如何。

现在我们可以选择“用支票付款”,让您在收到发票后的 30 天内订购并付款。 我们现在想要的是,当有人没有在结账时填写他们的 KvK 号码字段时,他们就不能使用这种付款方式。

只要他们填写了“KvK 编号”字段,他们应该就可以了。

我一直在寻找一段时间,只是无法弄清楚如何做到这一点。有人有什么建议吗?

提前致谢,

莱克斯

【问题讨论】:

    标签: php jquery wordpress woocommerce payment-method


    【解决方案1】:

    如果计费KVK号码结帐字段已填写或存在,则以下代码将仅保留“支票”付款方式:

    add_filter( 'woocommerce_available_payment_gateways', 'kvk_field_cheque_payment_method', 20, 1);
    function kvk_field_cheque_payment_method( $gateways ){
        foreach( $gateways as $gateway_id => $gateway ) {
        // Not in backend (admin)
        if( is_admin() ) 
            return $gateways;
    
            if( WC()->session->get( 'is_kvk_nummer' ) && $gateway_id != 'cheque' ){
                unset( $gateways[$gateway_id] );
            }
        }
        return $gateways;
    }
    
    // The Wordpress Ajax PHP receiver
    add_action( 'wp_ajax_kvk_nummer', 'get_ajax_kvk_nummer' );
    add_action( 'wp_ajax_nopriv_kvk_nummer', 'get_ajax_kvk_nummer' );
    function get_ajax_kvk_nummer() {
        if ( $_POST['bkvkn'] == '1' ){
            WC()->session->set('is_kvk_nummer', '1');
        } else {
            WC()->session->set('is_kvk_nummer', '0');
        }
        die();
    }
    
    // The jQuery Ajax request
    add_action( 'wp_footer', 'checkout_kvk_fields_script' );
    function checkout_kvk_fields_script() {
        // Only checkout page
        if( is_checkout() && ! is_wc_endpoint_url() ):
    
        // Remove "is_kvk_nummer" custom WC session on load
        if( WC()->session->get('is_kvk_nummer') ){
            WC()->session->__unset('is_kvk_nummer');
        }
        ?>
        <script type="text/javascript">
            jQuery( function($){
                var a = 'input#billing_kvk_nummer';
    
                // Ajax function
                function checkKvkNummer( value ){
                     $.ajax({
                        type: 'POST',
                        url: wc_checkout_params.ajax_url,
                        data: {
                            'action': 'kvk_nummer',
                            'bkvkn': value != '' ? 1 : 0,
                        },
                        success: function (result) {
                            $('body').trigger('update_checkout');
                        }
                    });
                }
    
                // On start
                checkKvkNummer($(a).val());
    
                // On change event
                $(a).change( function () {
                    checkKvkNummer($(this).val());
                });
            });
        </script>
        <?php
        endif;
    };
    

    代码在您的活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    加法
    如果未填写计费 KVK 号码结帐字段,还可以隐藏“支票”付款方式,将第一个功能替换为此功能:

    add_filter( 'woocommerce_available_payment_gateways', 'kvk_field_cheque_payment_method', 20, 1);
    function kvk_field_cheque_payment_method( $gateways ){
        // Not in backend (admin)
        if( is_admin() ) 
            return $gateways;
    
        foreach( $gateways as $gateway_id => $gateway ) {
    
            if( $gateway_id != 'cheque' && WC()->session->get( 'is_kvk_nummer' ) ){
                unset( $gateways[$gateway_id] );
            } elseif( $gateway_id == 'cheque' && ! WC()->session->get( 'is_kvk_nummer' ) ){
                unset( $gateways[$gateway_id] );
            }
        }
        return $gateways;
    }
    

    它应该可以工作(未经测试)

    【讨论】:

    • 好吧,这行得通!唯一的问题是,正如您所说,此代码使得如果您填写 KvK 号码,您最终只能选择支票付款。我们希望在填写 KvK 时将支票付款作为一个选项显示,而不是在未填写时显示为选项。我需要更改代码的哪一部分才能发生这种情况?首先非常感谢您的代码!
    • @LexvanVliet 我在这个答案的最后做了一个补充。
    • 嗯,我看到了分析器,我替换了第一个函数,但它仍然只显示 KvK。我能再打扰你一次吗?如果我希望使用支票付款的选项始终可见,我会怎么做(这样我们的客户才能看到这是他们拥有的选项)。但在某种程度上,当他们没有填写 KvK 数字字段时,它不会让他们继续结帐。也许它可以说“请填写您的 KvK 号码以使用此付款方式”之类的内容。感谢您迄今为止的帮助和您的时间!
    • @LoicTheAztec 我的实现与此类似,只是我在支付网关中使用它。我可以将这个WC()-&gt;session-&gt;get( 'is_kvk_nummer' ) 用作public function process_payment( $order_id ) { } 中的变量吗?
    【解决方案2】:

    试试这个代码你的活动主题自定义 js 文件

        $( "#KvK_number" ).change(function() { //Here assign the KvK number ID 
            if (this.val() == "") {
                $('#paying_with_cheque').hide(); /// Here give the Check payment div id
            }
            else
            {
            $('#paying_with_cheque').show();
            }
        });
    

    【讨论】:

    • 很抱歉,我不完全明白将这段代码放在哪里。我们使用 Flatsome 主题。现在我正在查看主题文件,我似乎能够找到的唯一 JS 文件位于“assets > JS”下我们并没有真正的运行测试服务器,所以我不想搞砸整个网站试图添加该代码。
    猜你喜欢
    • 2019-07-22
    • 2021-12-24
    • 2013-06-09
    • 2015-04-22
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多