Отображение выбранной учетной записи BACS из совпадающего мета-значения позиции заказа с помощью хуков Woocommerce - PullRequest
1 голос
/ 14 марта 2019

На основе " Выберите учетную запись BACS для отображения на странице спасибо в WooCommerce ", код ответа на один из моих вопросов, я изменил основной файл Woocommerce "class-wc-gateway-bacs.php" ВЧтобы выбрать правильный банковский счет, отображаемый на странице спасибо, который соответствует атрибуту варианта купленного продукта.

Я добавил следующий код в "class-wc-gateway-bacs.php" после строки 255:

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.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 15 марта 2019

Следующая перехваченная функция позволит избежать перезаписи основного файла 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) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...