Получаем ID изображения по его URL

Допустим у нас есть URL какой-то картинки, загруженной в ВП и мы хотим найти ее ID. Родных функций в ВП для этого пока нет, поэтому можно использовать такой код:

Скопировано
function get_attachment_id( $url ) {
	$attachment_id = 0;
	$upload_dir = wp_upload_dir();
	$base_url = $upload_dir['baseurl'] . '/';
	// проверим, что URL содержит символы //, а так же ту часть адреса, которая идет в $base_url после них,
	// так как URL картинки может не содержать протокол
	if( strpos( $url, '//' ) !== false && strpos( $url, explode( '//', $base_url )[1] ) !== false ) {
		$file = basename( $url );
		$query_args = [
			'post_type'   => 'attachment',
			'post_status' => 'inherit',
			'fields'      => 'ids',
			'posts_per_page' => -1,
			'meta_query'  => [
				[
					'value'   => $file,
					'compare' => 'LIKE',
					'key'     => '_wp_attachment_metadata',
				]
			]
		];
		$query = new WP_Query( $query_args );
		if( $query->have_posts() ) {
			foreach( $query->posts as $post_id ) {
				$meta = wp_get_attachment_metadata( $post_id );
				$original_file = basename( $meta['file'] );
				$cropped_image_files = wp_list_pluck( $meta['sizes'], 'file' );
				if( $original_file === $file || in_array( $file, $cropped_image_files ) ) {
					$attachment_id = $post_id;
					break;
				}
			}
		}
	}
	return $attachment_id;
}
Показать код

Пример:

$url = 'https://site.ru/wp-content/uploads/2017/12/image.jpg';
$attachment_id = get_attachment_id( $url );

В качестве URL можно  указать не только ссылку на полное изображение, но и ссылку на обрезанное изображение автоматически создаваемое ВП. Например, https://site.ru/wp-content/uploads/2017/12/image-150x150.jpg. Так же URL картинки может быть указан без протокола и начинаться с символов //.