WooCommerce: получение ID товара по артикулу (SKU) вариации
Я создаю интернет-магазин, который импортирует множество товаров из CSV-файла. Мне нужно связать доступные аксессуары и т.д., которые индивидуально определяются и импортируются по SKU соответствующих товаров.
Я знаю, что можно получить ID товара с помощью простого SKU товара следующим образом:
wc_get_product_id_by_sku('PRODUCT_SKU');
Есть ли способ сделать то же самое, но с SKU вариации товара?

РЕДАКТИРОВАНО: Похоже, что теперь вы можете использовать функцию 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;
}
}
Я использую это на своем сайте, и это отлично работает. Надеюсь, это поможет.

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

Самый простой способ - получить 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);

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

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

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