Php “仅显示”;库存;WooCommerce单一产品页面上的相关产品

Php “仅显示”;库存;WooCommerce单一产品页面上的相关产品,php,wordpress,woocommerce,product,Php,Wordpress,Woocommerce,Product,我只想在WooCommerce单一产品页面上显示“库存”相关产品 我知道我可以通过我的主题覆盖单个产品/related.php模板文件。以下是此模板的相关代码: 是否可以对此文件进行一些更改,以便在WooCommerce单一产品页面上仅显示“库存”相关产品?感谢您的帮助。更新 因为当前4个产品缺货时,它不会显示任何内容(如果显示默认的4个产品)您可以使用以下代码段,而不是覆盖模板文件 函数过滤器\u商业\u相关\u产品($related\u posts,$product\u id,$arg

我只想在WooCommerce单一产品页面上显示“库存”相关产品

我知道我可以通过我的主题覆盖
单个产品/related.php
模板文件。以下是此模板的相关代码:




是否可以对此文件进行一些更改,以便在WooCommerce单一产品页面上仅显示“库存”相关产品?感谢您的帮助。

更新

因为当前4个产品缺货时,它不会显示任何内容(如果显示默认的4个产品)您可以使用以下代码段,而不是覆盖模板文件

函数过滤器\u商业\u相关\u产品($related\u posts,$product\u id,$args){
foreach($key=>$related_post的相关职位){
//获得产品
$related_product=wc_get_product($related_post);
//是一种WC产品
如果(是一种($related_product,'WC_product')){
//库存状态
$stock_status=$related_product->get_stock_status();
//不是因斯托克
如果($stock_status!=“instock”){
未设置($related_posts[$key]);
}
}
}
返回$U相关帖子;
}
添加过滤器('woocommerce\u相关产品','filter\u woocommerce\u相关产品',10,3);


覆盖模板文件

始终存在多个解决方案,但其中一个可以通过覆盖模板文件来实现

  • 通过将此模板复制到
    yourtheme/woocommerce/single product/related.php

替换

<?php foreach ( $related_products as $related_product ) : ?>

        <?php
        $post_object = get_post( $related_product->get_id() );

        setup_postdata( $GLOBALS['post'] =& $post_object ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited, Squiz.PHP.DisallowMultipleAssignments.Found

        wc_get_template_part( 'content', 'product' );
        ?>

<?php endforeach; ?>


您可以使用
woocommerce\u product\u related\u posts\u query
专用过滤器钩子更改查询,从显示的相关产品中排除“缺货”产品:

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 != 'outofstock' ";

    return $query;
}
代码进入活动子主题(或活动主题)的functions.php文件。测试和工作


相关:

这是我一直在使用的,它对我很有用:

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

if (!is_admin()) {
    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;
  }
}

@MohamedAliSamali抱歉,但此代码有效,仅显示未缺货的相关产品,这是您在问题中提出的问题…对于您的问题,您有时可能需要进入WooCommerce设置>状态>工具(选项卡),并在“WooCommerce瞬态”中单击“清除瞬态”.添加过滤器可以工作,但它会隐藏所有内容。我想只需要4到5个第一批产品。。。如果第四或第五批产品缺货,则不会显示任何内容。但在我的例子中,产品6,7。。。没有缺货。此条件有效,但是,例如,如果前4个产品缺货,则不会显示任何内容。如果我想展示一些产品,因为不是所有相关产品都脱销了,该怎么办?@Mohamedali我已经更新了我对您额外请求的回复,但是,不要忘记,因为我已经指出,关于堆栈溢出的一般规则是一次一个问题。确保您的问题始终包含足够的内容,以便回答您问题的人能够立即了解所有内容