attachment_url_to_postid()

Функция позволяет получить 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 );

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал