Поверните URL-адрес в файл Attachment / Post ID

Есть ли способ, которым я могу взять URL-адрес изображения и найти вложение или пост-идентификатор этого изображения в базе данных?

Вот ситуация:

Я нахожусь в цикле, просматривая все теги «img», которые окружены тегами «a» в моем сообщении. если атрибут src тега 'img' не соответствует атрибуту href внешнего тега 'a', тогда я хочу заменить тег 'img'. При этом, если «img», который должен быть удален, находится в галерее, я хочу удалить этот пост, а затем поставьте замену «img» на его место. Я попытался использовать такую ​​функцию:

function find_image_post_id($url) { global $wpdb; $postid = $wpdb->get_var($wpdb->prepare("SELECT DISTINCT ID FROM $wpdb->posts WHERE guid='$url'")); if ($postid) { return $postid; } return false; } 

Это, по-видимому, не так, потому что руководство по иронии судьбы не уникально глобально. Я (ранее в том же скрипте) загрузил файл с тем же именем (почему? Потому что это было более высокое разрешение, и я пытаюсь заменить версии с низким разрешением одного и того же изображения), и хотя WordPress сохранит изображение с другим именем в в директории, guid были установлены одинаковые. (возможно, ошибка).

Есть ли другой способ, который я могу использовать?

Массовая улучшенная функция, разработанная для плагинов, тяжелая на изображениях:

 if ( ! function_exists( 'get_attachment_id' ) ) { /** * Get the Attachment ID for a given image URL. * * @link http://wordpress.stackexchange.com/a/7094 * * @param string $url * * @return boolean|integer */ function get_attachment_id( $url ) { $dir = wp_upload_dir(); // baseurl never has a trailing slash if ( false === strpos( $url, $dir['baseurl'] . '/' ) ) { // URL points to a place outside of upload directory return false; } $file = basename( $url ); $query = array( 'post_type' => 'attachment', 'fields' => 'ids', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $file, 'compare' => 'LIKE', ), ) ); // query attachments $ids = get_posts( $query ); if ( ! empty( $ids ) ) { foreach ( $ids as $id ) { // first entry of returned array is the URL if ( $url === array_shift( wp_get_attachment_image_src( $id, 'full' ) ) ) return $id; } } $query['meta_query'][0]['key'] = '_wp_attachment_metadata'; // query attachments again $ids = get_posts( $query ); if ( empty( $ids) ) return false; foreach ( $ids as $id ) { $meta = wp_get_attachment_metadata( $id ); foreach ( $meta['sizes'] as $size => $values ) { if ( $values['file'] === $file && $url === array_shift( wp_get_attachment_image_src( $id, $size ) ) ) return $id; } } return false; } } 

Все эти сложные функции можно свести к одной простой функции:

attachment_url_to_postid ()

Вам нужно всего лишь проанализировать URL-адрес изображения для получения идентификатора вложения:

 $attachment_id = attachment_url_to_postid( $image_url ); echo $attachment_id; 

Это все, что вам нужно.

Я изменил код Rarst, чтобы вы могли сопоставлять только имя файла, а не полный путь. Это полезно, если вы собираетесь удалять изображение, если оно не существует. В настоящее время это работает только в том случае, если имена файлов уникальны, но я буду добавлять хеш-чек позже, чтобы помочь с изображениями, которые имеют одинаковое имя файла.

 function get_attachment_id( $url, $ignore_path = false ) { if ( ! $ignore_path ) { $dir = wp_upload_dir(); $dir = trailingslashit($dir['baseurl']); if( false === strpos( $url, $dir ) ) return false; } $file = basename($url); $query = array( 'post_type' => 'attachment', 'fields' => 'ids', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $file, 'compare' => 'LIKE', ) ) ); $ids = get_posts( $query ); foreach( $ids as $id ) { $match = array_shift( wp_get_attachment_image_src($id, 'full') ); if( $url == $match || ( $ignore_path && strstr( $match, $file ) ) ) return $id; } $query['meta_query'][0]['key'] = '_wp_attachment_metadata'; $ids = get_posts( $query ); foreach( $ids as $id ) { $meta = wp_get_attachment_metadata($id); foreach( $meta['sizes'] as $size => $values ) { if( $values['file'] == $file && ( $ignore_path || $url == array_shift( wp_get_attachment_image_src($id, $size) ) ) ) return $id; } } return false; } 

Хорошо, я нашел ответ, что никто в сети не искал дней. Сохраняйте мои данные, только если ваша тема или плагин использует WP_Customize_Image_Control() если вы используете WP_Customize_Media_Control() get_theme_mod() вернет идентификатор, а не URL-адрес.

Для моего решения я использовал новую версию WP_Customize_Image_Control()

Многие сообщения на форумах имеют get_attachment_id() которые больше не работают. Я использовал attachment_url_to_postid()

Вот как я смог это сделать. Надеюсь, это поможет кому-то

 // This is getting the image / url $feature1 = get_theme_mod('feature_image_1'); // This is getting the post id $feature1_id = attachment_url_to_postid($feature1); // This is getting the alt text from the image that is set in the media area $image1_alt = get_post_meta( $feature1_id, '_wp_attachment_image_alt', true ); 

наценка

 <a href="<?php echo $feature1_url; ?>"><img class="img-responsive center-block" src="<?php echo $feature1; ?>" alt="<?php echo $image1_alt; ?>"></a>