WooCommerce可变产品通知发布-请选择产品选项



我正在建立一个电子商务网站。我有一些麻烦WooCommerce 可变产品

添加到Cart"按钮适用于简单的产品,但不适用于可变的产品。给出"Please choose product options…"通知。

我到处看了看,在网上试了几个建议,没有一个有效。所以我查看了WooCommerce的源文件: class-wc-form-handler.php .

函数 add_to_cart_handler_variable :

function add_to_cart_handler_variable( $product_id ) {
    $adding_to_cart     = wc_get_product( $product_id );
    $variation_id       = empty( $_REQUEST['variation_id'] ) ? '' : absint( $_REQUEST['variation_id'] );
    $quantity           = empty( $_REQUEST['quantity'] ) ? 1 : wc_stock_amount( $_REQUEST['quantity'] );
    $missing_attributes = array();
    $variations         = array();
    $attributes         = $adding_to_cart->get_attributes();
    $variation          = wc_get_product( $variation_id );
...
if ( $missing_attributes ) {
        wc_add_notice( sprintf( _n( '%s is a required field', '%s are required fields', sizeof( $missing_attributes ), 'woocommerce' ), wc_format_list_of_items( $missing_attributes ) ), 'error' );
    } elseif ( empty( $variation_id ) ) {
        wc_add_notice( __( 'Please choose product options…', 'woocommerce' ), 'error' );
    } else {
        // Add to cart validation
        $passed_validation  = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity, $variation_id, $variations );
        if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity, $variation_id, $variations ) !== false ) {
            wc_add_to_cart_message( $product_id );
            return true;
        }
    }
    return false;
}

在elseif子句中捕获错误。
所以我试着重复$variation_id$variations$variation。它们都没有任何内容,因为当我回显$variation_id:时,它没有输出任何内容。

如何解决错误?

在商店页面上,你不能为可变产品使用添加到购物车按钮,因为你需要先进入单个产品页面,选择该可变产品的选项,然后再将其添加到购物车中。

在可变产品页面上,在使用"添加到购物车"按钮之前,通常会有一些显示的选项来选择。如果你不这样做,你会得到错误信息…
所以在这里:

  1. 选项不显示在产品页面(坏的设置在你的后端产品页面,一个错误与你的主题或一些额外的插件):
    • 检查产品后端设置
    • 尝试切换到默认的wordpress主题(看看这个问题是否仍然存在)
    • 尝试禁用大部分插件
  2. 显示的选项是:所以先为这个产品选择你的选项,然后添加到购物车

如果此问题与您的主题有关,请联系主题的作者并打开支持线程或票证…


为产品ID输出产品变体:

以编程方式获取可变产品ID的产品变化:

$product = wc_get_product( $product_id );
$product_variations = $product->get_available_variations();
echo var_dump($product_variations); // Displaying the array

然后得到第一个变量ID:

$product = wc_get_product( $product_id );
$product_variations = $product->get_available_variations();
$variation_product_id = $product_variations [0]['variation_id'];
echo $variation_product_id; // Displaying the variation ID

或获取该产品的所有变体ID的数组ID:

$product = wc_get_product( $product_id );
$product_variations = $product->get_available_variations();
$arr_variations_id = array();
foreach ($product_variations as $variation) {
    $product_variation_id = $variation['variation_id'];
    array_push( $arr_variations_id, $product_variation_id );
}
echo var_dump($arr_variations_id); // Displaying the array of variations ID

参考:将商店页面中的"添加到购物车"按钮更改为"转到产品"

以防其他人正在构建自定义主题并遇到此问题,变化没有按预期添加到购物车中-您可能需要检查您的主题正在加载/woocommerce/assets/js/frontend/add-to-cart-variation.min.js脚本-添加以下内容到您排队脚本手动添加它的地方:

wp_enqueue_script('wc-add-to-cart-variation');

这为我解决了这个问题。

虽然我们都有共同的变异样本,但错误(听起来很奇怪)在于主题不相容。要进行测试,只需切换到2020主题,顺序应该可以工作。我建议让2020年套件你的需求,并停止使用主题,开发人员休假时,woocommerce更新推出!禁用色板没有帮助,因为代码已经在那里。好运。

我也面临同样的问题.....删除你的变异样本插件,问题将得到解决

  1. 有同样的问题....停用autoptimize插件,问题解决了

  2. 另外,要知道要禁用哪个插件,您可以简单地加载页面或网站,检查元素或开发人员模式,然后检查控制台以查看错误的来源,然后您可以将其与相关插件联系起来,然后从您的wp仪表板中禁用。

我使用愿望清单插件,当我试图将可变产品添加到购物车时,我得到:'所选产品不是产品名称的变体,请通过访问产品名称选择产品选项。'

问题是我的产品没有默认的变化。所以用户添加到愿望清单产品没有选择的变化。因此,当用户尝试将此产品添加到购物车时,出现错误。

这里是修复:只需设置默认变化到所有的运输产品!(手动或通过代码)。因此用户不能添加带有空变量的产品。变异将被默认选择或用户自行更改变异。

所以现在在愿望列表中,我们选择了变化,所有的工作都应该。它将在所有页面,档案,愿望清单等工作。好运!;)

你需要修改functions.php文件。只需转到您的子主题的wp-content/yourtheme/functions.php。在这里,我们将向您展示完整的代码,然后解释其主要部分。因此,以编程方式创建WooCommerce默认产品属性的完整PHP脚本如下:

add_action('woocommerce_before_single_product_summary', 'quadlayers_product_default_attributes');
function quadlayers_product_default_attributes() {
      global $product;
      if (!count($default_attributes = get_post_meta($product->get_id(), '_default_attributes'))) {
        $new_defaults = array();
        $product_attributes = $product->get_attributes();
        if (count($product_attributes)) {
          foreach ($product_attributes as $key => $attributes) {
            $values = explode(',', $product->get_attribute($key));
            if (isset($values[0]) && !isset($default_attributes[$key])) {
              $new_defaults[$key] = sanitize_key($values[0]);
            }
          }
          update_post_meta($product->get_id(), '_default_attributes', $new_defaults);
        }
      }
    }  

最新更新