Не вставляются миниатюры изображения в пост wordpress?

Ссылка скопирована
1 ответ

Новости с вк приходят на сайт. Пост создается, но не могу установить изображение как миниатюру записи. Вот собственно часть кода, отвечающая непосредственно за выкладывание поста:

$post_text = $data->object->text;                  //выделяем заголовок при помощи strpos(первое вхождение строки)         $first_enter = strpos($post_text, PHP_EOL);          $post_title = substr($post_text, 0, $first_enter); //(обрезаем наш заголовок)         $post_text = substr($post_text, $first_enter); // (убираем заголовок из текста)         $post_text = trim($post_text);         //получаем изображение         $biggest = new stdClass;         $biggest->width = 0;         foreach ($data->object->attachments as $attachment) {             foreach ($attachment->photo->sizes as $sizes) {                 if ($biggest->width < $sizes->width) {                     $biggest = $sizes;                 }             }         }         $post_images = $biggest->url;          // Создаем массив данных новой записи         $post_data = array(             'post_title'    => $post_title,             'post_content'  => $post_text,             'post_status'   => 'draft',             'post_date' => date('Y-m-d H:i:s'),             'post_author'   => 1,             'post_type' => 'post',         );          // Вставляем запись в базу данных         $post_id = wp_insert_post($post_data);          // присваиваем рубрику к посту          wp_set_object_terms($post_id, 'News from vk', 7);          if (is_wp_error($post_id)) {             echo $post_id->get_error_message();         }          // Получаем расширение файла         $ext = pathinfo($post_images, PATHINFO_EXTENSION);         // Создаем временный файл         $temp_file = tmpfile();         // Получаем дескриптор файла         $temp_file_meta = stream_get_meta_data($temp_file);         $temp_filename = $temp_file_meta['uri'];         // Скачиваем картинку и сохраняем ее во временный файл         $ch = curl_init($post_images);         $fp = fopen($temp_filename, 'wb');         curl_setopt($ch, CURLOPT_FILE, $fp);         curl_setopt($ch, CURLOPT_HEADER, 0);         curl_exec($ch);         curl_close($ch);         fclose($fp);          // Создаем новое вложение в WordPress         $attachment_id = media_handle_sideload(array(             'name' => basename($post_images),             'type' => 'image/' . $ext,             'tmp_name' => $temp_filename,         ), $post_id);          // Проверяем успешность загрузки вложения         if (is_wp_error($attachment_id)) {             echo 'Ошибка загрузки файла: ' . $attachment_id->get_error_message();         } else {             // Добавляем вложение к посту             update_post_meta($post_id, '_thumbnail_id', $attachment_id);         }

$post_text = $data->object->text; //выделяем заголовок при помощи strpos(первое вхождение строки) $first_enter = strpos($post_text, PHP_EOL); $post_title = substr($post_text, 0, $first_enter); //(обрезаем наш заголовок) $post_text = substr($post_text, $first_enter); // (убираем заголовок из текста) $post_text = trim($post_text); //получаем изображение $biggest = new stdClass; $biggest->width = 0; foreach ($data->object->attachments as $attachment) { foreach ($attachment->photo->sizes as $sizes) { if ($biggest->width < $sizes->width) { $biggest = $sizes; } } } $post_images = $biggest->url; // Создаем массив данных новой записи $post_data = array( 'post_title' => $post_title, 'post_content' => $post_text, 'post_status' => 'draft', 'post_date' => date('Y-m-d H:i:s'), 'post_author' => 1, 'post_type' => 'post', ); // Вставляем запись в базу данных $post_id = wp_insert_post($post_data); // присваиваем рубрику к посту wp_set_object_terms($post_id, 'News from vk', 7); if (is_wp_error($post_id)) { echo $post_id->get_error_message(); } // Получаем расширение файла $ext = pathinfo($post_images, PATHINFO_EXTENSION); // Создаем временный файл $temp_file = tmpfile(); // Получаем дескриптор файла $temp_file_meta = stream_get_meta_data($temp_file); $temp_filename = $temp_file_meta['uri']; // Скачиваем картинку и сохраняем ее во временный файл $ch = curl_init($post_images); $fp = fopen($temp_filename, 'wb'); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); curl_close($ch); fclose($fp); // Создаем новое вложение в WordPress $attachment_id = media_handle_sideload(array( 'name' => basename($post_images), 'type' => 'image/' . $ext, 'tmp_name' => $temp_filename, ), $post_id); // Проверяем успешность загрузки вложения if (is_wp_error($attachment_id)) { echo 'Ошибка загрузки файла: ' . $attachment_id->get_error_message(); } else { // Добавляем вложение к посту update_post_meta($post_id, '_thumbnail_id', $attachment_id); }

чтобы понять что происходит в attachments, прикладываю скрин с json decode

Не вставляются миниатюры изображения в пост wordpress?

Ссылку то я точно получаю, так как, если вставляю просто в src изображения, то в пост приходит, т.е. просто вставляется в запись... но возможно здесь не нужно конкретно выбирать одно изображение?

Дополнительно:

Нарушение п.3.8 Регламента. Скриншоты фрагментов кода запрещены.

  • Не надо ставить как можно больше тэгов. Лучше оставить один, но конкретный, с которым проблема.
    См.п.3.1 Регламента. Также обратите внимание на п.3.4
  • Модератор, не совсем понимаю вашего замечания, код написан на php. относится к теме вордпреса. Эти теги соответсвенно и вставлены.
  • rvitalia, прочтите внимательно п.3.1, там всё подробно расписано с примерами.
  • Вначале заливаешь картинку в медиатеку, получаешь её ID и только потом создаёшь пост, передавая ID аттачмента.

    ЗЫ, тег php тут действительно не нужен и не сделает лучше. Это вопрос по ВП, а не по ЯП.

  • Refguser, в другом месте заливал фото, в таком же порядке и все ок было. проблема оказалась в отсутствии расширения.
  • Ответы:

    Вообщем решение нашел. Ссылка в конце не содержала расширения. Поэтому как только в конце ссылки добавил &.jpg, все заработало. Не могу сказать насколько это правильно, но вариант с разрешением загрузки любых файлов в вордпрес мне нравится явно меньше..

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Ольга Сеть Ответ

    Миниатюра записи в WordPress не ставится простым присваиванием URL. Сначала изображение нужно загрузить в медиабиблиотеку, получить ID вложения и только потом вызвать set_post_thumbnail().

    Типовой алгоритм такой:

    1. создать запись через wp_insert_post() и получить $post_id;
    2. взять самый большой URL изображения из VK;
    3. скачать файл через media_sideload_image() или media_handle_sideload();
    4. получить ID attachment;
    5. установить его миниатюрой записи.
    require_once ABSPATH . 'wp-admin/includes/media.php';
    require_once ABSPATH . 'wp-admin/includes/file.php';
    require_once ABSPATH . 'wp-admin/includes/image.php';
     
    $post_id = wp_insert_post([
        'post_title'   => $post_title,
        'post_content' => $post_text,
        'post_status'  => 'publish',
        'post_type'    => 'post',
    ]);
     
    if (!is_wp_error($post_id) && !empty($post_images)) {
        $attachment_id = media_sideload_image($post_images, $post_id, null, 'id');
     
        if (!is_wp_error($attachment_id)) {
            set_post_thumbnail($post_id, $attachment_id);
        } else {
            error_log('Image sideload error: ' . $attachment_id->get_error_message());
        }
    }

    require_once ABSPATH . 'wp-admin/includes/media.php'; require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/image.php'; $post_id = wp_insert_post([ 'post_title' => $post_title, 'post_content' => $post_text, 'post_status' => 'publish', 'post_type' => 'post', ]); if (!is_wp_error($post_id) && !empty($post_images)) { $attachment_id = media_sideload_image($post_images, $post_id, null, 'id'); if (!is_wp_error($attachment_id)) { set_post_thumbnail($post_id, $attachment_id); } else { error_log('Image sideload error: ' . $attachment_id->get_error_message()); } }

    Проверьте ещё два момента: у темы должна быть включена поддержка миниатюр add_theme_support('post-thumbnails'), а в данных VK перед обращением к $attachment->photo->sizes нужно проверять, что это действительно фото. Иначе на постах без изображения код будет падать или брать пустой URL.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

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

    Вам также может быть интересно