WooCommerce: получение ID товара по артикулу (SKU) вариации

26 мар. 2018 г., 10:05:08
Просмотры: 25.2K
Голосов: 1

Я создаю интернет-магазин, который импортирует множество товаров из CSV-файла. Мне нужно связать доступные аксессуары и т.д., которые индивидуально определяются и импортируются по SKU соответствующих товаров.

Я знаю, что можно получить ID товара с помощью простого SKU товара следующим образом:

wc_get_product_id_by_sku('PRODUCT_SKU');

Есть ли способ сделать то же самое, но с SKU вариации товара?

0
Все ответы на вопрос 2
2

РЕДАКТИРОВАНО: Похоже, что теперь вы можете использовать функцию wc_get_product_id_by_sku() для получения product_variation без каких-либо проблем, смотрите другой ответ ниже.

Я столкнулся с очень похожей проблемой. В коде WooCommerce я не нашел ничего, что позволяло бы напрямую найти родительский товар по SKU вариации. Но, поскольку вариации товаров хранятся в таблице wp_posts с типом product_variation, а SKU хранятся в таблице wp_post_meta, можно легко найти вариацию товара, используя meta query с функцией WordPress get_posts().

$args = array(
    'post_type'  => 'product_variation',
    'meta_query' => array(
        array(
            'key'   => '_sku',
            'value' => 'PRODUCT_SKU',
        )
    )
);
$posts = get_posts( $args);

Это должно вернуть ваш соответствующий тип записи product_variation.

После этого вы можете найти родительский товар, используя столбец post_parent, который WooCommerce использует для связи вариации с родительским вариативным товаром.

Превратить это в функцию довольно просто:

function wc_get_product_id_by_variation_sku($sku) {
    $args = array(
        'post_type'  => 'product_variation',
        'meta_query' => array(
            array(
                'key'   => '_sku',
                'value' => $sku,
            )
        )
    );
    // Получаем записи по SKU
    $posts = get_posts( $args);
    if ($posts) {
        return $posts[0]->post_parent;
    } else {
        return false;
    }
}

Я использую это на своем сайте, и это отлично работает. Надеюсь, это поможет.

12 июн. 2018 г. 13:20:28
Комментарии

Спасибо. Возможно, не стоит называть так, как у вас, на случай, если WC в будущем создаст функцию с таким же именем ;)

Andrew Schultz Andrew Schultz
10 нояб. 2020 г. 05:40:38

Сэр, чтение 'product_variation' решило то, над чем я работал сегодня вечером. Если бы мы были в одной комнате, я бы был должен вам выпить. СПАСИБО!

Dadou Dadou
7 дек. 2021 г. 04:49:53
3

Самый простой способ - получить ID вариации с помощью функции wc_get_product_id_by_sku, а затем получить ID родительского поста, чтобы получить ID товара.

$variation_id = wc_get_product_id_by_sku('VARIATION_SKU');
$product_id = wp_get_post_parent_id($variation_id);
17 мая 2020 г. 15:28:57
Комментарии

Этот код не работает, потому что он ищет артикул (SKU) в типе записи "products". Реализацию можно посмотреть здесь: http://hookr.io/functions/wc_get_product_id_by_sku/

Вариации хранятся как тип записи "product_variation", поэтому нужна пользовательская функция для поиска товара по SKU вариации.

Tim Tim
22 июл. 2021 г. 11:42:31

Это стандартные функции WooCommerce, и у меня они работают нормально. wc_get_product_id_by_sku возвращает ID товара, который очевидно относится к типу записи "product_variation", но затем используется wp_get_post_parent_id для получения родительского товара, который уже будет типа "products". Надеюсь, это проясняет ваш вопрос.

Abhijit Goswami Abhijit Goswami
30 нояб. 2023 г. 08:23:02

Вы правы, Abhijit, сейчас это действительно работает нормально. Возможно, когда я писал ответ в 2018 году, API немного отличался. Я уверен, что тогда wc_get_product_id_by_sku у меня не работал. Ссылка на hookr.io из моего предыдущего комментария тоже больше не работает, так что я не могу проверить. Я отредактирую свой оригинальный ответ и укажу на ваш ответ.

Tim Tim
4 дек. 2023 г. 15:14:40