Как получить ID стандартной вариации (woocommerce)

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

Мне нужно создать дополнительную кнопку “Добавить в корзину” на странице продукта. С простым продуктом с этим нет проблем. С продуктом с вариантами сложнее. Чтобы создать такую кнопку, мне нужно знать 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 варианта по умолчанию

  1. Получение объекта продукта: Используйте функцию wc_get_product(), чтобы получить объект продукта на основе его ID.
  2. Проверка типа продукта: Убедитесь, что продукт является вариативным (WC_Product_Variable).
  3. Получение атрибутов по умолчанию: Используйте метод $product->get_default_attributes(), чтобы получить массив атрибутов по умолчанию.
  4. Проверка доступных вариантов: Используйте метод $product->get_available_variations() для получения всех доступных вариантов (включая их атрибуты, ID и цены).
  5. Сравнение атрибутов: Сравните атрибуты каждого варианта с атрибутами по умолчанию, чтобы найти совпадение.

Вот пример кода, который выполняет эти шаги:

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, не стесняйтесь спрашивать!

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

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