Вопрос или проблема
Мне нужно создать дополнительную кнопку “Добавить в корзину” на странице продукта. С простым продуктом с этим нет проблем. С продуктом с вариантами сложнее. Чтобы создать такую кнопку, мне нужно знать ID стандартного варианта.
$product->get_default_attributes();
Возвращает только имя атрибута и значение, без ID.
Как получить ID стандартного варианта в php коде?
<?php
/**
* Получить стандартную вариацию продукта
*
* Примечание: этот метод проверяет на точное совпадение.
*
* @param mixed $product_id WC_Product|WP_Post|int|bool $product Экземпляр продукта, экземпляр поста, числовое значение или false для использования глобального $post.
* @param string $return Необязательно. Формат для возврата результатов. Может быть 'id' для возврата id вариации или 'object' для объекта вариации продукта. По умолчанию 'id'.
*
* @return int|WC_Product_Variation Возвращает 0, если не найдено.
*/
function wc_get_default_variation( $product_id = false, $return = 'id' ) {
// не используйте wc_get_product(), чтобы обойти некоторые ограничения
$product = WC()->product_factory->get_product( $product_id );
if ( empty( $product ) || ! $product instanceof WC_Product_Variable ) {
return 0;
}
if ( $product->has_child() ) {
$attributes = $product->get_default_attributes();
if ( ! empty( $attributes ) ) {
$check_count = true;
$attributes_count = count( $attributes );
// получаем доступные вариации в наличии (если это разрешено в настройках wc) и видимые
$variations = $product->get_available_variations( 'objects' );
foreach ( $variations as $variation ) {
$variation_attributes = $variation->get_attributes();
// проверяем количество в первый раз
// если не совпадает, это означает, что пользователь не установил стандартное значение для некоторых атрибутов вариации
if ( $check_count && $attributes_count !== count( $variation_attributes ) ) {
break;
}
// больше не нужно проверять количество
$check_count = false;
// удаляем 'любые' атрибуты (пустые значения)
$variation_attributes = array_filter( $variation_attributes );
// добавляем 'любые' атрибуты со стандартным значением
$variation_attributes = wp_parse_args( $variation_attributes, $attributes );
// проверяем, является ли стандартным
if ( $variation_attributes == $attributes ) {
if ( $return === 'id' ) {
return $variation->get_id();
}
return $variation;
}
}
}
}
return 0;
}
https://gist.github.com/AkramiPro/c8ddb83d253714730ac26d3a64e7941e
Попробуйте этот код
add_filter('woocommerce_variable_price_html', 'custom_variation_price', 10, 2);
function custom_variation_price( $price, $product ) {
$available_variations = $product->get_available_variations();
$selectedPrice="";
$dump = '';
foreach ( $available_variations as $variation )
{
// $dump = $dump . '<pre>' . var_export($variation['attributes'], true) . '</pre>';
$isDefVariation=false;
foreach($product->get_default_attributes() as $key=>$val){
// $dump = $dump . '<pre>' . var_export($key, true) . '</pre>';
// $dump = $dump . '<pre>' . var_export($val, true) . '</pre>';
if($variation['attributes']['attribute_'.$key]==$val){
$isDefVariation=true;
}
}
if($isDefVariation){
$price = $variation['display_price'];
}
}
$selectedPrice = wc_price($price);
// $dump = $dump . '<pre>' . var_export($available_variations, true) . '</pre>';
return $selectedPrice . $dump;
}
Ответ или решение
Чтобы получить ID варианта по умолчанию в WooCommerce, вам нужно сначала получить объект продукта и его доступные варианты. В WooCommerce вариативные продукты могут иметь несколько вариантов, каждый из которых может иметь свои собственные атрибуты. Вот как это можно сделать в PHP:
Шаги для получения ID варианта по умолчанию
- Получение объекта продукта: Используйте функцию
wc_get_product()
, чтобы получить объект продукта на основе его ID. - Проверка типа продукта: Убедитесь, что продукт является вариативным (
WC_Product_Variable
). - Получение атрибутов по умолчанию: Используйте метод
$product->get_default_attributes()
, чтобы получить массив атрибутов по умолчанию. - Проверка доступных вариантов: Используйте метод
$product->get_available_variations()
для получения всех доступных вариантов (включая их атрибуты, ID и цены). - Сравнение атрибутов: Сравните атрибуты каждого варианта с атрибутами по умолчанию, чтобы найти совпадение.
Вот пример кода, который выполняет эти шаги:
function wc_get_default_variation($product_id = false, $return = 'id') {
// Получаем объект продукта
$product = wc_get_product($product_id);
if (empty($product) || !$product instanceof WC_Product_Variable) {
return 0; // Не является вариативным продуктом
}
// Получаем атрибуты по умолчанию
$attributes = $product->get_default_attributes();
// Проверяем, есть ли атрибуты
if (!empty($attributes)) {
// Получаем доступные варианты
$variations = $product->get_available_variations('objects');
// Проходимся по каждому варианту
foreach ($variations as $variation) {
$variation_attributes = $variation->get_attributes();
// Сравниваем атрибуты
if ($variation_attributes == $attributes) {
return $return === 'id' ? $variation->get_id() : $variation;
}
}
}
return 0; // Вариант не найден
}
Как использовать функцию
Теперь вы можете вызвать эту функцию, передав ID вашего продукта:
$product_id = 123; // Замените на ID вашего продукта
$default_variation_id = wc_get_default_variation($product_id);
if ($default_variation_id) {
echo "ID варианта по умолчанию: " . $default_variation_id;
} else {
echo "Вариант по умолчанию не найден.";
}
Заключение
Используя вышеприведенный код, вы сможете легко извлечь ID варианта по умолчанию для вариативного продукта в WooCommerce. Это позволит вам, например, добавлять дополнительную кнопку "Добавить в корзину" на странице продукта с использованием правильного варианта.
Если у вас есть дополнительные вопросы или вам нужна помощь с другим функционалом WooCommerce, не стесняйтесь спрашивать!