Cómo obtener la lista de imágenes de productos WooCommerce de una categoría específica desde la base de datos

2 oct 2019, 08:02:27
Vistas: 13.7K
Votos: 4

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

4
Comentarios

Las URLs de imágenes no se almacenan en la base de datos.

Jacob Peattie Jacob Peattie
2 oct 2019 08:39:40

Entonces, ¿qué hay dentro de wp_postmeta donde meta_key es _wp_attached_file?

ali ali
2 oct 2019 09:21:31

No es una URL. Es la ruta, relativa al directorio de contenido, que está definida en PHP. Si sabes cuál es la URL del directorio de contenido, que probablemente sí lo sepas, puedes manualmente añadir la ruta a esa URL, pero no puedes consultar la base de datos para obtener una URL completa de un archivo.

Jacob Peattie Jacob Peattie
2 oct 2019 09:26:34

Anotado, lo cambié a path para que sea más claro. Gracias. Estoy seguro de que, sea lo que sea que devuelva la siguiente consulta, debería agregar una función php para obtener la parte inicial como dijiste, ¿sabes cuál es?

ali ali
3 oct 2019 00:04:31
Todas las respuestas a la pregunta 2
0

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' );
2 oct 2019 10:54:51
0

@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)                                            
15 ene 2022 19:39:47