Функция позволяет получить ID изображения (не только изображения – любого вложения в WordPress) по URL файла.
Возвращает целое число (ID) либо 0, если ничего не найдено.
attachment_url_to_postid( $url )
Параметры
- $urlстрокаобязательный
- URL медиафайла.
Примеры
1. Вывод ID медиафайла
Ну начнём с самого лёгкого примера, когда мы используем функцию и выводим результат.
$url = 'https://misha.agency/images/misha-rudrastyh-digital.jpg'; echo attachment_url_to_postid( $url );
2. Применение в рамках размеров изображений
Прикол в том, что если вы закинете в эту функцию не оригинал изображения, а его размер, то есть например не файл misha.jpg
, а файл misha-150x150.jpg
, то ничего работать не будет.
Есть ли выход?
Да, но он не такой красивый к сожалению, потому что нам придётся забыть про attachment_url_to_postid()
и создать свою собственную функцию для этой цели. Ну давайте этим займёмся.
Моя функция выглядит вот так и в ней вы заметите запрос к БД через $wpdb.
function true_attachment_url_to_postid( $url ) { global $wpdb; $upload_dir = wp_upload_dir(); $attachment_id = $wpdb->get_var( $wpdb->prepare( " SELECT p.ID FROM $wpdb->posts AS p LEFT JOIN $wpdb->postmeta AS m1 ON p.ID = m1.post_id LEFT JOIN $wpdb->postmeta AS m2 ON p.ID = m2.post_id WHERE p.post_type = 'attachment' AND m1.meta_key = '_wp_attachment_metadata' AND m1.meta_value LIKE %s AND m2.meta_key = '_wp_attached_file' AND m2.meta_value LIKE %s ", '%' . basename( $url ) . '%', ltrim( $upload_dir[ 'subdir' ], '/' ) . '%' ) ); return $attachment_id ? $attachment_id : 0; }
Суть этой функции в том, что в базе данных у каждого вложения существует поле в таблице wp_postmeta
с ключом _wp_attachment_metadata
и в нём перечислены все варианты названия этого файла для каждого зарегистрированного размера. Единственный момент, что если у вас вложения раскиданы на папки по месяцам и годам, то пожалуй лучше дополнительно проверить ключ _wp_attached_file
, чтобы случайно не вытащить другой файл (что я и делаю вторым LEFT JOIN
, но это можно скипнуть, если вложения не раскиданы по месяцам).
Понимаю, что возможно и моя функция не идеальна, но те варианты, которые я встречал в инете, это вообще жесть!
Хуки
attachment_url_to_postid
В самом конце функции применяется этот фильтр.
return (int) apply_filters( 'attachment_url_to_postid', $post_id, $url );