Как установить рекомендуемое изображение (миниатюру) по 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


РЕДАКТИРОВАТЬ: Добавлено создание пути

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

Роб Вермеер
источник
Спасибо за ваши усилия! Это работает только при использовании $ upload_dir ['basedir'] (а не пути), потому что, когда я проверяю вложение через интерфейс редактирования поста, на него ссылаются как ... / uploads / FILENAME.EXT, а $ upload_dir ['путь' ] будет хранить его как-то вроде ... / 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, и я не уверен, что это функция, которую я ищу в первую очередь. Спасибо за помощь!
Крис
Не могли бы вы переписать свой вопрос с этой информацией, чтобы лучше описать, что вы пытаетесь достичь? (Или оставьте это как есть, и начните новый вопрос, чтобы спросить, как получить идентификатор вложения при вставке сообщения?)
Чип Беннетт
Оригинальный вопрос был отредактирован и частично перефразирован, пожалуйста, проверьте еще раз :).
Крис
9

Я хотел бы улучшить ответ Робса, используя основные функции 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». тогда как ответ Роба Вермеера сработал.
Флим
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);
}
bueltge
источник
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 обрабатывает мультимедиа и загружает его, а затем устанавливает его в качестве эскиза.

Джесси Бейкер
источник