选择BACS帐户以显示在WooCommerce的Thankyou页面中

时间:2019-03-07 16:34:34

标签: php wordpress function plugins woocommerce

我有一个WooCommerce商店,其中一个产品可以由多个艺术家进行个性化设置。每个艺术家都有自己的银行帐户来接收付款;因此,我需要显示在“谢谢”页面中的银行帐户,并在相应的电子邮件中,是属于所选歌手的那个帐户。为了确定每个银行帐户和艺术家,我做了下一个:

  1. 我为每种产品变型(艺术家)使用the分配了3个字符的标识符。
  2. 我还使用了支付网关中每个银行帐户的分类代码字段来分配相同的3个字符。

现在,我需要找到哪个银行帐户的排序代码等于所选的变化记录from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC

有人可以指出我正确的方向吗?我需要一个循环,以禁用account_details[x]['sort_code'] = (the variation slug)中的所有行,除了那些与变体段匹配的行。


我找到了通过将其与字符串进行比较来选择银行帐户的方法。为此,我在文件class-wc-gateway-bacs.php

的第255行中添加了条件account_details
if ( $bacs_account->sort_code != 'ztc' ) { continue; }

但是,我找不到找到变体段将其与 foreach ( $bacs_accounts as $bacs_account ) { $bacs_account = (object) $bacs_account; if ( $bacs_account->sort_code != 'ztc' ) { 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; (而不是字符串)进行比较的方法。另外,我认为最好是使用functions.php文件进行修改,而不要弄乱class-wc-gateway-bacs.php文件。

有人可以帮我做任何这件事吗?

2 个答案:

答案 0 :(得分:1)

完成!

找到了从https://stackoverflow.com/questions/53009224/get-order-item-meta-data-in-an-unprotected-array-in-woocommerce-3中获取变化条的方法。所以我刚刚添加:

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

在“ class-wc-gateway-bacs.php”文件中的第255行之后。我还注释了第272-275行以隐藏排序代码字段,因为这对于选择帐户很有用,但对用户没有用。

            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>';
            }

一切正常。

答案 1 :(得分:0)

我在类似的情况下工作,但是我在结帐页面上启用了网关。网关在每个订单之后都以循环方式更改。假设第一阶使用网关1,第二阶使用网关2,第三阶网关3再次使用网关1。我使用CSS根据先前命令使用的网关一次仅隐藏/显示一个网关。

function filter_gateways($gateways){
  global $woocommerce;
  //$WC_Payment_Gateway = wc_get_payment_gateway_by_order( $order );
  $latest_order_id = get_last_order_id(); //Get latest used gateway.
  $order_method = get_post_meta( $latest_order_id, '_payment_method', true );
//Disable /hide gateways based on last order.
    if ($order_method == 'nmi_gateway_woocommerce_credit_card_cloneC') {?>
    <style type="text/css">
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneC{display: none !important;}
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneF{display: none !important;}
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneK{display: none !important;}
    </style>
    <?php

    } elseif ($order_method == 'nmi_gateway_woocommerce_credit_card_cloneE') {?>
    <style type="text/css">
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneC{display: none !important;}
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneE{display: none !important;}
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneK{display: none !important;}
    </style>

    <?php


    } elseif ($order_method == 'nmi_gateway_woocommerce_credit_card_cloneF') {?>
    <style type="text/css">
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneC{display: none !important;}
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneE{display: none !important;}
    li.payment_method_nmi_gateway_woocommerce_credit_card_cloneF{display: none !important;}
    </style>



    return $gateways;
}

add_filter('woocommerce_available_payment_gateways','filter_gateways');

因此,在您的情况下,请获取slug url,然后根据该URL,在显示的BACS中应遵循一些样式约定,您可以使用该样式约定禁用其他网关。

如果没有,请一下: 1.首先从订单编号中获取产品编号。 2.然后,您可以使用产品ID(Woocommerce: How do I get the product slug from the id?)来获得该子弹

希望有帮助。