Заполнение полей изображений ACF из JSON-файла

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

Мне интересно, могут ли профессионалы ACF помочь мне с этим. Я рассматриваю возможность автоматического заполнения пользовательских постов, которые имеют поля ACF, из внешнего JSON-файла, созданного приложением. Это будет обновляться каждые 30 минут с помощью Cron Job. Что меня беспокоит, так это то, что каждый пост будет содержать от 3 до 15 изображений, как лучше всего поступить в этом случае? Возможно ли добавить изображения в поле галереи ACF из URL изображений в JSON-файле? Или мне нужно настроить повторитель с полями oEmbed для URL изображений? Или есть другой вариант?

Да, возможно заполнять поле галереи ACF данными JSON.

Предположим, что это ваш JSON для галереи из вашего приложения…

{
    "gallery" : [
        "https://i.imgur.com/VHkyr8P.jpeg",
        "https://i.imgur.com/obdqDwa.jpeg",
        "https://i.imgur.com/eQuSNVx.jpeg",
        "https://i.imgur.com/1lVyIJt.jpeg",
        "https://i.imgur.com/5uIOviX.jpeg"
    ]
}

Теперь в вашем cron job вы можете запустить функцию, как показано ниже, чтобы обработать обновления изображений в поле галереи ACF.

Моя примерная функция ниже получает любые существующие изображения галереи ACF, сохраняет их и объединяет новые изображения с полем галереи…

/**
 * @param $post_id int
 * @param $acf_gallery_field_name string
 * @param $json_url string
 */
function add_json_imgs_to_acf_gallery($post_id, $acf_gallery_field_name, $json_url) {

    // получить данные JSON по URL
    $json = file_get_contents($json_url);

    // декодировать JSON в массив
    $array = json_decode($json,true);

    // если декодированный JSON является массивом и имеет ключ массива галереи (в соответствии с приведенным выше примером JSON)
    if (is_array($array) && array_key_exists('gallery', $array)) {

        // давайте начнем массив с несколькими вложениями
        $attach_ids = [];

        // для каждого вашего URL-адреса изображений из JSON галереи
        foreach ($array['gallery'] as $img_url) {

            // проверьте тип файла
            // мы будем использовать это как 'post_mime_type'
            $file_type = wp_check_filetype(basename($img_url),null);

            // получить путь к директории загрузок
            $wp_upload_dir = wp_upload_dir();

            // подготовить массив данных поста вложения
            $attachment = [
                'guid' => $wp_upload_dir['url'] . "https://wordpress.stackexchange.com/" . basename($img_url),
                'post_mime_type' => $file_type['type'],
                'post_title' => preg_replace('/\.[^.]+$/', '',basename($img_url)),
                'post_content' => '',
                'post_status' => 'inherit'
            ];

            // вставить вложение
            $attach_id = wp_insert_attachment($attachment,$img_url,$post_id);

            // убедиться, что этот файл включен, так как wp_generate_attachment_metadata() зависит от него
            require_once(ABSPATH . 'wp-admin/includes/image.php');

            // сгенерировать метаданные для вложения и обновить запись в базе данных
            $attach_data = wp_generate_attachment_metadata($attach_id,$img_url);
            wp_update_attachment_metadata($attach_id,$attach_data);

            // собрать идентификаторы вложений в массив
            $attach_ids[] = $attach_id;

        }

        // получить наши текущие изображения поля галереи ACF
        $gallery = get_field($acf_gallery_field_name,$post_id);

        // если у нас уже есть изображения в галерее
        if($gallery) {

            // пустой массив для существующих идентификаторов изображений галереи
            $existing_attach_ids = [];

            // для каждого элемента галереи в качестве ключа массива => массив изображений
            foreach ($gallery as $key => $img) {

                // добавляем идентификатор изображения в существующие идентификаторы вложений 
                $existing_attach_ids[] = $img['ID'];

            }

            // объединяем существующие идентификаторы галереи ACF с новыми загруженными изображениями из JSON
            $attach_ids = array_merge($existing_attach_ids,$attach_ids);

            // обновить поле галереи ACF с объединенными идентификаторами вложений
            update_field($acf_gallery_field_name,$attach_ids,$post_id);

        } else {

            // обновить поле галереи ACF с новыми идентификаторами вложений
            update_field($acf_gallery_field_name,$attach_ids,$post_id);

        }

    }

}

