如何防止“缺货”项目在WooCommerce的侧边栏(分层导航小部件)中显示为过滤选项?

时间:2014-06-11 10:59:14

标签: wordpress woocommerce

我在设置中检查了“隐藏缺货”,但是当使用分层导航小部件按鞋号过滤结果时,它返回的产品已将该尺寸列为属性,但尺寸缺货。有没有解决这个问题?

WordPress版本3.9.1,WooCommerce版本2.1.7

http://www.foten.se

3 个答案:

答案 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;

注意:

  1. 这不是该问题的适当解决方案-解决方案应该在设计级别,即找到一种方法来将2个字段与SQL查询链接,该解决方案是暂时的,直到真正的解决方案解决方案可用

  2. 我没有完全测试此代码,以后会在必要时更新答案

  3. 我不完全了解wordpress或woocommerce的数据库结构,并且此代码的​​结果可能会因不同的插件而有所不同,使用此代码的风险由您自己承担

答案 2 :(得分:-1)

在WooCommerce中,默认选项是,它显示搜索结果和产品类别页面中库存和缺货的所有产品。这是一个WooCommerce默认功能

关于此的链接: https://github.com/woothemes/woocommerce/issues/5840

另外,没有相反显示这些产品是一个坏主意,因为它不是最好的SEO实践。