Woocommerce: obtener ID del producto desde el SKU de una variación
Estoy creando una tienda web que importa muchos productos desde un archivo CSV. Necesito vincular accesorios disponibles, etc., que se determinan e importan individualmente mediante el SKU de los respectivos productos.
Sé que es posible obtener el ID del producto con un SKU de producto simple usando esto:
wc_get_product_id_by_sku('PRODUCT_SKU');
¿Hay alguna manera de hacer lo mismo, pero con el SKU de una variación?

EDITADO: Parece que ahora puedes usar wc_get_product_id_by_sku() para recuperar una product_variation sin problemas, mira la otra respuesta más abajo.
Me quedé atascado en un problema muy similar. No pude encontrar nada en el código de WooCommerce que permitiera buscar directamente el producto padre desde el SKU de la variación.
Pero, como las variaciones de producto se almacenan en la tabla wp_posts
con el tipo product_variation
, y los SKUs se guardan en la tabla wp_post_meta
, es fácil buscar la variación de producto usando una consulta meta con la función get_posts()
de WordPress.
$args = array(
'post_type' => 'product_variation',
'meta_query' => array(
array(
'key' => '_sku',
'value' => 'PRODUCT_SKU',
)
)
);
$posts = get_posts( $args);
Esto debería devolverte el tipo de post personalizado product_variation
que coincide.
Una vez que lo tienes, puedes buscar el producto padre usando la columna post_parent
que WooCommerce utiliza para vincular una variación con el producto variable padre.
Convertir esto en una función es bastante sencillo:
function wc_get_product_id_by_variation_sku($sku) {
$args = array(
'post_type' => 'product_variation',
'meta_query' => array(
array(
'key' => '_sku',
'value' => $sku,
)
)
);
// Obtener los posts para el sku
$posts = get_posts( $args);
if ($posts) {
return $posts[0]->post_parent;
} else {
return false;
}
}
Yo uso esto en mi sitio y funciona genial. Espero que ayude.

Gracias. Quizás no lo nombres como lo has hecho en caso de que WC eventualmente escriba una función con el mismo nombre ;)

La forma más sencilla es obtener el ID de la variación utilizando la función wc_get_product_id_by_sku
y luego obtener el ID del producto padre para obtener el ID del producto.
$variation_id = wc_get_product_id_by_sku('VARIATION_SKU');
$product_id = wp_get_post_parent_id($variation_id);

Este código no funciona porque busca el SKU en el tipo de publicación "products". Puedes ver la implementación aquí: http://hookr.io/functions/wc_get_product_id_by_sku/
Las variaciones se almacenan como el tipo de publicación "product_variation", por lo que se necesita una función personalizada para encontrar un producto con un SKU de variación.

Estas son las funciones predeterminadas de WooCommerce y funcionan bien para mí. wc_get_product_id_by_sku
devuelve el ID del producto y obviamente es del tipo de publicación "product_variation", pero luego se usa wp_get_post_parent_id
para obtener el producto padre, que será del tipo de publicación "products". Espero que esto aclare tu punto.

Tienes razón Abhijit, parece que ahora funciona bien. Quizás cuando escribí la respuesta en 2018 la API era ligeramente diferente. Estoy seguro de que wc_get_product_id_by_sku
no funcionó para mí en ese momento. El enlace de hookr.io en mi último comentario tampoco parece funcionar ya, así que no puedo verificarlo. Editaré mi respuesta original y los dirigiré a tu respuesta.
