Как добавить галерею изображений к пользовательскому типу записи?
Я получаю данные из внешнего веб-сервиса в пользовательский тип записи. Эти данные включают изображения. Как я могу создать галерею изображений, добавить существующие вложения и связать их с записью?
Я надеялся найти что-то вроде функции set_post_gallery
в дополнение к get_post_gallery
, но не смог найти ничего подобного в кодексе, Google или в файле wp-includes/media.php
.
Вот как я настраиваю вложения:
$attachment = [
'guid' => wp_upload_dir()[ 'url' ] . '/' . basename( $path ),
'post_mime_type' => wp_check_filetype( basename( $path ), null )[ 'type' ],
'post_title' => "$mlsNum $id",
'post_content' => '',
'post_status' => 'inherit'
];
$attachmentId = wp_insert_attachment( $attachment, $path, $this->postId );
// Генерируем метаданные вложения и создаем уменьшенные версии изображений.
wp_update_attachment_metadata( $attachmentId, wp_generate_attachment_metadata( $attachmentId, $path ));
А вот как я пытаюсь получить галерею для темы:
$gallery = get_post_gallery( $post, false );
var_dump( $gallery );
var_dump( $post );
$post
определен, но $gallery
возвращает false. Я предполагал, что wp_insert_attachment
автоматически создаст галерею для записи и добавит вложение в нее, но, видимо, это не так. Если бы это было так, это создало бы дополнительные проблемы, когда я захочу прикрепить PDF к записи.

Когда у вас есть просто файлы изображений, которые вы хотите прикрепить к записи, функция wp_insert_attachment
справится с этой задачей.
Если вложения уже присутствуют в вашей базе данных, вы можете использовать wp_update_post
для установки родительской записи (post_parent) для вложения.
Вот так:
wp_update_post( array(
'ID' => $attachment_id,
'post_parent' => $parent_post_id,
));
Чтобы получить вложения записи, можно использовать функцию get_children
.
$args = array(
'post_parent' => $parent_post_id,
'post_type' => 'attachment',
);
$attachments = get_children( $args );
Если вы настаиваете на использовании get_post_gallery
– которая возвращает только вложения-изображения – вам следует добавить шорткод [gallery]
в контент родительской записи.

Я также думал, что wp_insert_attachment
автоматически добавит вложение в галерею поста, создав её при необходимости, но документация Codex ничего подобного не обещает (и магия не сработала в моём случае). Интересно, как админка создаёт галереи...

Насколько я знаю, стандартной галереи не существует. Галерея определяется только ID изображений, указанных в шорткоде. Вы можете использовать предложенный метод get_children()
для получения всех вложений или альтернативно сохранять ID вложений как метаданные родительского поста.

Я временно использовал get_children
с проверкой mime_type
, но перейду на метод с шорткодом [gallery]
, чтобы пользователь мог редактировать галерею через медиа-менеджер WordPress на странице редактирования поста. Это также упростит интеграцию плагина с темами других разработчиков. Я не первый, кто работает над этим сайтом, и вряд ли буду последним. Хоть и кажется немного костыльным менять содержимое поста для управления галереей, но это сработает, и лучшего способа нет. Спасибо, Jörn!

Здесь представлено отличное PHP-решение, которое добавляет редактор галереи в редактор пользовательского типа записи. Это особенно полезно, если, как и я, вы создаете пользовательские типы записей с помощью PHP и импортируете данные через WPAllImport. В моем случае я хочу использовать стандартную галерею, чтобы клиенты могли редактировать, добавлять или удалять импортированные изображения.
Следующий код добавляет редактор галереи в интерфейс редактора вашего пользовательского типа записи:
