Вопрос или проблема
Мне интересно, могут ли профессионалы 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 — это отличный способ оптимизировать управление контентом. Следуя приведенным шагам и адаптируя код под свои нужды, вы сможете удобно обновлять галереи изображений на основе внешних данных без необходимости ручного вмешательства. Этот подход не только сэкономит ваше время, но и повысит актуальность контента на вашем сайте, что особенно важно для привлечения и удержания аудитории.