Получить идентификатор вложения по пути к файлу в WordPress

Я знаю путь к файлу, и мне нравится получать идентификатор вложения.

Есть функция wp_get_attachment_url() которая требует идентификатор для получения URL, но мне нужно, чтобы он был обратным (хотя путь не URL)

Ответ 1

Я использовал этот классный отрезанный pippinsplugins.com

Добавьте эту функцию в файл functions.php

// retrieves the attachment ID from the file URL
function pippin_get_image_id($image_url) {
    global $wpdb;
    $attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_url )); 
        return $attachment[0]; 
}

Затем используйте этот код на своей странице или шаблоне для хранения/печати/использования идентификатора:

// set the image url
$image_url = 'http://yoursite.com/wp-content/uploads/2011/02/14/image_name.jpg';

// store the image ID in a var
$image_id = pippin_get_image_id($image_url);

// print the id
echo $image_id;

Оригинальный пост здесь: https://pippinsplugins.com/retrieve-attachment-id-from-image-url/

Надежда ti помогает;) Francesco

Ответ 2

ОБНОВЛЕНИЕ: начиная с wp 4.0.0 появилась новая функция, которая может выполнять эту работу. Я еще не проверял, но это так:

https://developer.wordpress.org/reference/functions/attachment_url_to_postid/


СТАРЫЙ ОТВЕТ: пока что лучшее решение, которое я там нашел, это следующее:

https://frankiejarrett.com/2013/05/get-an-attachment-id-by-url-in-wordpress/

Я думаю, что это лучшее по 2 причинам:

  • Это делает некоторые проверки целостности
  • [важно!] это не зависит от домена. Это делает для безопасного перемещения сайта. Для меня это ключевая особенность.

Ответ 3

Попробуйте функцию attachment_url_to_postid.

$rm_image_id = attachment_url_to_postid( 'http://example.com/wp-content/uploads/2016/05/castle-old.jpg' );
echo $rm_image_id;

Подробнее

Ответ 4

Обрезанные URL

Ни один из предыдущих ответов не поддерживал поиск идентификаторов в URL-адресах вложений, содержащих обрезку.

Например: /uploads/2018/02/my-image-300x250.jpg vs /uploads/2018/02/my-image.jpg

Решение

Мика из WP Scholar написал сообщение в блоге и загрузил код в этот список. Он обрабатывает как оригинальный, так и обрезанный поиск URL.

Я включил этот код в качестве ссылки, но, если вы нашли полезными, я призываю вас, чтобы оставить комментарий на своем посту или звезда сути.

/**
 * Get an attachment ID given a URL.
 * 
 * @param string $url
 *
 * @return int Attachment ID on success, 0 on failure
 */
function get_attachment_id( $url ) {

    $attachment_id = 0;

    $dir = wp_upload_dir();

    if ( false !== strpos( $url, $dir['baseurl'] . '/' ) ) { // Is URL in uploads directory?

        $file = basename( $url );

        $query_args = array(
            'post_type'   => 'attachment',
            'post_status' => 'inherit',
            'fields'      => 'ids',
            'meta_query'  => array(
                array(
                    '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;
}

Другим WP_Query этого решения является то, что мы используем класс WP_Query вместо того, чтобы делать прямой SQL-запрос к БД.

Ответ 5

Ни один из других ответов здесь, кажется, не работает должным образом или надежно для пути к файлу. Ответ, использующий функцию Пиппина, также ошибочен и на самом деле не делает вещи "путем WordPress".

Эта функция будет поддерживать либо путь, либо URL-адрес, и использует встроенную функцию WordPress attachment_url_to_postid для правильной окончательной обработки:

/**
 * Find the post ID for a file PATH or URL
 *
 * @param string $path
 *
 * @return int
 */
function find_post_id_from_path( $path ) {
    // detect if is a media resize, and strip resize portion of file name
    if ( preg_match( '/(-\d{1,4}x\d{1,4})\.(jpg|jpeg|png|gif)$/i', $path, $matches ) ) {
        $path = str_ireplace( $matches[1], '', $path );
    }

    // process and include the year / month folders so WP function below finds properly
    if ( preg_match( '/uploads\/(\d{1,4}\/)?(\d{1,2}\/)?(.+)$/i', $path, $matches ) ) {
        unset( $matches[0] );
        $path = implode( '', $matches );
    }

    // at this point, $path contains the year/month/file name (without resize info)

    // call WP native function to find post ID properly
    return attachment_url_to_postid( $path );
}

Ответ 6

Основываясь на ответе от @FrancescoCarlucci, я мог бы сделать некоторые улучшения.

Иногда, например, когда вы редактируете изображение в WordPress, он создает копию из оригинала и добавляет путь загрузки копий как метатет сообщения (ключ _wp_attached_file), который не соблюдается в ответ.

Здесь уточненный запрос, включающий эти изменения:

function jfw_get_image_id($file_url) {
    $file_path = ltrim(str_replace(wp_upload_dir()['baseurl'], '', $file_url), '/');

    global $wpdb;
    $statement = $wpdb->prepare("SELECT `ID` FROM `wp_posts` AS posts JOIN `wp_postmeta` AS meta on meta.`post_id`=posts.`ID` WHERE posts.`guid`='%s' OR (meta.`meta_key`='_wp_attached_file' AND meta.`meta_value` LIKE '%%%s');",
        $file_url,
        $file_path);

    $attachment = $wpdb->get_col($statement);

    if (count($attachment) < 1) {
        return false;
    }

    return $attachment[0]; 
}