在WooCommerce单个产品页面上仅显示"in stock"相关产品



我只想显示"库存";WooCommerce单一产品页面上的相关产品。

我知道我可以通过我的主题覆盖single-product/related.php模板文件。下面是该模板的相关代码:

<section class="related products">
<h2><?php _e( 'You May Also Want', 'MyStore' ); ?></h2>
<?php woocommerce_product_loop_start(); ?>
<?php foreach ( $related_products as $related_product ) : ?>
<?php
$post_object = get_post( $related_product->get_id() );
setup_postdata( $GLOBALS['post'] =& $post_object );
wc_get_template_part( 'content', 'product' ); ?>

<?php endforeach; ?>
<?php woocommerce_product_loop_end(); ?>
</section>

是否可以对该文件进行一些更改以仅显示";库存";WooCommerce单一产品页面上的相关产品?感谢您的帮助。

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

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

您可以使用woocommerce_product_related_posts_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文件中。测试并工作。

相关:在Woocommerce 中使用自定义元查询自定义相关产品

更新

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

function filter_woocommerce_related_products( $related_posts, $product_id, $args ) {    
foreach( $related_posts as $key => $related_post ) {        
// Get product
$related_product = wc_get_product( $related_post );

// Is a WC product 
if ( is_a( $related_product, 'WC_Product' ) ) {
// Stock status
$stock_status = $related_product->get_stock_status();

// NOT instock
if ( $stock_status != 'instock' ) {
unset( $related_posts[$key] );
}
}
}

return $related_posts;
}
add_filter( 'woocommerce_related_products', 'filter_woocommerce_related_products', 10, 3 );


覆盖模板文件

总是有多个解决方案,但其中一个可能是通过覆盖模板文件。

https://github.com/woocommerce/woocommerce/blob/02cf0dfaed5923513de0c88add597d1560c2cfd2/templates/single-product/related.php

  • 可以通过将此模板复制到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; ?>

<?php foreach ( $related_products as $related_product ) : ?>
<?php
$stock_status = $related_product->get_stock_status();
if ( $stock_status == 'instock' ) {

$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; ?>

最新更新