如果结帐页面中有特定变化,则隐藏付款方式 | Woocommerce

Hide payment method if specific variation is in Checkout Page | Woocommerce

我在我的 WordPress 网站上使用此代码来在 selected 特定产品变体时隐藏支付网关。但是,一旦我插入代码,WordPress 就会从后端显示严重错误。请帮助我如何在我的网站上使用此代码?

产品属性:需要个性化 变量:是|否

我想实现,如果有人 select 有 'Yes' 变体,那么在结帐页面上禁用 COD 选项。或者,如果他们 select 'No' 那么只有 cod 选项可用。

产品页面 URL:https://savvyandgroovy.com/product/prashant/

这是我目前使用的:

add_filter(‘woocommerce_available_payment_gateways’, ‘conditional_payment_gateways’, 10, 1);
function conditional_payment_gateways($available_gateways)
{
  $in_cart=false;
  foreach(WC()->cart->get_cart_contents() as $key=>$values)
  {
    // See if there is an attribute called ‘pa_size’ in the cart
    // Replace with whatever attribute you want
    if(array_key_exists(‘personalization-required’, (array)$values[‘data’]->get_attributes()))
    {
      foreach($values[‘data’]->get_attributes() as $attribute=>$variation) ;
      // Replace ‘small’ with your value.
      if($variation==‘Yes’) $in_cart=true; //edited
    }
  }
  if($in_cart)
    unset($available_gateways[‘cod’]); // unset ‘cod’

  return $available_gateways;
}

您的代码工作正常,但由于您使用的引号而出错。我已将其更新如下:

add_filter('woocommerce_available_payment_gateways', 'conditional_payment_gateways', 10, 1);
function conditional_payment_gateways( $available_gateways ) {
    $in_cart = false;
    
    if ( !empty(WC()->cart) ) {
        foreach ( WC()->cart->get_cart_contents() as $key => $values ) {
        // See if there is an attribute called ‘pa_size’ in the cart
        // Replace with whatever attribute you want
        //echo '<pre>';
        //print_r($values['data']->get_attributes());
        //echo '</pre>';
        if (array_key_exists('personalization-required', (array) $values['data']->get_attributes() ) ) {
            foreach ($values['data']->get_attributes() as $attribute => $variation);
                // Replace ‘small’ with your value.
                // if ($variation == 'No') $in_cart = true; //edited
                if ($variation == 'Yes') {
                    $in_cart = true; //edited
                    // unset($available_gateways['cod']); // unset ‘cod’
                }
            }
        }
    
        if ( $in_cart )
            unset($available_gateways['cod']); // unset ‘cod’
    }

    return $available_gateways;
}

我想实现,如果有人 select 有 'NO' 变体,那么结帐页面上的 cod 选项将被禁用 或者,如果他们 select 'YES' 那么只有cod选项可用。

这不会在您的代码中反向工作,因为您已经编写了 if ($variation == ‘Yes’) $in_cart = true; //edited,所以您还需要更新它。所以我也更新了上面的代码。

上面的代码不是很完整,因为 OP 希望在两种情况下都隐藏支付网关,所以我只是稍微调整了第一个答案。

add_filter('woocommerce_available_payment_gateways', 'conditional_payment_gateways', 10, 1);
function conditional_payment_gateways( $available_gateways ) {
    
    if( is_admin() ) 
        return $available_gateways;
    $hide_cod = $hide_rest = false;
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

        if($cart_item["variation"]["attribute_pa_personalization-required"] === 'no') {
            $hide_rest = true;
            
        }

        if($cart_item["variation"]["attribute_pa_personalization-required"] === 'yes') {
            $hide_cod = true;
        }
    }
    
    if($hide_cod) {
        unset($available_gateways['cod']);
    } 
    if($hide_rest) {
        unset($available_gateways['bacs']);
        unset($available_gateways['cheque']);
        unset($available_gateways['ppcp-gateway']);
        //etc
    }

    return $available_gateways;
}

请记住,如果您将这两种变体都添加到购物车中,您将无法使用任何付款方式。