WooCommerce中的动态产品变化

时间:2020-03-25 作者:Кристиян Кацаров

我安装了WooCommerce,有3个可变产品,但我想添加变体“语言”。我不想添加产品的元信息(在gui中),但我想使用挂钩,所以我可以说每个可变产品都有语言变体-英语和德语。我试过使用过滤器woocommerce_display_product_attributes 但它不起作用:

add_filter(\'woocommerce_display_product_attributes\', function($atts, $product) {
  $product_attributes = $product->get_attributes();
  $languages = new WC_Product_Attribute();
  $languages->set_id(0);
  $languages->set_name(\'language\');
  $languages->set_options([\'english\',\'german\']);
  $languages->set_position(0);
  $languages->set_visible(1);
  $languages->set_variation(1);
  return [
    $product_attributes,
    $languages
  ];
}, 10, 2);
我还尝试了这段代码,它显示了一个没有选项的下拉列表,但信息显示在“附加信息”下:

add_filter(\'woocommerce_product_get_attributes\', function($atts, $product) {
  $languages = new WC_Product_Attribute();
  $languages->set_id(0);
  $languages->set_name(\'language\');
  $languages->set_options([\'english\',\'german\']);
  $languages->set_position(0);
  $languages->set_visible(1);
  $languages->set_variation(1);

  $atts[\'languages\'] = $languages;

  return $atts;
}, 10, 2);
有人能帮我解决这个问题吗?我将非常感激!

1 个回复
最合适的回答,由SO网友:simongcc 整理而成

实际上,您的方向是正确的,但只是混淆了返回值。以下是我在5.3.2副本中尝试的内容,并可以正常工作。

因为$atts 应为覆盖。重写后,需要将其放回原处。因此,在生成新的产品属性后,需要将语言信息合并到$atts 然后返回到生成模板的函数。

add_filter(\'woocommerce_display_product_attributes\', function($atts, $product) {

  $languages = new WC_Product_Attribute();
  $languages->set_id(0);
  $languages->set_name(\'language\');
  $languages->set_options([\'english\',\'german\']);
  $languages->set_position(0);
  $languages->set_visible(1);
  $languages->set_variation(1);

  $lang_str = implode( \',\', $languages->get_options()); // require a string for the result

  // the name here is default convention, not compulsory, the convention is eg. attribute_something
  $atts[\'attribute_languages\'] = array(
    \'label\' => $languages->get_name(),
    \'value\' => $lang_str
  );

  return $atts;
}, 10, 2);
变量说明。$atts 包含的产品属性$product 已保存在GUI中。它的形式也可以输出。因此,除非出于其他目的对原始信息进行一些操作,否则不必再次获取属性。

2020年4月1日编辑

与提问者沟通后,我认为问题可以细化为:

How to dynamically add options for visitor to create product variations?

好了,询问者想做以下工作:

不使用GUI创建和存储属性,而是动态创建属性,将动态创建的属性显示为选项,以下是未回答的问题:

选择选项后

如何处理购物车和产品上述方法用于创建选项,以在“附加信息”中显示为属性。

以下方法用于在“添加到购物车”按钮上方为访问者创建节选项。

// add product attributes as option as an product in the cart option
add_action( \'woocommerce_before_add_to_cart_button\', \'q362868_add_attributes_as_options\');
function q362868_add_attributes_as_options() {
    global $product;

    // create attribute dynamically
    $languages = new WC_Product_Attribute();
    $languages->set_id(0);
    $languages->set_name(\'language\');
    $languages->set_options([\'english\',\'german\']);
    $languages->set_position(0);
    $languages->set_visible(1);
    $languages->set_variation(1);

    // options and template for visitor to choose
    $options = $languages->get_options();
    ?>
    <div class="q362868-product-wrapper" id="q362868-product-options" style="padding: 1em 0">
        <div class="fieldset">
            <!-- for javascript to work with -->
            <label for="q362868-option-<?php echo $languages->get_id()?>"><?php echo $languages->get_name() . \': \'; ?></label>
            <select name="q362868-option-<?php echo $languages->get_id()?>" id="q362868-option-selector">
                    <option value=""><?php echo esc_html__(\'-- Options --\', \'q362868\') ?>
                    </option>
                    <?php foreach($options as $key => $option): ?>   
                        <option value="<?php echo $key; ?>"><?php echo htmlspecialchars($option) ?></option>   

                    <?php endforeach; ?>          
            </select>    
        </div>
    </div>
    <?php

    // Here are some unanswered questions from the developer:
    // what to do after displaying the options? Need to consideer the following points as well
    // eg. 1 after selecting, press Add to Cart, pass to Cart
    // eg. 2 changing price or anything is needed
    // other works like javascript is required to interact with visitor
    // it depends on the business logic, change price and so on
}
?><?php

// After visitor -> selection -> add to cart
add_filter( \'woocommerce_add_to_cart_validation\', \'q362868_to_cart_validation\', 10, 2 );
function q362868_to_cart_validation( $passed, $product_id ) {
    // validation process
    return $passed;
}
关于课程的附加说明WC_Product_Attribute.我认为它是一个帮助类,用于与属性进行交互,例如在管理中保存/读取/显示元数据,主要是与WordPress的分类结构进行交互。因为产品属性是基于WP分类系统构建的。因此,这个助手对结构进行了抽象,以便于处理属性数据。

相关推荐