Cómo obtener la lista de imágenes de productos WooCommerce de una categoría específica desde la base de datos
Estoy intentando mostrar las miniaturas de imágenes de productos WC o simplemente obtener la URL de esas imágenes desde la base de datos. Pero no logro encontrar la columna donde se almacenan las URLs con lo siguiente. Una cosa que quiero que tenga mi consulta es la capacidad de seleccionar imágenes de una categoría específica. Sé que _wp_attached_file es la meta clave y a través de su ID de post asociado puedo obtener la ruta de la imagen, pero no estoy seguro de cómo escribirla.
select * from wp_posts where post_type = "product"
Toda ayuda es apreciada
La miniatura de la publicación no se almacena como una URL. La miniatura de la publicación se almacena como el ID del adjunto en el meta post _thumbnail_id. El archivo real se almacena como el meta post _wp_attached_file para esa publicación de adjunto. WordPress no almacena la URL completa de los adjuntos en la base de datos. Solo almacena la ruta al archivo, relativa al directorio de subidas.
Esta consulta listará los IDs de productos y la ruta a sus archivos de miniaturas. Luego necesitarás añadir esas rutas a la URL de tu directorio de subidas:
SELECT
p.ID,
am.meta_value
FROM
wp_posts p
LEFT JOIN
wp_postmeta pm ON
pm.post_id = p.ID AND
pm.meta_key = '_thumbnail_id'
LEFT JOIN
wp_postmeta am ON
am.post_id = pm.meta_value AND
am.meta_key = '_wp_attached_file'
WHERE
p.post_type = 'product' AND
p.post_status = 'publish'
Dado que la URL del sitio y el directorio de subidas son dinámicos, y pueden ser controlados mediante PHP, no tiene sentido almacenar la URL completa. WordPress usa PHP para determinar cuál es la URL del archivo, basándose en la configuración del sitio y la ruta relativa al archivo. Tampoco tiene sentido almacenar la URL, porque algunas operaciones requieren la ruta, no la URL.
También ten en cuenta que la única razón por la que harías esto con SQL es si estuvieras accediendo a las rutas de archivos fuera de WordPress, y no usando la API REST. Si estás dentro de una plantilla de WordPress/WooCommerce, entonces la forma correcta de mostrar la imagen del producto es:
$product = wc_get_product( $product_id );
echo $product->get_image( 'full' );
@JacobPeattie ya te proporcionó la forma correcta de obtener la ruta en WordPress con wc_get_product(..) y el método ->get_image.
Sin embargo, es posible construir una consulta para obtener la ruta completa a la URL de esta manera:
SELECT
p.ID,
CONCAT((SELECT option_value FROM wp_options o WHERE o.option_name = "siteurl"), "/wp-content/uploads/", am.meta_value) AS siteurl
FROM
wp_posts p
LEFT JOIN
wp_postmeta pm ON
pm.post_id = p.ID AND
pm.meta_key = '_thumbnail_id'
LEFT JOIN
wp_postmeta am ON
am.post_id = pm.meta_value AND
am.meta_key = '_wp_attached_file'
WHERE
p.post_type = 'product'
AND p.post_status = 'publish'
AND am.meta_value IS NOT NULL
Resultados:
+-----+---------------------------------------------------------------+
| ID | siteurl |
+-----+---------------------------------------------------------------+
| 374 | https://rolagra.dv/wp-content/uploads/2021/11/products-01.jpg |
| 375 | https://rolagra.dv/wp-content/uploads/2021/11/products-04.jpg |
| 376 | https://rolagra.dv/wp-content/uploads/2021/11/products-05.jpg |
| 377 | https://rolagra.dv/wp-content/uploads/2021/11/products-08.jpg |
| 378 | https://rolagra.dv/wp-content/uploads/2021/11/products-09.jpg |
| 379 | https://rolagra.dv/wp-content/uploads/2021/11/products-06.jpg |
| 380 | https://rolagra.dv/wp-content/uploads/2021/11/products-02.jpg |
| 381 | https://rolagra.dv/wp-content/uploads/2021/11/products-03.jpg |
| 454 | https://rolagra.dv/wp-content/uploads/2021/11/products-04.jpg |
+-----+---------------------------------------------------------------+
9 filas en set (0.002 sec)