Проверка наличия товара в соответствии с SKU продукта

Вопрос или проблема

Я пытаюсь понять, как проверять наличие продуктов в соответствии с их артикулом (SKU). Я уже узнал, как проверить, есть ли товар в наличии. Однако у каждого товара есть 3 кнопки покупки: одна для аренды, одна для новой покупки и одна для покупки б/у. Меня интересуют только кнопки для покупки б/у и новой покупки. Если нет товаров, которые обозначены как ‘б/у’, то, в идеале, при поиске б/у товаров они не должны отображаться, кнопка “Купить б/у” должна быть отключена и не должна позволять пользователям совершать покупку. Но по какой-то причине единственный способ, чтобы товар вообще не отображался, это если все 3 атрибута, б/у, аренда, и новая, находятся вне наличия. Качество каждого товара основано на его артикуле (SKU). Как я могу сделать так, чтобы я проверял количество конкретного товара на основе его SKU?

Вот мой основной код, который я использовал для фильтрации:

function unified_product_filter($filters) {
    $excluded_ids = array(6949, 6948, 6947, 6946, 6944, 6935, 6883, 5584, 6097, 6096, 5747, 5581, 5580, 5579, 5577, 5547);
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post__not_in' => $excluded_ids,
        'orderby' => array(
            'menu_order' => 'ASC',
            'date' => 'DESC'
        ),
    );

    $has_filters = !empty($filters);
    if ($has_filters) {
        $args['tax_query'] = array('relation' => 'AND');
        foreach ($filters as $attribute => $value) {
            $args['tax_query'][] = array(
                'taxonomy' => 'pa_' . $attribute,
                'field' => 'slug',
                'terms' => $value,
            );
        }

        // Добавить условие для "б/у" товаров
        if (isset($filters['condition']) && $filters['condition'] === 'used') {
            $args['meta_query'] = array(
                array(
                    'key' => '_stock_status',
                    'value' => 'instock',
                    'compare' => '=',
                )
            );
        }
        



        // Добавить условие для "новых" товаров
        if (isset($filters['condition']) && $filters['condition'] === 'new') {
            $args['meta_query'] = array(
                array(
                    'key' => '_stock_status',
                    'value' => 'instock',
                    'compare' => '=',
                )
            );
        }


    }




    

    // Запрос на отфильтрованные товары
    $products = new WP_Query($args);

    ob_start();
    if ($products->have_posts()) {
        while ($products->have_posts()) {
            $products->the_post();
            wc_get_template_part('content', 'product');
        }
    } else {
        echo '<h1>Товары не найдены</h1>';
    }
    $filtered_html = ob_get_clean();

    wp_reset_postdata();

    // Запрос на неотфильтрованные товары, если фильтры активны
    $other_html="";
    if ($has_filters) {
        $filtered_product_ids = wp_list_pluck($products->posts, 'ID');
        $unfiltered_args = array(
            'post_type' => 'product',
            'posts_per_page' => -1,
            'post__not_in' => array_merge($excluded_ids, $filtered_product_ids),
        );

        $unfiltered_products = new WP_Query($unfiltered_args);

        ob_start();
        if ($unfiltered_products->have_posts()) {
            while ($unfiltered_products->have_posts()) {
                $unfiltered_products->the_post();
                wc_get_template_part('content', 'product');
            }
        }
        $other_html = ob_get_clean();

        wp_reset_postdata();
    }

    return array(
        'filtered_products' => $filtered_html,
        'other_products' => $other_html,
    );
}

Ответ или решение

Для реализации функционала проверки наличия товаров в соответствии с их SKU и отключения кнопки "Купить б/у", если товар отсутствует на складе, необходимо внести изменения в ваш код. Основная идея заключается в добавлении условий, которые будут проверять наличие товаров в зависимости от их состояния (новый или б/у) по их уникальному идентификатору SKU.

Основные шаги для реализации:

  1. Добавление проверки наличия товаров по SKU: В текущем коде, когда вы проверяете наличие товаров для нового и б/у, необходимо дополнить условия, чтобы проверялись не только статусы наличия, но и сам SKU товара.

  2. Использование meta_query для фильтрации по состоянию товара: Мы создадим более сложный запрос meta_query, который будет проверять наличие конкретного состояния товара.

  3. Логика отключения кнопки "Купить б/у": В зависимости от результатов запроса необходимо будет отключить кнопку "Купить б/у".

Вот как это можно реализовать:

function unified_product_filter($filters) {
    $excluded_ids = array(6949, 6948, 6947, 6946, 6944, 6935, 6883, 5584, 6097, 6096, 5747, 5581, 5580, 5579, 5577, 5547);
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'post__not_in' => $excluded_ids,
        'orderby' => array(
            'menu_order' => 'ASC',
            'date' => 'DESC'
        ),
    );

    $has_filters = !empty($filters);
    if ($has_filters) {
        $args['tax_query'] = array('relation' => 'AND');
        foreach ($filters as $attribute => $value) {
            $args['tax_query'][] = array(
                'taxonomy' => 'pa_' . $attribute,
                'field' => 'slug',
                'terms' => $value,
            );
        }

        // Логика проверки для б/у товаров
        if (isset($filters['condition']) && $filters['condition'] === 'used') {
            $args['meta_query'][] = array(
                'key' => '_stock_status',
                'value' => 'instock',
                'compare' => '=',
            );
        }

        // Логика проверки для новых товаров
        if (isset($filters['condition']) && $filters['condition'] === 'new') {
            $args['meta_query'][] = array(
                'key' => '_stock_status',
                'value' => 'instock',
                'compare' => '=',
            );
        }
    }

    // Запрос для фильтрованных товаров
    $products = new WP_Query($args);

    ob_start();
    if ($products->have_posts()) {
        while ($products->have_posts()) {
            $products->the_post();
            wc_get_template_part('content', 'product');
        }
    } else {
        echo '<h1>Товары не найдены</h1>';
    }
    $filtered_html = ob_get_clean();
    wp_reset_postdata();

    // Логика отключения кнопки "Купить б/у"
    if (isset($filters['condition']) && $filters['condition'] === 'used') {
        $used_products_in_stock = count($products->posts) > 0; // Если есть б/у товары на складе
        echo '<script type="text/javascript">';
        echo $used_products_in_stock ? "document.getElementById('buy-used-button').disabled = false;" : "document.getElementById('buy-used-button').disabled = true;";
        echo '</script>';
    }

    // Запрос на неперфильтрованные товары, если фильтры активны
    $other_html = "";
    if ($has_filters) {
        $filtered_product_ids = wp_list_pluck($products->posts, 'ID');
        $unfiltered_args = array(
            'post_type' => 'product',
            'posts_per_page' => -1,
            'post__not_in' => array_merge($excluded_ids, $filtered_product_ids),
        );

        $unfiltered_products = new WP_Query($unfiltered_args);

        ob_start();
        if ($unfiltered_products->have_posts()) {
            while ($unfiltered_products->have_posts()) {
                $unfiltered_products->the_post();
                wc_get_template_part('content', 'product');
            }
        }
        $other_html = ob_get_clean();
        wp_reset_postdata();
    }

    return array(
        'filtered_products' => $filtered_html,
        'other_products' => $other_html,
    );
}

Пояснения к коду:

  1. Добавление условия для каждой категории товара: В зависимости от состояния ("новый" или "б/у"), в meta_query добавляется проверка наличия товара.

  2. Использование JavaScript для управления кнопкой: Код JavaScript отключает или включает кнопку "Купить б/у" в зависимости от наличия б/у товаров. Убедитесь, что у вашей кнопки есть правильный ID (например, id="buy-used-button"), чтобы скрипт работал корректно.

  3. Обработка результатов запроса: При получении результатов запроса определяется наличие товаров и отображается соответствующее сообщение, если они не найдены.

Эти изменения помогут вам создать фильтр, который будет нагружать только доступные товары в зависимости от их состояния.

Оцените материал
Добавить комментарий

Капча загружается...