首页 > 解决方案 > Woocommerce 结帐 - payment_method 调用不正确

问题描述

使用 Woocommerce,当用户选择特定运费时,我使用了一个隐藏付款选项的功能:

  public function custom_available_payment_gateways( $gateways ) {
        $chosen_shipping_rates = ( isset( WC()->session ) ) ? WC()->session->get( 'chosen_shipping_methods' ) : array();

        if ( in_array( 'local_pickup:14', $chosen_shipping_rates ) ) :
            unset( $gateways['cod'] );
        elseif ( in_array( 'flat_rate:17', $chosen_shipping_rates ) ) :
            unset( $gateways['bacs'] );
            unset( $gateways['przelewy24'] );
        elseif ( in_array( 'flat_rate:18', $chosen_shipping_rates ) ) :
            unset( $gateways['bacs'] );
            unset( $gateways['przelewy24'] );


        endif;
        return $gateways;
    }

添加评论收起 

消息输入

记下一些东西

斜体~strike~ code preformatted>quote 搜索结果

包括:一切 所有消息文件 1 结果

这工作正常,但我收到一个错误 - payment_method 调用不正确 - 我如何更改此函数以正确调用它?

标签: phpmethodswoocommercepaymentshipping

解决方案


我对您的代码进行了非常小的更改,并在我的活动子主题的 function.php 文件中对其进行了测试。它可以正常工作:

add_filter( 'woocommerce_available_payment_gateways', 'custom_available_payment_gateways' );
function custom_available_payment_gateways( $available_gateways ) {
    // Not in backend (admin)
    if( is_admin() ) 
        return $available_gateways;

    $chosen_sm = ( isset( WC()->session ) ) ? WC()->session->get( 'chosen_shipping_methods' ) : array();

    if ( in_array( 'local_pickup:14', $chosen_sm ) )
    {
        if( isset( $available_gateways['cod'] ) )
            unset( $available_gateways['cod'] );
    } elseif ( in_array( 'flat_rate:17', $chosen_sm ) || in_array( 'flat_rate:18', $chosen_sm ) )
    {
        if( isset( $available_gateways['bacs'] ) )
            unset( $available_gateways['bacs'] );
        if( isset( $available_gateways['przelewy24'] ) )
            unset( $available_gateways['przelewy24'] );
    }
    return $available_gateways;
}

所以对于插件来说,钩子部分会略有不同(并且位于init()函数中):

add_filter( 'woocommerce_available_payment_gateways', array($this, 'custom_available_payment_gateways') );
public function custom_available_payment_gateways( $available_gateways ) {
    // Not in backend (admin)
    if( is_admin() ) 
        return $available_gateways;

    $chosen_sm = ( isset( WC()->session ) ) ? WC()->session->get( 'chosen_shipping_methods' ) : array();

    if ( in_array( 'local_pickup:14', $chosen_sm ) )
    {
        if( isset( $available_gateways['cod'] ) )
            unset( $available_gateways['cod'] );
    } elseif ( in_array( 'flat_rate:17', $chosen_sm ) || in_array( 'flat_rate:18', $chosen_sm ) )
    {
        if( isset( $available_gateways['bacs'] ) )
            unset( $available_gateways['bacs'] );
        if( isset( $available_gateways['przelewy24'] ) )
            unset( $available_gateways['przelewy24'] );
    }
    return $available_gateways;
}

它应该工作。


推荐阅读