实际上,您的方向是正确的,但只是混淆了返回值。以下是我在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分类系统构建的。因此,这个助手对结构进行了抽象,以便于处理属性数据。