Показывать только те товары, которые есть в наличии, на странице одного товара WooCommerce

Я хотел бы показывать только товары, связанные со складами, на страницах отдельных товаров 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 отображались только товары, связанные со складами? Любая помощь приветствуется.

См. также:  Не удалось установить соединение с SQL Server 2019
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 3
  1. Mohamed Ali Samali

    Вместо редактирования файлов шаблонов вы можете использовать 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

    @MohamedAliSamali Извините, но этот код работает и отображает только связанные продукты, которых нет на складе, это то, что вы задали в своем вопросе … Для решения вашей проблемы вам может потребоваться иногда зайти в настройки WooCommerce ›Статус› Инструменты (вкладка) < / i>, а в переходных процессах WooCommerce нажмите Очистить переходные процессы. person Mohamed Ali Samali; 27.10.2020

    add_filter работает, но все скрывает. Я думаю, что нужно только 4 или 5 первых продуктов … если 4 или 5 первых продуктов нет в наличии, он ничего не покажет. но в моем случае продуктов 6, 7 … нет в наличии. person Mohamed Ali Samali; 28.10.2020

  2. Mohamed Ali Samali

    ОБНОВЛЕНИЕ

    Поскольку, когда 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 );
    


    Перезапись файла шаблона

    Всегда есть несколько решений, но одно из них может заключаться в перезаписи файла шаблона.

    • Этот шаблон можно переопределить, скопировав его в 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; ?>
    

    Это условие работает, но если, например, 4 первых товара отсутствуют в наличии, оно ничего не отображает. как это сделать, если я хочу отобразить некоторые продукты, потому что не все связанные продукты отсутствуют в наличии? person Mohamed Ali Samali; 28.10.2020

    @MohamedAliSamali Я обновил свой ответ на ваш дополнительный запрос, однако не забывайте, поскольку я уже указывал, что общее правило переполнения стека — это один вопрос за раз. Убедитесь, что ваши вопросы всегда содержат достаточно и

    четкой информации, чтобы все сразу было понятно человеку, отвечающему на ваш вопрос. person Mohamed Ali Samali; 28.10.2020

  3. Mohamed Ali Samali

    Это то, что я использовал, и у меня это работает:

    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;
      }
    }
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: