Як встановити образне зображення (мініатюру) за URL-адресою зображення під час використання wp_insert_post ()?


61

Переглядаючи вказівку посилання функції для wp_insert_post () , я помітив, що в масиві, який він вимагає, немає жодного параметра, який дозволить мені встановити "Featured Image" для публікації, що відображається як мініатюра повідомлення у моїй темі.

Я розглядав такі функції, як set_post_thumbnail () , як запропонував містер Беннетт, але це, здається, є відносно новим доповненням до самого WordPress та WordPress кодексу. Таким чином, я не можу знайти жодних джерел, які пояснюють, як слід придбати та надавати параметр $ thumbnail_id. Якщо це дійсно функція, яку слід використовувати, то яким чином я можу надати їй дійсний параметр $ thumbnail_id, коли все, що у мене є, це URL-адреса зображення?

Спасибі заздалегідь!

Відповіді:


107

Ви можете встановити зображення як піктограму повідомлення, коли воно знаходиться у вашій медіатеці. Щоб додати зображення у свою медіатеку, потрібно завантажити його на ваш сервер. WordPress вже має функцію розміщення зображень у вашій медіатеці, вам потрібен лише сценарій, який завантажує ваш файл.

Використання:

Generate_Featured_Image( '../wp-content/my_image.jpg', $post_id );

// $post_id is Numeric ID... You can also get the ID with:
wp_insert_post()

Функція:

function Generate_Featured_Image( $image_url, $post_id  ){
    $upload_dir = wp_upload_dir();
    $image_data = file_get_contents($image_url);
    $filename = basename($image_url);
    if(wp_mkdir_p($upload_dir['path']))
      $file = $upload_dir['path'] . '/' . $filename;
    else
      $file = $upload_dir['basedir'] . '/' . $filename;
    file_put_contents($file, $image_data);

    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    $res1= wp_update_attachment_metadata( $attach_id, $attach_data );
    $res2= set_post_thumbnail( $post_id, $attach_id );
}

http://codex.wordpress.org/Function_Reference/wp_upload_dir

http://codex.wordpress.org/Function_Reference/wp_insert_attachment


EDIT: Додано створення контуру

http://codex.wordpress.org/Function_Reference/wp_mkdir_p


Дякую за ваші зусилля! Це працює лише при використанні $ upload_dir ['basedir'] (а не через шлях), тому що коли я перевіряю вкладення через інтерфейс редагування публікацій, він посилається як ... / uploads / FILENAME.EXT, а $ upload_dir ['path' ] зберігає його у щось на зразок ... / uploads / 2012/02 / FILENAME.EXT. Можливо, ще краще якось змінити посилання на файл, але я не знаю як.
Кріс

1
Додано створення контуру в моїй відповіді.
Роб Вермер

Вдячний за швидку відповідь :). Я все одно отримую той самий результат, але ось скріншот із моєю проблемою: i.imgur.com/iKTNs.png . Верхній розділ є результатом розміщення відлуння у вашому умовному, просто щоб побачити, що відбувається.
Кріс

Змінили його знову, не пройшли повний шлях до wp_insert_attachment та wp_generate_attachment_metadata. Сподіваюся, це вирішить проблему.
Роб Вермер

1
Попередження: Ця відповідь переписує файл, якщо він має те саме ім’я, будьте обережні. Він повинен генерувати імена, використовуючи $ post_id або хоча б uniqid ()
Іван Кастелланос,

10

Спробуйте використовувати set_post_thumbnail().

Редагувати Отто: Ви уточнили своє запитання, тож я поясню відповідь, яку дав Чіп.

В основному, ви також повинні зробити "вкладення" для посади. Коли зображення завантажується в медіатеку WordPress, для нього робиться спеціальний запис із вкладеним типом публікації. Це вкладення пов'язане з певною публікацією через ідентифікатор post_parent.

Тож якщо ви знаєте ідентифікатор вкладеного файлу, то виклик set_post_thumbnail з об’єктом публікації або ідентифікатором та ідентифікатором вкладення просто встановить прапор мініатюри повідомлення.

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

Просто завантаження та додавання файлу до публікації нічого не робить автоматично. Це просто своєрідний механізм категоризації. Наприклад, механізм галереї використовує додані зображення допису для створення [галереї] для цієї публікації. Ескіз допису - це лише одне із доданих зображень, яке було встановлено як ескіз.

Більш детальну інформацію про використання wp_insert_attachment можна знайти в кодексі (пов'язаному вище).


Дякую за відповідь! Як я можу отримати ідентифікатор мініатюри? Я починаю з URL-адреси зображення, тож я думаю, я повинен якось додати зображення до бібліотеки Wordpress за допомогою іншої функції?
Кріс

Оскільки ви вже вставляєте публікацію, я припускав, що ви вже додаєте зображення до публікації, яку ви вставляєте. Хіба це не справедливе припущення?
Чіп Беннетт

Вибачте, але я ще не дізнався, як насправді долучити зображення до публікації за URL-адресою. Крім того, я не хотів би, щоб зображення насправді відображалося в самому дописі. Зараз я шукаю функцію, яка поверне $ thumbnail_id, і подумала, що, можливо, wp_insert_attachment () спрацює, поки я не помітив, що вкладення вже вимагає в каталозі завантаження. Я не знаю, як отримати файл зображення за його URL-адресою, і я не впевнений, що це функція, яку я шукаю в першу чергу. Дякую за твою допомогу!
Кріс

Чи можете ви, будь ласка, переписати своє запитання цією інформацією, щоб краще описати те, що ви намагаєтеся досягти? (Або залиште цю як такою, і почніть нове запитання, щоб запитати, як отримати ідентифікатор вкладеного файлу при вставці допису?)
Chip Bennett

Оригінальне запитання було відредаговано та частково перефразоване, перевірте ще раз :).
Кріс

9

Я хотів би покращити відповідь Robs, використовуючи основні функції WP download_urlтаmedia_handle_sideload

<?php
/**
* Downloads an image from the specified URL and attaches it to a post as a post thumbnail.
*
* @param string $file    The URL of the image to download.
* @param int    $post_id The post ID the post thumbnail is to be associated with.
* @param string $desc    Optional. Description of the image.
* @return string|WP_Error Attachment ID, WP_Error object otherwise.
*/
function Generate_Featured_Image( $file, $post_id, $desc ){
    // Set variables for storage, fix file filename for query strings.
    preg_match( '/[^\?]+\.(jpe?g|jpe|gif|png)\b/i', $file, $matches );
    if ( ! $matches ) {
         return new WP_Error( 'image_sideload_failed', __( 'Invalid image URL' ) );
    }

    $file_array = array();
    $file_array['name'] = basename( $matches[0] );

    // Download file to temp location.
    $file_array['tmp_name'] = download_url( $file );

    // If error storing temporarily, return the error.
    if ( is_wp_error( $file_array['tmp_name'] ) ) {
        return $file_array['tmp_name'];
    }

    // Do the validation and storage stuff.
    $id = media_handle_sideload( $file_array, $post_id, $desc );

    // If error storing permanently, unlink.
    if ( is_wp_error( $id ) ) {
        @unlink( $file_array['tmp_name'] );
        return $id;
    }
    return set_post_thumbnail( $post_id, $id );

}

1
Використання нативної функції WordPress - найкраща практика. Дякую.
Мостафа Суфі

Чомусь ця версія дала мені помилки, кажучи: "Дійсна URL-адреса не надана". , тоді як відповідь Роб Вермер працювала.
Flimm

3

set_post_thumbnail() є найкращою функцією для цієї вимоги.

Я думаю, ви знайдете ідентифікатор вкладеного файлу через get_children()або get_posts(). В результаті є масив, а всередині цього масиву - ідентифікатор. Наступний приклад для тестування; сподіваюся, що це працює; пишіть без тестів, тільки на нулі.

Для вашої вимоги важливо, щоб ви змінилися get_the_ID()зі своїми post-ID; поверніть ідентифікатор додатку, і це ви можете використовувати foth set_post_thumbnail().

$attachments = get_children( 
    array(
        'post_parent' => get_the_ID(), 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image'
    )
);
foreach ( $attachments as $attachment_id => $attachment ) {
    echo wp_get_attachment_image($attachment_id);
}

3

Щойно я це виявив і зробив це набагато простіше, працює, але я не захисник безпеки

if(!empty($_FILES)){
    require_once( ABSPATH . 'wp-admin/includes/post.php' );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $post_ID = "your post id!";

    $attachment_id = media_handle_upload( 'file', $post_ID );
    set_post_thumbnail( $post_ID, $attachment_id );
}

простий чи що? після отримання потрібних файлів Wordpress обробляє медіа та завантажує їх, а потім встановлює його як мініатюру.

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