在 WooCommerce 中隐藏缺货相关产品

问题描述 投票:0回答:7

在 WooCommerce 中,我想在单个产品页面中隐藏相关产品中的缺货产品。可以吗?

任何曲目都值得赞赏。

php wordpress woocommerce product hook-woocommerce
7个回答
13
投票

这里给出的答案都不适合我(我相信提到的

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;
}

希望对寻找类似解决方案的人有所帮助。


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;
}

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

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

有2种方法可以做到:

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_%'");
}

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

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


1
投票

是的,可以从相关产品中隐藏缺货产品。

将以下内容添加到functions.php – 这将从相关产品中隐藏缺货产品。

add_filter( 'woocommerce_output_related_products_args', function( $args )
{
    $args = wp_parse_args( array(
        'posts_per_page' => 4,
        'meta_query' => array (
           'key' => '_stock_status',
           'value' => 'instock'
    )
    ), $args );
    return $args;
});

每页行的帖子可以删除,但它可以快速可视化这对您的相关产品块有效。


1
投票

对于那些没有找到解决方案的人: 在 Woocommerce +6 上测试

add_filter( 'woocommerce_related_products', 'vahids_related_products', 10, 3 );
function vahids_related_products( $related_posts, $product_id, $args ){
    $in_stock_product_ids = (array) wc_get_products( array(
        'status'       => 'publish',
        'limit'        => -1,
        'stock_status' => 'instock',
        'return'       => 'ids',
     ));

    return $in_stock_product_ids;
}

0
投票

所有代码都不起作用!每次你需要买别的东西时,Wocomerce 都太不友好了......


-1
投票

这是这里的工作代码。 将此代码添加到您的functions.php中,您将看到我们的股票产品将不会在相关产品块中看到。代码来自这里:https://stackoverflow.com/a/60978253/15213069

    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;
}

-2
投票

创建一个函数并将其挂钩到 woocommerce 的相关产品挂钩,例如:

function dont_show_outofstock( $is_visible, $id ) {
    $product = new wC_Product( $id );

    if ( ! $product->is_in_stock() && ! $product->backorders_allowed() ) {
    $is_visible = false;
    }

    return $is_visible;
}
add_filter( 'woocommerce_output_related_products_args', 'dont_show_outofstock', 10, 2 );
© www.soinside.com 2019 - 2024. All rights reserved.