WooCommerce - 不要在购物车页面上显示缺货的交叉销售产品

WooCommerce - Don't display cross sells products which are out of the stock on cart page

我的主题在购物车页面上显示交叉销售产品,这很好。

这是通过下面的代码完成的,可以在 cart/cross-sells.php 模板文件中找到。

<?php foreach ( $cross_sells as $cross_sell ) : ?>

    <?php
        $post_object = get_post( $cross_sell->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->设置->产品->库存->缺货可见性=选中此按钮。

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

https://github.com/woocommerce/woocommerce/blob/3.8.0/templates/cart/cross-sells.php

替换(第 28 - 38 行)

<?php foreach ( $cross_sells as $cross_sell ) : ?>

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

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

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

<?php endforeach; ?>

<?php foreach ( $cross_sells as $cross_sell ) : ?>

    <?php
        $stock_status = $cross_sell->get_stock_status();

        if ( $stock_status != 'outofstock' ) {

            $post_object = get_post( $cross_sell->get_id() );

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

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

<?php endforeach; ?>

受@7uc1f3r 回答的启发,我想出了这个解决方案,它也隐藏了 cas 中的标题,没有产品可显示。

我确实覆盖了 /wp-content/plugins/woocommerce/templates/cart/cross-sells.php,在我的 child 主题 /wp-content/themes/MY-CHILD-THEME/woocommerce/content-product.php 中创建了一个文件,代码如下:

<?php
/**
 * Cross-sells
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/cart/cross-sells.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce\Templates
 * @version 4.4.0
 */

defined( 'ABSPATH' ) || exit;

if ( $cross_sells ) : ?>
    <?php
        ob_start();
        foreach ( $cross_sells as $cross_sell ) :
            $stock_status = $cross_sell->get_stock_status();
            if ( $stock_status != 'outofstock' ) { // only display product if it is not out of stock
                $post_object = get_post( $cross_sell->get_id() );

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

                wc_get_template_part( 'content', 'product' );
            }
        endforeach;
        $html = ob_get_clean();
        if ($html) { // only display the whole cross sells section of there's something to display
            ?>
                <div class="cross-sells">
                    <?php
                    $heading = apply_filters( 'woocommerce_product_cross_sells_products_heading', __( 'You may be interested in&hellip;', 'woocommerce' ) );

                    if ( $heading ) :
                        ?>
                        <h2><?php echo esc_html( $heading ); ?></h2>
                    <?php endif; ?>

                    <?php woocommerce_product_loop_start(); ?>

                    <?php echo $html; ?>

                    <?php woocommerce_product_loop_end(); ?>

                </div>

            <?php
        }
    ?>
    <?php
endif;

wp_reset_postdata();