Чи можливо встановити пропоноване зображення із зовнішньою URL-адресою зображення


20

Я знаю, що є плагіни, які витягують зображення з віддаленої URL-адреси та зберігаються локально. Мені просто хочеться знати, чи можна не зберігати зображення в Медіатеці, але використовувати його як Featured Image ?


Ви можете зробити це за допомогою спеціального поля, де зберігаєте зовнішню URL-адресу зображення. Може бути важко змусити його працювати кожного разу, коли the_post_thumnail()він присутній (або подібну функцію) або змусити його працювати з різними розмірами зображення, визначеними темою чи плагіном.
cybmeta

1
За допомогою цього плагіна можна встановити URL-адресу зовнішнього зображення як обраного зображення: wordpress.org/plugins/wp-remote-thumbnail
Розширений SEO

Він зберігає зображення локально або віддалено телефонує?
Volatil3

@ Volatil3 Я не тестував, але читаючи опис плагіна, я б сказав, що він називає його віддалено.
Енді Макола-Брук

Відповіді:


35

Так, це можливо і досить легко.

Я пропоную такий робочий процес:

  1. Поставте десь інтерфейс користувача, щоб вставити URL-адресу обраного зображення. Мабуть, найкращим вибором є використання 'admin_post_thumbnail_html'гачка фільтра
  2. Використовуйте 'save_post'гачок дій, щоб зберегти URL-адресу (після процедури безпеки та перевірки) у спеціальній мета-публікації
  3. Використовуйте 'post_thumbnail_html'гачок фільтра, щоб вивести належну <img>розмітку, переосмисливши за замовчуванням, якщо у публікації, для якої потрібне зображення, є мета публікації із зовнішнім обраним зображенням

Для роботи цей робочий процес потребує відображення обраного зображення в шаблоні за допомогою get_the_post_thumnbail()або the_post_thumbnail()функцій.

Більше того, ми повинні бути впевнені, що '_thumbnail_id'мета-значення має не порожнє значення, коли ми встановлюємо мета для зовнішньої URL-адреси, інакше has_post_thumbnail()повернеться помилковим для публікацій, які мають лише зовнішнє зображене зображення.

Насправді, можливо, що публікація має як стандартне місцеве зображення, так і один набір через наш робочий процес, і в цьому випадку буде використано зовнішнє.

Для реалізації нашого робочого процесу нам потрібна функція перевірки URL-адреси, яка використовується як зовнішнє образне зображення, оскільки ми повинні бути впевнені, що це дійсна URL-адреса зображення.

Існують різні способи виконання цього завдання; тут я використовую дуже простий спосіб, який дивиться лише URL-адресу, не завантажуючи зображення. Це працює лише для статичних URL-адрес зображень і не підтверджує, що зображення існує насправді, але це швидко. Якщо вам потрібно, змініть його на щось більш досконале ( ось деяка допомога).

function url_is_image( $url ) {
    if ( ! filter_var( $url, FILTER_VALIDATE_URL ) ) {
        return FALSE;
    }
    $ext = array( 'jpeg', 'jpg', 'gif', 'png' );
    $info = (array) pathinfo( parse_url( $url, PHP_URL_PATH ) );
    return isset( $info['extension'] )
        && in_array( strtolower( $info['extension'] ), $ext, TRUE );
}

Досить легко. Тепер додамо 3 гачки, описані в робочому процесі вище:

add_filter( 'admin_post_thumbnail_html', 'thumbnail_url_field' );

add_action( 'save_post', 'thumbnail_url_field_save', 10, 2 );

add_filter( 'post_thumbnail_html', 'thumbnail_external_replace', 10, PHP_INT_MAX );

і пов'язані з ними функції. Спочатку той, що видає поле в адміністраторі:

function thumbnail_url_field( $html ) {
    global $post;
    $value = get_post_meta( $post->ID, '_thumbnail_ext_url', TRUE ) ? : "";
    $nonce = wp_create_nonce( 'thumbnail_ext_url_' . $post->ID . get_current_blog_id() );
    $html .= '<input type="hidden" name="thumbnail_ext_url_nonce" value="' 
        . esc_attr( $nonce ) . '">';
    $html .= '<div><p>' . __('Or', 'txtdomain') . '</p>';
    $html .= '<p>' . __( 'Enter the url for external image', 'txtdomain' ) . '</p>';
    $html .= '<p><input type="url" name="thumbnail_ext_url" value="' . $value . '"></p>';
    if ( ! empty($value) && url_is_image( $value ) ) {
        $html .= '<p><img style="max-width:150px;height:auto;" src="' 
            . esc_url($value) . '"></p>';
        $html .= '<p>' . __( 'Leave url blank to remove.', 'txtdomain' ) . '</p>';
    }
    $html .= '</div>';
    return $html;
}

