在 WooCommerce 中隐藏缺货相关产品

sar*_*ler 3 php wordpress product woocommerce hook-woocommerce

在WooCommerce我想隐藏股票出从产品的相关产品在单品页。是否可以?

任何曲目表示赞赏。

dmo*_*moz 7

这里给出的答案都不适合我(我相信woocommerce_output_related_products_args提到的过滤器不接受 meta_queries),我想要一个不使用 SQL 查询的解决方案,所以我把下面的解决方案放在一起:

add_filter( 'woocommerce_related_products', 'mysite_filter_related_products', 10, 1 );
function mysite_filter_related_products( $related_product_ids ) {

    foreach( $related_product_ids as $key => $value ) {
        $relatedProduct = wc_get_product( $value );
        if( ! $relatedProduct->is_in_stock() ) {
            unset( $related_product_ids["$key"] );
        }
    }

    return $related_product_ids;
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助寻找类似解决方案的人。


Loi*_*tec 6

2021 年更新

您可以使用以下内容:

add_filter( 'woocommerce_product_related_posts_query', 'alter_product_related_posts_query', 10, 3 );
function alter_product_related_posts_query( $query, $product_id, $args ){
    global $wpdb;

    $query['join']  .= " INNER JOIN {$wpdb->postmeta} as pm ON p.ID = pm.post_id ";
    $query['where'] .= " AND pm.meta_key = '_stock_status' AND meta_value = 'instock' ";
    
    return $query;
}
Run Code Online (Sandbox Code Playgroud)

代码位于活动子主题(或活动主题)的functions.php 文件中。

现在我们需要删除“相关产品”缓存数据,删除相关瞬态以刷新此缓存(感谢@Cody Rees

有两种方法可以做到这一点:

1)。最简单的方法:

转到管理 Woocommerce > 状态 > 工具 > WooCommerce 瞬态,然后按“清除瞬态”。

2)。针对要删除的特定相关瞬态的另一种方法:

添加以下代码并保存:

add_action('init', 'delete_related_products_cached_data');
function delete_related_products_cached_data() {
    global $wpdb;

    $wpdb->query("DELETE FROM {$wpdb->prefix}options WHERE `option_name` LIKE '_transient_wc_related_%'");
}
Run Code Online (Sandbox Code Playgroud)

代码位于活动子主题(或活动主题)的functions.php 文件中。

只需浏览网站的任何页面即可运行一次并将其删除。