我在设置中检查了“隐藏缺货”,但是当使用分层导航小部件按鞋号过滤结果时,它返回的产品已将该尺寸列为属性,但尺寸缺货。有没有解决这个问题?
WordPress版本3.9.1,WooCommerce版本2.1.7
答案 0 :(得分:2)
他的意思是不在过滤结果中显示产品。如果用户按尺寸M过滤,他希望在结果中看到可用尺寸为M的产品,而不是所有过去尺寸为M但又不再有的产品......
这是多年来woocommerce尚未解决的问题!任何打开一家woocommerce商店的人都应该知道。我相信他们中的大多数都不会因为这个问题而使用woocommerce。
答案 1 :(得分:0)
我每天晚上运行以下脚本来解决它
$dir = dirname(__FILE__);
include_once($dir . '/../../../../wp-load.php');
$currentCount = 0;
$pageSize = 10;
global $wpdb;
$run = true;
while ($run) {
// select all variation of products with stock == 0
$sql = "SELECT * FROM `wpmf_postmeta` as pm
LEFT JOIN wpmf_posts as p on p.ID = pm.post_id
WHERE
meta_key = '_stock' and meta_value = 0
and p.post_parent <> 0 LIMIT $currentCount," . ($currentCount + $pageSize);
// var_dump($sql);die;
$res = $wpdb->get_results($sql, ARRAY_A);
if (!$res) { //|| $currentCount > 20
$run = false;
break;
}
foreach ($res as $r) {
$post_parent = $r['post_parent'];
$post_excerpt = $r['post_excerpt'];
$size = preg_replace('/[^0-9.]/', '', $post_excerpt);
// echo($post_parent . ", $size" . '<br>');
if ($size && $size != '') {
// find the term ID and delete it from parent product
$res_term = $wpdb->get_results("SELECT * FROM `wpmf_term_relationships` as tr
LEFT JOIN wpmf_terms as t on t.term_id = tr.term_taxonomy_id
where `object_id` = $post_parent and name = $size", ARRAY_A);
// var_dump($terms_rel);
if ($res_term) {
$query = "
DELETE FROM wpmf_term_relationships
WHERE term_taxonomy_id = " . $res_term[0]['term_id'] . "
AND object_id = " . $post_parent . "
";
$res_query = $wpdb->query(
$query);
echo($post_parent . ", $size, $res_query" . '<br>');
}
}
$currentCount++;
}
}
wp_cache_flush();
echo 'done! ' . $currentCount;
此脚本解决的问题是:侧边栏按attribute
过滤产品,但是库存由产品差异管理(子发布)。
数据库没有链接这两个字段的方法,因此无法创建一个查询来过滤具有Stock == 0的匹配变化的属性的查询。
因此,此脚本通过删除库存== 0的产品属性来解决该问题
下面是一个相反的脚本,用于为库存> 0且缺少属性的产品设置属性:
$dir = dirname(__FILE__);
include_once($dir . '/../../../../wp-load.php');
$currentCount = 0;
$pageSize = 10;
global $wpdb;
$run = true;
while ($run) {
// select all varaition of a prod with stock > 0
$sql = "SELECT * FROM `wpmf_postmeta` as pm
LEFT JOIN wpmf_posts as p on p.ID = pm.post_id
WHERE
meta_key = '_stock' and meta_value <> 0
and p.post_parent <> 0 LIMIT $currentCount," . ($currentCount + $pageSize);
// var_dump($sql);die;
$res = $wpdb->get_results($sql, ARRAY_A);
if (!$res) { //|| $currentCount > 20
$run = false;
break;
}
foreach ($res as $r) {
$post_parent = $r['post_parent'];
$post_excerpt = $r['post_excerpt'];
$size = preg_replace('/[^0-9.]/', '', $post_excerpt);
if ($size && $size != '') {
// find the relevant term
$res_parent = $wpdb->get_results("SELECT * FROM `wpmf_term_relationships` as tr
LEFT JOIN wpmf_terms as t on t.term_id = tr.term_taxonomy_id
where `object_id` = $post_parent and name = $size", ARRAY_A);
// var_dump($terms_rel);
// if term is missing, create it
if (!$res_parent) {
wp_set_object_terms($post_parent, $size, 'pa_size', true);
echo($post_parent . ", $size" . '<br>');
}
$currentCount++;
}
}
}
wp_cache_flush();
echo 'done! ' . $currentCount;
注意:
这不是该问题的适当解决方案-解决方案应该在设计级别,即找到一种方法来将2个字段与SQL查询链接,该解决方案是暂时的,直到真正的解决方案解决方案可用
我没有完全测试此代码,以后会在必要时更新答案
我不完全了解wordpress或woocommerce的数据库结构,并且此代码的结果可能会因不同的插件而有所不同,使用此代码的风险由您自己承担
答案 2 :(得分:-1)
在WooCommerce中,默认选项是,它显示搜索结果和产品类别页面中库存和缺货的所有产品。这是一个WooCommerce默认功能
关于此的链接: https://github.com/woothemes/woocommerce/issues/5840
另外,没有相反显示这些产品是一个坏主意,因为它不是最好的SEO实践。