Как добавить галерею изображений к пользовательскому типу записи?

24 мар. 2014 г., 06:14:59
Просмотры: 16.9K
Голосов: 3

Я получаю данные из внешнего веб-сервиса в пользовательский тип записи. Эти данные включают изображения. Как я могу создать галерею изображений, добавить существующие вложения и связать их с записью?

Я надеялся найти что-то вроде функции 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 к записи.

1
Комментарии

Только что заглянул в функцию get_post_gallery. Она использует регулярные выражения для поиска шорткода галереи в контенте поста. Это означает, что если шорткод отсутствует, функция не вернет галерею поста.

Jörn Lund Jörn Lund
27 мар. 2014 г. 12:11:41
Все ответы на вопрос 2
3

Когда у вас есть просто файлы изображений, которые вы хотите прикрепить к записи, функция 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] в контент родительской записи.

24 мар. 2014 г. 14:35:30
Комментарии

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

Dan Ross Dan Ross
24 мар. 2014 г. 20:49:45

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

helgatheviking helgatheviking
27 мар. 2014 г. 13:17:49

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

Dan Ross Dan Ross
27 мар. 2014 г. 18:38:25
1

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

Следующий код добавляет редактор галереи в интерфейс редактора вашего пользовательского типа записи:

https://gist.github.com/alexdunae/897503

23 сент. 2014 г. 17:19:59
Комментарии

Эх, это хак с iframe... но +1, похоже, что это сработает, и у нас нет ничего лучше. Именно из-за таких вещей я теперь всё больше предпочитаю фреймворки, а не CMS.

Dan Ross Dan Ross
5 окт. 2014 г. 22:40:29