.

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

Автоматическое заполнение полей изображений ACF из JSON-файла

В условиях современного цифрового мира автоматизация процессов становится неотъемлемой частью управления контентом. Особенно это актуально для системы управления контентом WordPress с плагином Advanced Custom Fields (ACF). В этой статье мы рассмотрим, как автоматически заполнять кастомные посты, содержащие поля ACF, используя данные из внешнего JSON-файла и выполняя обновление каждые 30 минут через Cron Job.

Шаг 1: Подготовка JSON-файла

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

{
    "gallery": [
        "https://example.com/image1.jpeg",
        "https://example.com/image2.jpeg",
        "https://example.com/image3.jpeg"
    ]
}

Данный формат JSON позволит нам легко извлечь изображения и использовать их для заполнения поля галереи ACF.

Шаг 2: Создание функции для обработки изображений

Для выполнения задачи нам необходимо создать функцию, которая будет получать данные из JSON, скачивать изображения и добавлять их в галерею ACF. Рассмотрим следующий пример кода:

/**
 * @param $post_id int
 * @param $acf_gallery_field_name string
 * @param $json_url string
 */
function add_json_imgs_to_acf_gallery($post_id, $acf_gallery_field_name, $json_url) {
    // Получение данных JSON по URL
    $json = file_get_contents($json_url);
    $array = json_decode($json, true);

    if (is_array($array) && array_key_exists('gallery', $array)) {
        $attach_ids = [];

        foreach ($array['gallery'] as $img_url) {
            $file_type = wp_check_filetype(basename($img_url), null);
            $wp_upload_dir = wp_upload_dir();

            // Подготовка данных для вложения
            $attachment = [
                'guid' => $wp_upload_dir['url'] . '/' . basename($img_url),
                'post_mime_type' => $file_type['type'],
                'post_title' => preg_replace('/\.[^.]+$/', '', basename($img_url)),
                'post_content' => '',
                'post_status' => 'inherit'
            ];

            // Вставка вложения
            $attach_id = wp_insert_attachment($attachment, $img_url, $post_id);
            require_once(ABSPATH . 'wp-admin/includes/image.php');
            $attach_data = wp_generate_attachment_metadata($attach_id, $img_url);
            wp_update_attachment_metadata($attach_id, $attach_data);
            $attach_ids[] = $attach_id;
        }

        // Получение текущих изображений из галереи ACF
        $gallery = get_field($acf_gallery_field_name, $post_id);
        if ($gallery) {
            $existing_attach_ids = array_map(function ($img) { return $img['ID']; }, $gallery);
            $attach_ids = array_merge($existing_attach_ids, $attach_ids);
        }

        update_field($acf_gallery_field_name, $attach_ids, $post_id);
    }
}

Шаг 3: Настройка Cron Job

Для автоматического вызова функции каждые 30 минут, вам необходимо настроить Cron Job. В файле functions.php вашей темы или в плагине добавьте следующий код:

function my_custom_cron_job() {
    // Укажите ID поста, имя поля ACF и URL JSON
    $post_id = 123; // Замените на ваш ID поста
    $acf_gallery_field_name = 'my_gallery'; // Замените на ваше имя поля
    $json_url = 'https://example.com/gallery.json'; // URL вашего JSON

    add_json_imgs_to_acf_gallery($post_id, $acf_gallery_field_name, $json_url);
}

add_action('my_hourly_event', 'my_custom_cron_job');

if (!wp_next_scheduled('my_hourly_event')) {
    wp_schedule_event(time(), 'every_half_hour', 'my_hourly_event');
}

Здесь мы создали событие my_hourly_event, которое будет выполняться каждые 30 минут. Не забудьте зарегистрировать интервал времени every_half_hour с использованием add_filter(), если он еще не определен.

Заключение

Автоматизация процесса заполнения галерей ACF с использованием данных из JSON — это отличный способ оптимизировать управление контентом. Следуя приведенным шагам и адаптируя код под свои нужды, вы сможете удобно обновлять галереи изображений на основе внешних данных без необходимости ручного вмешательства. Этот подход не только сэкономит ваше время, но и повысит актуальность контента на вашем сайте, что особенно важно для привлечения и удержания аудитории.

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

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