Как получить список изображений товаров WooCommerce определенной категории из базы данных?

2 окт. 2019 г., 08:02:27
Просмотры: 13.7K
Голосов: 4

Я пытаюсь отобразить миниатюры товаров WooCommerce или просто получить URL этих изображений из базы данных. Но я не могу найти столбец, в котором хранятся URL, используя следующий запрос. Одним из условий моего запроса должна быть возможность выбора изображений определенной категории. Я знаю, что _wp_attached_file - это meta_key, и через связанный ID поста я могу получить путь к изображению, но не уверен, как правильно написать запрос.

select * from wp_posts where post_type = "product"

Буду благодарен за любую помощь

4
Комментарии

URL изображений не хранятся в базе данных.

Jacob Peattie Jacob Peattie
2 окт. 2019 г. 08:39:40

Тогда что находится в wp_postmeta, где meta_key равен _wp_attached_file?

ali ali
2 окт. 2019 г. 09:21:31

Это не URL. Это путь, относительный к директории контента, которая определена в PHP. Если вы знаете URL директории контента (что вероятно), вы можете вручную добавить путь к этому URL, но вы не можете запросить из базы данных полный URL файла.

Jacob Peattie Jacob Peattie
2 окт. 2019 г. 09:26:34

Заметил, я изменил на path, чтобы было понятнее. Спасибо. Уверен, что независимо от того, что вернет следующий запрос, мне нужно добавить php-функцию, чтобы получить начальную часть, как вы сказали. Вы не подскажете, что это за функция?

ali ali
3 окт. 2019 г. 00:04:31
Все ответы на вопрос 2
0

Миниатюра записи хранится не в виде URL. Миниатюра записи хранится как ID вложения в метаполе записи _thumbnail_id. Сам файл хранится как метаполе _wp_attached_file для этого вложения. WordPress не сохраняет полный URL вложений в базе данных. Он сохраняет только путь к файлу, относительно директории загрузок.

Этот запрос выведет список ID товаров и пути к их файлам миниатюр. Затем вам нужно будет добавить их к URL вашей директории загрузок:

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'

Так как URL сайта и директория загрузок динамичны и могут контролироваться через PHP, нет смысла хранить полный URL. WordPress использует PHP для определения URL файла на основе конфигурации сайта и относительного пути к файлу. Также нет смысла хранить URL, потому что для некоторых операций требуется путь, а не URL.

Также обратите внимание, что единственная причина использовать SQL для этого - если вы получаете доступ к путям файлов вне WordPress и не используете REST API. Если вы работаете внутри шаблона WordPress/WooCommerce, то правильный способ отображения изображения товара:

$product = wc_get_product( $product_id );

echo $product->get_image( 'full' );
2 окт. 2019 г. 10:54:51
0

@JacobPeattie уже предоставил вам правильный способ получения пути к изображению в WordPress с использованием wc_get_product(..) и метода ->get_image.

Однако можно построить запрос таким образом, чтобы получить полный путь к URL, например:

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

Результат выполнения:

+-----+---------------------------------------------------------------+
| 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 строк в наборе (0.002 сек)                                            
15 янв. 2022 г. 19:39:47