WP_GET_ATTACHMENT_URL() – получение URL вложения в WordPress: параметры, примеры, эффективность

# WP_GET_ATTACHMENT_URL()

Функция WP_GET_ATTACHMENT_URL() позволяет получить URL для вложения в WordPress. 

### Используется в

- get_post_meta()
- wp_get_upload_dir()

### Эффективность

- 1 вызов — 0.0009661 сек (медленно)
- 50,000 вызовов — 0.28 сек (очень быстро)

### Хуки функции

wp_get_attachment_url

### Возвращаемое значение

Возвращает строку с URL вложения или false, если что-то пошло не так.

## Использование

```php
wp_get_attachment_url( $attachment_id );

Параметры

  • $attachment_id (int) — ID поста вложения. По умолчанию: глобальная переменная $post.

Примеры

Пример 1: Отображение изображения, прикрепленного к посту

Предположим, мы хотим отобразить изображение, прикрепленное к посту с ID 5. Сначала найдем ID вложения, а затем отобразим изображение:

// Получаем ID вложения поста 5
$id = 5;
$attachment_image = get_children( array(
    'numberposts' => 1,
    'post_mime_type' => 'image',
    'post_parent' => $id,
    'post_type' => 'attachment'
) );

// Берем первое изображение из массива
$attachment_image = array_shift( $attachment_image );

$img = '';
echo $img;

// Вернет:
// 

Пример 2: Получение ссылки на вложение

Добавили изображение в медиатеку, и его ID 55. Получаем ссылку на изображение следующим образом:

$image_url = wp_get_attachment_url( 55 );
echo $image_url;

// Вернет: http://example.com/wp-content/uploads/image.png

Пример 3: Миниатюра поста в качестве фона

Если у нас есть посты, то мы можем использовать миниатюру поста как фоновое изображение:

if( have_posts() ) {
    while( have_posts() ) {
        the_post();

        if( has_post_thumbnail() ) {
            $feat_image_url = wp_get_attachment_url( get_post_thumbnail_id() );
            echo '
'; } } }

Заметки

  • Глобальная переменная: $pagenow — имя файла текущего экрана.

Изменения

Функция была введена в версии 2.1.0.

Код функции wp_get_attachment_url

function wp_get_attachment_url( $attachment_id = 0 ) {
    global $pagenow;

    $attachment_id = (int) $attachment_id;

    $post = get_post( $attachment_id );

    if ( ! $post ) {
        return false;
    }

    if ( 'attachment' !== $post->post_type ) {
        return false;
    }

    $url = '';
    // Получаем файл вложения.
    $file = get_post_meta( $post->ID, '_wp_attached_file', true );
    if ( $file ) {
        // Получаем директорию загрузок.
        $uploads = wp_get_upload_dir();
        if ( $uploads && false === $uploads['error'] ) {
            // Проверяем, существует ли базовая директория загрузки в пути к файлу.
            if ( str_starts_with( $file, $uploads['basedir'] ) ) {
                // Заменяем путь к файлу на URL.
                $url = str_replace( $uploads['basedir'], $uploads['baseurl'], $file );
            } elseif ( str_contains( $file, 'wp-content/uploads' ) ) {
                // Получаем имя директории относительно базовой директории (для совместимости с версиями до 2.7).
                $url = trailingslashit( $uploads['baseurl'] . '/' . _wp_get_attachment_relative_path( $file ) ) . wp_basename( $file );
            } else {
                // Это новый файл, поэтому $file относительно базовой директории.
                $url = $uploads['baseurl'] . "/$file";
            }
        }
    }

    // Если предыдущие попытки не удались, используем GUID как в версиях до 2.7.
    if ( ! $url ) {
        $url = get_the_guid( $post->ID );
    }

    // Если используется SSL, URL должны быть HTTPS.
    if ( is_ssl() && ! is_admin() && 'wp-login.php' !== $pagenow ) {
        $url = set_url_scheme( $url );
    }

    /**
     * Фильтрует URL вложения.
     *
     * @param string $url           URL для данного вложения.
     * @param int    $attachment_id ID поста вложения.
     */
    $url = apply_filters( 'wp_get_attachment_url', $url, $post->ID );

    if ( ! $url ) {
        return false;
    }

    return $url;
}

Данная функция позволяет удобно получать URL вложений и эффективно использовать их в вашем WordPress-сайте.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *