Добавить изображение записи программно к пользовательскому типу записи

Вопрос или проблема

Я пытаюсь автоматически добавить миниатюру видео из Vimeo или YouTube в качестве изображения записи, когда новый пользовательский тип записи видео добавлен или обновлён. ID видео является расширенным пользовательским полем. Вот мой неработающий код:

/**
 * Получает URL миниатюры Vimeo
 * @param mixed $id ID Vimeo (например, 1185346)
 * @return URL миниатюры
*/
function getVimeoThumb($id) {
    $data = file_get_contents("http://vimeo.com/api/v2/video/".$id.".json");
    $data = json_decode($data);
    return $data[0]->thumbnail_large;
}

/**
 * Получает URL миниатюры YouTube
 * @param mixed $id ID YouTube
 * @return URL миниатюры
*/
function getYoutubeThumb($id) {
    $data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?key=AIzaSy...&part=snippet&id=".$id);
    $data = json_decode($data);
    return $json->items[0]->snippet->thumbnails->medium->url;
}

// Добавление миниатюры для видео
function addVideoThumb($post_ID) {

    if(!has_post_thumbnail($post_ID)):

        if(get_field("source", $post_ID) == "youtube"):
            $videoID = get_field("youtube_video_id", $post_ID);
            $imageURL = getYoutubeThumb($videoID);          
        else:
            $videoID = get_field("vimeo_video_id", $post_ID);
            $imageURL = getVimeoThumb($videoID);
        endif;

        //echo $imageURL;

        // загрузка изображения по URL
        $tmp = download_url($imageURL);

        $file = array(
            'name' => basename($imageURL),
            'tmp_name' => $tmp
        );

        // создание вложения из загруженного изображения
        $attachment_id = media_handle_sideload($file, $post_ID);

        // установка миниатюры
        update_post_meta($post_ID, '_thumbnail_id', $attachment_id);

    endif;
}
add_action('save_post_interel-tv-videos', 'addVideoThumb', 10, 3);

Похоже, что функция вообще не вызывается, так как я пытался добавить к ней JavaScript-уведомление, и ничего не появляется. Есть ли помощь? Заранее спасибо!

Наконец-то разобрался. Поскольку я использую Advanced Custom Fields, мне нужно использовать хук acf/save_post с приоритетом больше 10, чтобы функции get_field() были доступны.

Недостаток в том, что этот хук выполняется для каждого типа записи. В отличие от нативного хука WP save_post, с ACF вы не можете привязать его к конкретному пользовательскому типу записи.

Поэтому я также добавил условие, чтобы проверить, является ли запись типа “interel-tv-videos”, например if(!has_post_thumbnail($post_ID) and get_post_type($post_ID) == "interel-tv-videos"):

Ответ или решение

Чтобы автоматически добавлять миниатюры видео из Vimeo или YouTube в качестве изображений для дополнительного пользовательского типа поста «video» в WordPress, необходимо учитывать особенности работы с плагином Advanced Custom Fields (ACF) и использование соответствующих хуков оставления постов. Ниже представлена расширенная версия вашего кода, а также рекомендации по улучшению его функциональности.

Шаги по реализации

  1. Получение миниатюры видео:
    Необходимо создать two функции для получения миниатюр из YouTube и Vimeo. Убедитесь, что функции корректны и возвращают URL миниатюры.

  2. Хук и обработка данных:
    Используйте хук acf/save_post, чтобы работать с сохранением поста. Поскольку этот хук срабатывает для всех типов постов, вам нужно добавить условие, чтобы обрабатывать только ваш пользовательский тип поста.

  3. Загрузка миниатюры:
    Если миниатюра еще не установлена, используйте download_url() для загрузки изображения и media_handle_sideload() для создания вложения в медиа-библиотеке.

Обновленный код

/**
 * Получение URL миниатюры из Vimeo
 */
function getVimeoThumb($id) {
    $data = file_get_contents("https://vimeo.com/api/v2/video/".$id.".json");
    $data = json_decode($data);
    return $data[0]->thumbnail_large;
}

/**
 * Получение URL миниатюры из YouTube
 */
function getYoutubeThumb($id) {
    $apiKey = 'ВАШ_API_КЛЮЧ'; // Убедитесь, что ваш API ключ здесь
    $data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?key={$apiKey}&part=snippet&id={$id}");
    $json = json_decode($data);
    return $json->items[0]->snippet->thumbnails->medium->url;
}

/**
 * Добавление миниатюры для видео
 */
function addVideoThumb($post_ID) {
    // Проверка, что это не автосохранение
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    // Проверка, что публикация правильного типа
    if (get_post_type($post_ID) !== 'interel-tv-videos') return;

    // Проверка, имеет ли пост уже миниатюру
    if (!has_post_thumbnail($post_ID)) {
        $videoSource = get_field("source", $post_ID);

        if ($videoSource === "youtube") {
            $videoID = get_field("youtube_video_id", $post_ID);
            $imageURL = getYoutubeThumb($videoID);
        } else {
            $videoID = get_field("vimeo_video_id", $post_ID);
            $imageURL = getVimeoThumb($videoID);
        }

        // Загрузка изображения
        $tmp = download_url($imageURL);

        // Обработка ошибки при загрузке
        if (is_wp_error($tmp)) {
            error_log('Ошибка загрузки миниатюры: ' . $tmp->get_error_message());
            return;
        }

        $file = array(
            'name' => basename($imageURL),
            'tmp_name' => $tmp
        );

        // Создание вложения из загруженного изображения
        $attachment_id = media_handle_sideload($file, $post_ID);

        // Установка миниатюры
        if (!is_wp_error($attachment_id)) {
            update_post_meta($post_ID, '_thumbnail_id', $attachment_id);
        } else {
            error_log('Ошибка установки миниатюры: ' . $attachment_id->get_error_message());
        }
    }
}

add_action('acf/save_post', 'addVideoThumb', 20);

Описание кода

  1. Функции получения миниатюр:

    • Функции getVimeoThumb и getYoutubeThumb загружают данные через API соответствующих платформ и возвращают URL миниатюры.
  2. Добавление миниатюры:

    • В функции addVideoThumb выполняется проверка, что это не автосохранение, и проверка типа поста.
    • Используется download_url() для скачивания изображения и media_handle_sideload() для его загрузки в WordPress.
  3. Безопасность и обработка ошибок:

    • Добавлены проверки на наличие ошибок при загрузке и установке миниатюры, чтобы избежать проблем в случае неудачи.

Заключение

Теперь вы можете автоматически добавлять миниатюры видео к вашему пользовательскому типу поста при его сохранении. Убедитесь, что у вас правильно настроены ключи API и что вы обрабатываете возможные ошибки, чтобы избежать неожиданных проблем.

Оцените материал
Добавить комментарий

Капча загружается...