【问题标题】:Display selected BACS account from matching order item meta value using Woocommerce hooks使用 Woocommerce 挂钩从匹配的订单项元值中显示选定的 BACS 帐户
【发布时间】:2019-08-05 20:50:21
【问题描述】:

根据我的一个问题的“Select BACS account to show in thankyou page in WooCommerce”答案代码,我更改了 Woocommerce 核心文件“class-wc-gateway-bacs.php”为了选择在感谢页面上显示的正确银行帐户,即与已购买产品的变体属性相匹配。

我已在第 255 行之后将下一个代码添加到“class-wc-gateway-bacs.php”:

foreach ( $order->get_items() as $item ) {$sede = $item->get_meta("pa_sede");};
if ( $bacs_account->sort_code != $sede ) { continue; };

所以修改bank_details()函数的代码部分,结果如下:

            foreach ( $bacs_accounts as $bacs_account ) {
                $bacs_account = (object) $bacs_account;

                foreach ( $order->get_items() as $item ) {$sede = $item->get_meta("pa_sede");};
                if ( $bacs_account->sort_code != $sede ) { continue; };

                if ( $bacs_account->account_name ) {
                    $account_html .= '<h3 class="wc-bacs-bank-details-account-name">' . wp_kses_post( wp_unslash( $bacs_account->account_name ) ) . ':</h3>' . PHP_EOL;
                }
                $account_html .= '<ul class="wc-bacs-bank-details order_details bacs_details">' . PHP_EOL;
                // BACS account fields shown on the thanks page and in emails.
                $account_fields = apply_filters(
                    'woocommerce_bacs_account_fields',
                    array(
                        'bank_name'      => array(
                            'label' => __( 'Bank', 'woocommerce' ),
                            'value' => $bacs_account->bank_name,
                        ),
                        'account_number' => array(
                            'label' => __( 'Account number', 'woocommerce' ),
                            'value' => $bacs_account->account_number,
                        ),
                        'sort_code'      => array(
                            'label' => $sortcode,
                            'value' => $bacs_account->sort_code,
                        ),
                        'iban'           => array(
                            'label' => __( 'IBAN', 'woocommerce' ),
                            'value' => $bacs_account->iban,
                        ),
                        'bic'            => array(
                            'label' => __( 'BIC', 'woocommerce' ),
                            'value' => $bacs_account->bic,
                        ),
                    ),
                    $order_id
                );
                foreach ( $account_fields as $field_key => $field ) {
                    if ( ! empty( $field['value'] ) ) {
                        $account_html .= '<li class="' . esc_attr( $field_key ) . '">' . wp_kses_post( $field['label'] ) . ': <strong>' . wp_kses_post( wptexturize( $field['value'] ) ) . '</strong></li>' . PHP_EOL;
                        $has_details   = true;
                    }
                }
                $account_html .= '</ul>';
            }

但是,这不是一个好习惯,我想使用挂钩函数代替 class-wc-gateway-bacs.php。

任何帮助将不胜感激。

【问题讨论】:

    标签: php wordpress woocommerce hook-woocommerce payment-method


    【解决方案1】:

    以下钩子函数将避免覆盖 Woocommerce class-wc-gateway-bacs.php 核心文件,使用订单商品中的特定变体属性值在 Woocommerce 订单接收页面中显示匹配的银行账户(谢谢)

    add_filter( 'woocommerce_bacs_accounts', 'filter_woocommerce_bacs_accounts_callback', 10, 1 );
    function filter_woocommerce_bacs_accounts_callback( $bacs_accounts ){
        if ( empty($bacs_accounts) ) {
            return $bacs_accounts; // Exit
        }
    
        if( is_wc_endpoint_url('order-received') ) {
            $endpoint = 'order-received';
        } elseif( is_wc_endpoint_url('view-order') ) {
            $endpoint = 'view-order';
        } else {
            return $bacs_accounts; // Exit
        }
    
        // Get the WC_Order Object
        $order = wc_get_order( get_query_var($endpoint) );
    
        $sort_codes = []; // Initializing variable array
    
        // Loop through order items
        foreach ( $order->get_items() as $item ) {
            $sort_codes[] = $item->get_meta("pa_sede");
        }
    
        if ( empty($sort_codes) ) {
            return $bacs_accounts; // Exit
        }
    
        // Loop through Bacs accounts
        foreach ( $bacs_accounts as $key => $bacs_account ) {
            $bacs_account = (object) $bacs_account;
    
            // Remove the non matching bank accounts
            if ( ! in_array($bacs_account->sort_code, $sort_codes ) ) {
                unset($bacs_accounts[$key]);
            }
        }
        return $bacs_accounts;
    }
    

    代码进入您的活动子主题(或活动主题)的function.php 文件。已测试且可工作(它应该适用于您的产品属性的变体pa_sede

    【讨论】:

    • 工作得很好。非常感谢!。再小一点,可以隐藏排序代码列吗?
    • @Roasty 我不知道...尝试在核心代码文件中展示这是如何或在何处完成的,提出一个新问题。然后在这里通知我。
    • 亲爱的洛伊克。我没有问一个新问题,而是编辑了这个问题,因为隐藏排序代码列应该是我提出的同一问题的一部分。
    • @Roasty StackOverFlow 中不允许同时提出多个问题,甚至更多地编辑您的问题。所以请回滚并在新线程中提出一个新问题。
    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2017-06-10
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    相关资源
    最近更新 更多