在 WooCommerce 中,我使用 $product->get_variation_attributes() 获取产品的变体属性。此函数返回一个数组,其中包含没有 ID 的名称。
像这样:
[pa_color-shirt] => Array
(
[0] => red
[7] => grey
[14] => yellow
)
[pa_color-sweater] => Array
(
[0] => red
[1] => green
[2] => blue
[3] => grey
[4] => yellow
[5] => pink
[6] => dark-blue
)
对于我正在创建的 AJAX 商店,我还需要来自变体的 ID。
所以我可以将 ID 和名称附加到选择框(就像 woocommerce 一样)。
我四处搜索了几天,但找不到解决方案。
我创建了这段代码:
if($product->has_child()) {
$attributes = $product->get_attributes();
$variations = $product->get_available_variations();
$variationsArray = array();
foreach ($attributes as $attr => $attr_deets) {
$variationArray = array();
$attribute_label = wc_attribute_label($attr);
$variationArray["attribute_label"] = $attribute_label;
if (isset($attributes[$attr]) || isset($attributes['pa_' . $attr])) {
$attribute = isset($attributes[$attr]) ? $attributes[$attr] : $attributes['pa_' . $attr];
if ($attribute['is_taxonomy'] && $attribute['is_visible']) {
$variationArray["attribute_name"] = $attribute['name'];
$variationIds = array();
$variationNames = array();
$variationPrices = array();
foreach ($variations as $variation) {
if (!empty($variation['attributes']['attribute_' . $attribute['name']])) {
array_push($variationIds, $variation['variation_id']);
$taxonomy = $attribute['name'];
$meta = get_post_meta($variation['variation_id'], 'attribute_'.$taxonomy, true);
$term = get_term_by('slug', $meta, $taxonomy);
$variation_name = $term->name;
array_push($variationNames, $variation_name);
array_push($variationPrices, $variation['display_regular_price']);
}
}
$variationArray["variation_prices"] = $variationPrices;
$variationArray["variations"] = array_combine($variationIds, $variationNames);
}
}
array_push($variationsArray, $variationArray);
}
}
$product_variations = $variationsArray;
此代码返回 https://hastebin.com/ecebewumoz.php
代码有效,但返回重复的名称和 ID。
我的问题是有没有人知道如何使用 ID 完成与 get_variation_attributes() 相同的操作?
最佳答案
Update for WooCommerce versions 3+
foreach( $product->get_variation_attributes() as $taxonomy => $terms_slug ){
// To get the attribute label (in WooCommerce 3+)
$taxonomy_label = wc_attribute_label( $taxonomy, $product );
// Setting some data in an array
$variations_attributes_and_values[$taxonomy] = array('label' => $taxonomy_label);
foreach($terms_slug as $term){
// Getting the term object from the slug
$term_obj = get_term_by('slug', $term, $taxonomy);
$term_id = $term_obj->term_id; // The ID <== <== <== <== <== <== HERE
$term_name = $term_obj->name; // The Name
$term_slug = $term_obj->slug; // The Slug
// $term_description = $term_obj->description; // The Description
// Setting the terms ID and values in the array
$variations_attributes_and_values[$taxonomy]['terms'][$term_id] = array(
'name' => $term_name,
'slug' => $term_slug
);
}
}
Below WooCommerce version 3
我在您的原始数据数组中没有看到任何重复的变体 ID……您的问题不是很清楚,因此很难猜出您正在查看的缺失 ID 是什么。然后我冒着风险回答,我假设丢失的 ID 是属性值中的术语 ID……
要获取此术语 ID,我使用 Wordpress 函数 get_term_by() ,这样:
foreach( $product->get_variation_attributes() as $taxonomy => $terms_slug ){
// To get the taxonomy object
$taxonomy_obj = get_taxonomy( $taxonomy );
$taxonomy_name = $taxonomy_obj->name; // Name (we already got it)
$taxonomy_label = $taxonomy_obj->label; // Label
// Setting some data in an array
$variations_attributes_and_values[$taxonomy] = array('label' => $taxonomy_obj->label);
foreach($terms_slug as $term){
// Getting the term object from the slug
$term_obj = get_term_by('slug', $term, $taxonomy);
$term_id = $term_obj->term_id; // The ID <== <== <== <== <== <== HERE
$term_name = $term_obj->name; // The Name
$term_slug = $term_obj->slug; // The Slug
// $term_description = $term_obj->description; // The Description
// Setting the terms ID and values in the array
$variations_attributes_and_values[$taxonomy]['terms'][$term_id] = array(
'name' => $term_name,
'slug' => $term_slug
);
}
}
还有:
echo '<pre>'; print_r($variations_attributes_and_values);echo '</pre>';
我将得到这个输出,带有每个属性的真实术语 ID 用于产品变体(我安排了数组输出以使其更紧凑):
Array(
[pa_color] => Array(
[label] => Color
[terms] => Array(
[8] => Array(
[name] => Black
[slug] => black'
)
[9] => Array(
[name] => Blue
[slug] => blue
)
[11] => Array(
[name] => Green
[slug] => green
)
)
)
[pa_bulk_quantity] => Array(
[label] => Bulk quantity
[terms] => Array(
[44] => Array(
[name] => Pack of 10 dozen
[slug] => pack-of-10-dozen
)
[45] => Array(
[name] => Case of 50 dozens
[slug] => case-of-50-dozens
)
)
)
)
关于php - 获取产品变体属性值术语 ID 和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42497051/
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit