Как программно установить миниатюру?

Я пытаюсь получить и вставить изображения вне среды WordPress в пользовательский пост через PHP.

Как переместить / загрузить это изображение в формате папок дата/год, как это делает WordPress, и установить это изображение в качестве миниатюры записи?

Кроме того, как загрузить изображение в галерею?

Ниже мой код:

$filename = $image['name'];
$target_path = "../wp-content/uploads/";
$target_path = $target_path . $filename;
$wp_filetype = wp_check_filetype(basename($filename), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
    'guid' => $wp_upload_dir['baseurl'] . '/' . basename( $filename ),
    'post_mime_type' => $wp_filetype['type'],
    'post_title' => preg_replace('/\.[^.]+$/', '', basename($filename)),
    'post_content' => '',
    'post_status' => 'inherit',
);
$attach_id = wp_insert_attachment( $attachment, $target_path, $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
wp_update_attachment_metadata( $attach_id, $attach_data );
set_post_thumbnail( $post_id, $attach_id );

Мне удалось загрузить изображение в каталог загрузок, но я не могу создать папку года и даты. Это какая-то функция wp?

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 10
  1. hitautodestruct

    Попробуйте этот код:

    /* Import media from url
     *
     * @param string $file_url URL of the existing file from the original site
     * @param int $post_id The post ID of the post to which the imported media is to be     attached
     *
     * @return boolean True on success, false on failure
     */
    
    function fetch_media($file_url, $post_id) {
    require_once(ABSPATH . 'wp-load.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    global $wpdb;
    
    if(!$post_id) {
        return false;
    }
    
    //каталог для импорта    
    $artDir = 'wp-content/uploads/2013/06';
    
    //если директории не существует, создать ее
    if(!file_exists(ABSPATH.$artDir)) {
        mkdir(ABSPATH.$artDir);
    }
    
    //переименовать файл
    $ext = array_pop(explode("/", $file_url));
    $new_filename = 'blogmedia-'.$ext;
    
    if (@fclose(@fopen($file_url, "r"))) { //make sure the file actually exists
        copy($file_url, ABSPATH.$artDir.$new_filename);
    
    
        $siteurl = get_option('siteurl');
        $file_info = getimagesize(ABSPATH.$artDir.$new_filename);
    
        //создать массив данных вложения для вставки в таблицу wp_posts
        $artdata = array();
        $artdata = array(
            'post_author' => 1, 
            'post_date' => current_time('mysql'),
            'post_date_gmt' => current_time('mysql'),
            'post_title' => $new_filename, 
            'post_status' => 'inherit',
            'comment_status' => 'closed',
            'ping_status' => 'closed',
            'post_name' => sanitize_title_with_dashes(str_replace("_", "-", $new_filename)),                                            'post_modified' => current_time('mysql'),
            'post_modified_gmt' => current_time('mysql'),
            'post_parent' => $post_id,
            'post_type' => 'attachment',
            'guid' => $siteurl.'/'.$artDir.$new_filename,
            'post_mime_type' => $file_info['mime'],
            'post_excerpt' => '',
            'post_content' => ''
        );
    
        $uploads = wp_upload_dir();
                $save_path = $uploads['basedir'].'/2013/06/'.$new_filename;
    
        //вставить в БД
        $attach_id = wp_insert_attachment( $artdata, $save_path, $post_id );
    
        //сгенерировать метаданные и миниаютру
        if ($attach_data = wp_generate_attachment_metadata( $attach_id, $save_path)) {
            wp_update_attachment_metadata($attach_id, $attach_data);
        }
    
        $rows_affected = $wpdb->insert($wpdb->prefix.'postmeta', array('post_id' => $post_id, 'meta_key' => '_thumbnail_id', 'meta_value' => $attach_id));
    }
    else {
        return false;
    }
    
    return true;
    }
    
  2. Simon

    Возможно, я неправильно понимаю, но зачем вам это делать вне среды WordPress? WordPress делает гораздо больше, чем просто загружает файл и помещает его в определенный каталог, например, управляет тем, какие пользователи могут загружать файлы, добавляет записи в базу данных для выгрузки и настраивает связи между избранными изображениями, выполняет действия и фильтры для внешних плагинов в зависимости от загрузки файла — все при соблюдении настроек сайта (в отношении соглашений об именах, места загрузки медиа и т.д.)

    Если вы просто пытаетесь загрузить файлы без входа в раздел администрирования WordPress, например, для загрузки файлов с внешнего сайта, вам может понадобиться взглянуть на API-интерфейс XML-RPC и, в частности, метод uploadFile.

    Другой вариант — написать мини-API самостоятельно. Для этого нужно:

    Получить файл на сервере с помощью загрузки (или заставить сервер загрузить его с указанного URL-адреса).

    Используйте wp_upload_dir(), чтобы получить путь к каталогу загрузки, и sanitize_file_name(), чтобы создать путь и записать файл в нужное место.

    Используйте wp_insert_attachment() для хранения вложения в базе данных (wp_check_filetype() будет полезен для установки post_mime_type). При желании также установите post_parent и метаключ _thumbnail_id, если хотите.

    Предоставьте доступ к вашему API внешним пользователям или, при необходимости, войдите в систему. Если вы используете открытую форму, то, по крайней мере, используйте wp_create_nonce() и wp_verify_nonce(), чтобы сделать форму чуть более безопасной.

    1. Simon

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

    2. hitautodestruct

      У меня такая же проблема. Другая причина, по которой нужно загрузить изображение, — это когда у вас есть пакетное задание изображений, которое вы хотите прикрепить к разным публикациям, а не делать это вручную.

    3. Faisal Shehzad

      Я пишу веб-сервис для приложения. Приложение отправляет мне массив FILE, через который я хочу вставить данные поста и изображение. Я вставил детали поста в базу данных, но застрял в части изображения.

    4. Simon

      Обратитесь к документации по wp_insert_attachment(), она должна делать то, что вам нужно, я думаю. Я очень не рекомендую вручную изменять базу данных вне WordPress. Вместо этого просто посмотрите на источник WordPress и попытайтесь определить части, отвечающие за добавление данных постов, обработку загрузки файлов и вставку вложений.

  3. GhostToast

    Разве это не может быть просто сделано с помощью media_sideload_image()? Единственное, что если вы не в административной области, то должны включить некоторые библиотеки из WordPress:

    // при выполнении вне среды администратора
    require_once(ABSPATH . 'wp-admin/includes/media.php');
    require_once(ABSPATH . 'wp-admin/includes/file.php');
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    
    // пример картинки
    $image = 'http://example.com/logo.png';
    
    // возвращает изображение HTML, а не идентификатор
    $media = media_sideload_image($image, $post_id);
    
    if(!empty($media) && !is_wp_error($media)){
        $args = array(
            'post_type' => 'attachment',
            'posts_per_page' => -1,
            'post_status' => 'any',
            'post_parent' => $post_id
        );
    
        // ссылаемся на новое изображение, чтобы установить в качестве избранного
        $attachments = get_posts($args);
    
        if(isset($attachments) && is_array($attachments)){
            foreach($attachments as $attachment){
                $image = wp_get_attachment_image_src($attachment->ID, 'full');
                if(strpos($media, $image[0]) !== false){
                    set_post_thumbnail($post_id, $attachment->ID);
                    break;
                }
            }
        }
    }
    
    1. Don Wilson

      Для WordPress 4.8:
      $new_att_id = media_sideload_image($image, $post_id, "image description...", 'id'); if(!is_wp_error($new_att_id)) { set_post_thumbnail($post_id, $new_att_id); }

    2. er.irfankhan11

      Куда добавить этот код?

  4. Liz Eipe C

    Посмотрите следующий код:

    function setFeaturedImages() {
    
    $base = dirname(__FILE__);
    $imgfile= $base.DS.'images'.DS.'14'.DS.'Ascot_Anthracite-Grey-1.jpg';
    $filename = basename($imgfile);
    $upload_file = wp_upload_bits($filename, null, file_get_contents($imgfile));
    if (!$upload_file['error']) {
        $wp_filetype = wp_check_filetype($filename, null );
        $attachment = array(
            'post_mime_type' => $wp_filetype['type'],
            'post_parent' => 0,
            'post_title' => preg_replace('/.[^.]+$/', '', $filename),
            'post_content' => '',
            'post_status' => 'inherit'
        );
    $attachment_id = wp_insert_attachment( $attachment, $upload_file['file'], 209 );
    
    if (!is_wp_error($attachment_id)) {
        require_once(ABSPATH . "wp-admin" . '/includes/image.php');
        $attachment_data = wp_generate_attachment_metadata( $attachment_id, $upload_file['file'] );
        wp_update_attachment_metadata( $attachment_id,  $attachment_data );
    }
    
    set_post_thumbnail( 209, $attachment_id );
    
    }
    }
    
Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: