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

时间:2020-03-02 07:00:04

标签: php wordpress woocommerce product cart

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

这是通过下面的代码完成的,该代码可以在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; ?>

但是我不想展示缺货的产品。

我设法更改了交叉销售等的列数,但是我找不到任何只显示可用产品的代码段。

有人可以引导我完成该操作吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

woocommerce->设置-> productst->库存->无库存可见性=选中此按钮。

答案 2 :(得分:0)

受到@7uc1f3r 回答的启发,我提出了这个解决方案,该解决方案也将标题隐藏在 cas 中,没有要显示的产品。

我确实覆盖了 /wp-content/plugins/woocommerce/templates/cart/cross-sells.php,在我的子主题 /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();