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 лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: