Вопрос или проблема
Я пытаюсь понять, как проверять наличие продуктов в соответствии с их артикулом (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.
Основные шаги для реализации:
-
Добавление проверки наличия товаров по SKU: В текущем коде, когда вы проверяете наличие товаров для нового и б/у, необходимо дополнить условия, чтобы проверялись не только статусы наличия, но и сам SKU товара.
-
Использование
meta_query
для фильтрации по состоянию товара: Мы создадим более сложный запросmeta_query
, который будет проверять наличие конкретного состояния товара. -
Логика отключения кнопки "Купить б/у": В зависимости от результатов запроса необходимо будет отключить кнопку "Купить б/у".
Вот как это можно реализовать:
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,
);
}
Пояснения к коду:
-
Добавление условия для каждой категории товара: В зависимости от состояния ("новый" или "б/у"), в
meta_query
добавляется проверка наличия товара. -
Использование JavaScript для управления кнопкой: Код JavaScript отключает или включает кнопку "Купить б/у" в зависимости от наличия б/у товаров. Убедитесь, что у вашей кнопки есть правильный ID (например,
id="buy-used-button"
), чтобы скрипт работал корректно. -
Обработка результатов запроса: При получении результатов запроса определяется наличие товаров и отображается соответствующее сообщение, если они не найдены.
Эти изменения помогут вам создать фильтр, который будет нагружать только доступные товары в зависимости от их состояния.