Зауважте, що я використовувався 'txtdomain'як текстовий домен, але ви повинні використовувати належний зареєстрований текстовий домен.

Ось як виглядає вихід, коли порожній:

Зовнішня URL-адреса для обраного зображення: поле

Ось як це виглядає після додавання URL-адреси зображення та збереження / оновлення публікації:

Зовнішня URL-адреса для зображеного зображення: поле після заповнення та збереження

Отже, тепер наш інтерфейс адміністратора виконаний, давайте запишемо розпорядок збереження:

function thumbnail_url_field_save( $pid, $post ) {
    $cap = $post->post_type === 'page' ? 'edit_page' : 'edit_post';
    if (
        ! current_user_can( $cap, $pid )
        || ! post_type_supports( $post->post_type, 'thumbnail' )
        || defined( 'DOING_AUTOSAVE' )
    ) {
        return;
    }
    $action = 'thumbnail_ext_url_' . $pid . get_current_blog_id();
    $nonce = filter_input( INPUT_POST, 'thumbnail_ext_url_nonce', FILTER_SANITIZE_STRING );
    $url = filter_input( INPUT_POST,  'thumbnail_ext_url', FILTER_VALIDATE_URL );
    if (
        empty( $nonce )
        || ! wp_verify_nonce( $nonce, $action )
        || ( ! empty( $url ) && ! url_is_image( $url ) )
    ) {
        return;
    }
    if ( ! empty( $url ) ) {
        update_post_meta( $pid, '_thumbnail_ext_url', esc_url($url) );
        if ( ! get_post_meta( $pid, '_thumbnail_id', TRUE ) ) {
            update_post_meta( $pid, '_thumbnail_id', 'by_url' );
        }
    } elseif ( get_post_meta( $pid, '_thumbnail_ext_url', TRUE ) ) {
        delete_post_meta( $pid, '_thumbnail_ext_url' );
        if ( get_post_meta( $pid, '_thumbnail_id', TRUE ) === 'by_url' ) {
            delete_post_meta( $pid, '_thumbnail_id' );
        }
    }
}

Після деяких перевірок безпеки функція переглядає опубліковану URL-адресу і, якщо вона нормальна, зберігає її у '_thumbnail_ext_url'розміщеному метаметі. Якщо URL-адреса порожня, а мета збережена, вона видаляється, що дозволяє видалити мета просто спорожненням зовнішнього поля URL-адреси.

Останнє, що потрібно зробити, - вивести розмічену зображення, коли наша зовнішня URL-адреса зображення встановлена ​​в мета:

function thumbnail_external_replace( $html, $post_id ) {
    $url =  get_post_meta( $post_id, '_thumbnail_ext_url', TRUE );
    if ( empty( $url ) || ! url_is_image( $url ) ) {
        return $html;
    }
    $alt = get_post_field( 'post_title', $post_id ) . ' ' .  __( 'thumbnail', 'txtdomain' );
    $attr = array( 'alt' => $alt );
    $attr = apply_filters( 'wp_get_attachment_image_attributes', $attr, NULL );
    $attr = array_map( 'esc_attr', $attr );
    $html = sprintf( '<img src="%s"', esc_url($url) );
    foreach ( $attr as $name => $value ) {
        $html .= " $name=" . '"' . $value . '"';
    }
    $html .= ' />';
    return $html;
}

Ми зробили.

Що залишається робити

У вибраному зображенні я не використовував widthні heightвластивості, ні класи, які WordPress зазвичай додає, як 'attachment-$size'. Це тому, що нюхати розмір зображення вимагає додаткової роботи, що сповільнить завантаження сторінки, особливо якщо у вас є більше одного представленого зображення.

Якщо вам потрібні ці атрибути, ви можете використовувати мій код, додавши зворотний виклик для wp_get_attachment_image_attributes'фільтрування (це стандартний гачок WordPress ), або, можливо, ви можете змінити мій код, щоб обнюхати розмір зображення та вивести пов’язані з ним атрибути та класи.

Плагін Gist

Весь код, розміщений тут, за винятком додавання належної ініціалізації текстового домену, доступний як повноцінний плагін у Gist тут . Код там використовує простір імен, тому він вимагає PHP 5.3+.

Примітки

Звичайно, ви повинні бути впевнені, що у вас є ліцензія та дозвіл на використання зображень на гарячому посиланні та їх гарячі посилання від зовнішніх.


куди я повинен поставити цей код
Ankit Agrawal

чи можете ви поясніть, який код, на якій сторінці ми маємо написати. Я новачок в PHP / Wordpress, тому поясніть, будь ласка, крок за кроком. Спасибі
Ankit Agrawal

@AnkitAgrawal дивіться тут
gmazzap
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.