更新 Woocommerce 3 中的产品可见性
Posted
技术标签:
【中文标题】更新 Woocommerce 3 中的产品可见性【英文标题】:Update the product visibility in Woocommerce 3 【发布时间】:2018-11-11 00:18:38 【问题描述】:我正在使用 woocommerce/wordpress 的几个插件来制作它,以便我的每个产品变体都将作为单独的产品显示在我的产品列表中,但每种颜色只有一种设置为显示(所以如果我有一个产品有 3 种尺寸和 3 种颜色,有 9 种产品,但由于每种颜色只有一种可见,因此列表中仅显示 3 种产品。)。我编写了一个脚本,一旦当前可见的产品缺货,就会将可见性设置转移到相同颜色的下一个产品。
我遇到的问题是,即使一切看起来都正确,产品也没有显示在产品列表中,直到我进入管理员端,编辑产品,将可见性设置更改为隐藏,然后返回显示(这样它就可以让我点击保存按钮,尽管页面加载时实际上没有任何变化),然后点击保存,它会按预期显示。
所以我必须在正在查询的数据库中遗漏一些东西,但我不知道是什么,posts 和 post_meta 表在管理员端点击保存之前和之后看起来都是一样的。唯一改变的字段是 post_meta 表中的 _edit_lock
字段。
这是我为转移可见性设置而编写的脚本的一部分,我最初遇到了这个问题,发现是因为该产品仍然被标记为缺货,所以我最后添加了该行,它似乎可以正常工作,但现在是其他原因造成的:
...
// $child_id is the product that the visibility settings are being transferred to, it should at this point be hidden
// $visibility is the settings of the product that was visibile
// swap visibility settings of the products
$child_visibility = get_post_meta($child_id,"_visibility",true);
update_post_meta($product->get_id(),"_visibility",$child_visibility);
update_post_meta($child_id,"_visibility",$visibility);
// copy color taxonomies over in case they were not entered
// this saved time so that the admin only had to enter taxonomy information on the visible products
$terms = get_the_terms( $product->get_id(), 'product_color');
$termArray = array();
foreach($terms as $term)
$termArray[] = $term->name;
wp_set_object_terms( $child_id, $termArray, 'product_color', false );
// i dont remember what this was for
delete_transient( 'jck_wssv_term_counts' );
// make sure new item is not marked out of stock
wp_remove_object_terms( $child_id, 'outofstock', 'product_visibility' );
wp_remove_object_terms( $child_id, 'exclude-from-catalog', 'product_visibility' );
【问题讨论】:
【参考方案1】:自 Woocommerce 3 以来,产品可见性现在由 'exclude-from-catalog'
和 'exclude-from-search'
术语的 'product_visibility'
自定义分类法处理......也请参阅 this thread 或 this one。
所以你应该这样使用WC_Product
CRUD setter methods set_catalog_visibility()
:
// Get an instance of the product variation from a defined ID
$child_product = wc_get_product(child_id);
// Change the product visibility
$child_product->set_catalog_visibility('visible');
// Save and sync the product visibility
$child_product->save();
这也将更新瞬态缓存数据,并会成功...
【讨论】:
谢谢,这解决了它。我还添加了$product->set_catalog_visibility('hidden')
并保存以隐藏以前可见的产品。
嗨,有没有办法为可见性功能添加更多选项?就像我们可以对产品状态做些什么?
@TemaniAfif 怎么样?此方法可用的唯一选项是:“隐藏”、“可见”、“搜索”和“目录”。
是的,但我想知道我是否可以注册更多选项以获得更多可用,就像我们对产品状态所做的那样 (jilt.com/blog/woocommerce-custom-order-status-2)。顺便说一句,与这个问题无关
@TemaniAfif 我从来没有尝试过这样做……这取决于你自己能做些什么。以上是关于更新 Woocommerce 3 中的产品可见性的主要内容,如果未能解决你的问题,请参考以下文章
更新变体产品价格 - 在产品页面中不可见 - Woocommerce
为什么用于Woocommerce的高级AJAX产品过滤器更新页面?
在 Woocommerce 上的 WP_query 中获取目录中可见的产品