WooCommerce 可变产品通知问题 - 请选择产品选项

WooCommerce Variable Product notice Issue - please choose product options

我正在建立一个电子商务网站。我在使用 WooCommerce Variable Product.

时遇到了一些问题

"Add to Cart" 按钮适用于简单产品,但不适用于可变产品。它给出了 "Please choose product options…" 通知。

我到处查看并尝试了几个在线建议,none 其中有效。所以我查看了 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。 None 其中有任何内容,因为当我回显时 $variation_id: 它没有输出任何内容。

有什么建议吗?

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

在可变产品页面上,通常在使用 "add to cart" 按钮之前,您会显示一些 选项来为可变产品选择 。如果你不这样做,你会收到错误信息……
所以在这一点上:

  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

参考:Change "Add to Cart" button to "Go to Product" in the Shop Page

我遇到了同样的问题.....删除你的变体色板插件,问题就会解决

虽然我们都有共同的变体样本,但错误(听起来很奇怪)在于主题不兼容。要测试只需切换到 2020 主题,排序应该有效。然后,我建议您根据需要制作 2020 套件,并停止使用开发人员在推出 woocommerce 更新时请假的主题!禁用色板无济于事,因为代码已经存在。祝你好运。

  1. 遇到了同样的问题....停用了 autoptimize 插件,问题就解决了。

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

以防其他人在构建自定义主题时遇到变体未按预期添加到购物车的问题 - 您可能需要检查您的主题是否正在加载 /woocommerce/assets/js/frontend/add-to-cart-variation。 min.js 脚本 - 将以下内容添加到您将脚本排入队列的任何位置以手动添加它:

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

这解决了我的问题。

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

问题是我的产品没有默认变体。因此,用户在没有选择变体的情况下添加到愿望清单产品。因此,当用户尝试将此产品添加到购物车后出现错误。

这里是 FIX:只需为所有龋齿产品设置默认变体! (手动或通过代码)。因此用户不能添加具有 EMPTY 变体的产品。默认选择变体或用户自行更改变体。

所以现在在心愿单中我们选择了变体并且一切正常。它适用于所有页面、档案、愿望清单等。祝你好运! ;)

您需要修改 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);
        }
      }
    }