matt
  • 0
Мастер

Помощь в создании пользовательского типа записи слайд-шоу с пользовательскими мета-полями?

  • 0

Мне нужно создать настраиваемый мета-блок(и) сообщения для моего пользовательского типа сообщения «Слайд-шоу» (этот тип сообщения уже создан). Каждый метабокс будет содержать содержимое каждого слайда слайда и сохранять его в соответствующих настраиваемых полях. Каждый метабокс должен содержать следующие поля:

  • Заголовок (текстовое поле)
  • Изображение (либо текстовое поле для URL-адреса изображения, либо, в идеале, раскрывающийся список, показывающий миниатюры изображений, прикрепленных к сообщению)
  • Код для вставки (текстовая область)
  • Описание (wysiwyg)
  • Скрыть слайд (флажок для временного скрытия слайда без его удаления)
  • Удалить слайд (кнопка, которая удаляет содержимое метаполей поста, которые были заполнены этим слайдом)

Я также хотел бы, чтобы где-нибудь была кнопка, которая позволяет мне «Добавить слайд», поэтому при нажатии на нее добавляется еще один настраиваемый мета-бокс «Слайд», который является дубликатом первого, но добавляет добавочный номер в каждое пользовательское мета-поле сообщения. В настоящее время у меня всего 15 метабоксов, а шаблон слайд-шоу настроен таким образом, что если заполнено только 5 метабоксов, отображается только 5 слайдов.

Наконец, я хотел бы иметь возможность изменять порядок слайдов, будь то «перетаскивание» или другое текстовое поле, в которое я могу ввести номер заказа.

Я получил его почти там, где мне это нужно, с помощью плагина «More Fields» и некоторой помощи кода от Rarst. С плагином «Дополнительные поля» у меня есть следующие поля в каждом метабоксе:

  • Заголовок (текстовое поле)
  • Изображение (выпадающий список изображений, прикрепленных к сообщению)
  • Код для вставки (текстовая область)
  • Описание (wysiwyg)
  • Скрыть слайд (флажок для временного скрытия слайда без его удаления)

Вот скриншот того, как я настроил его через плагин «More Fields»:

альтернативный текст

Проблема в том, что нет возможности удалить слайд после его создания, потому что «Дополнительные поля» нигде не используются <?php delete_post_meta($post_id, $key, $value); ?> . Другая проблема с плагином заключается в том, что он слишком ненадежен и часто ломается при обновлениях.

Мне удалось реализовать аналогичное решение с моими собственными метабоксами, которые включают в себя:

  • Заголовок (текстовое поле)
  • Изображение (текстовое поле для URL-адреса img)
  • Код для вставки (текстовая область)
  • Описание (текстовая область)
  • Скрыть слайд (флажок для временного скрытия слайда без его удаления)

С этой реализацией я не могу заставить работать несколько полей TinyMCE или раскрывающийся список изображений. Код TinyMCE, кажется, работает, пока я не добавлю код, создающий добавочные копии первого метабокса, после чего я получаю эту ошибку прямо над полем, где должны быть кнопки TinyMCE: Warning: array_push() [function.array-push]: First argument should be an array... .

Кроме того, прямо сейчас я полагаюсь на то, что мои авторы знают, как вставить ЛИБО видео или изображение для каждого слайда, и это нормально, но может быть лучше иметь переключатель, который позволяет им выбирать, какой слайд (вероятно, по умолчанию изображение), которое связано с оператором условного отображения в шаблоне слайд-шоу.

Я обрабатываю загрузку изображений через встроенное поле «Избранное изображение» на боковой панели, хотя я не возражал бы против пользовательского метабокса, который просто говорил «Загрузить изображения» в верхней части панели записи.

В конечном итоге я ищу слайд-шоу, подобное этому: http://www.nytimes.com/slideshow/2010/08/10/science/20100810angier-1.html. Я хочу, чтобы мой также мог иметь видео в качестве контента на слайде вместо изображения. Мне нужна интуитивно понятная и простая в использовании панель администратора для моих авторов (они не очень технически подкованы и ненадежны в использовании html и/или шорткодов). На всякий случай, если из примера неясно, каждый слайд должен генерировать новый просмотр страницы.

Переупорядочивание Drag’n’Drop не является приоритетом, но было бы здорово. Я нашел плагин, который очень хорошо с этим справляется: SlideDeck. К сожалению, плагин не соответствует моим потребностям, но то, как они упорядочивают слайды, довольно изящно. Это отдельный метабокс на боковой панели, который позволяет перетаскивать слайды в нужном вам порядке. Таким же образом вы добавляете слайды, нажимая кнопку «Добавить слайд», которая добавляет еще один метабокс слайда на панель записи. Вот скриншот:

альтернативный текст

Вы также можете увидеть больше скриншотов в действии в репозитории WordPress.

Вот весь мой код:

Функции, настраивающие тип публикации в слайд-шоу и разбиение на страницы слайд-шоу: http://loak.pastebin.com/g63Gf186

Исходный код с сайта DeluxeBloggingTips.com (DBT), на котором я основывал свои метабоксы: http://loak.pastebin.com/u9YTQrxf

Версия кода DBT, которую я изменил, чтобы получить дополнительные версии того же метабокса: http://loak.pastebin.com/WtxGdPrN

Модифицированная версия кода DBT, созданная Крисом Бербриджем для поддержки нескольких экземпляров TinyMCE: http://loak.pastebin.com/Mqb3pKhx С этим кодом TinyMCE работают.

Моя модификация кода Бербриджа, которая пытается включить мое увеличение и поле, которое позволяет вам выбрать изображение из раскрывающегося списка всех изображений, прикрепленных к сообщению: http://loak.pastebin.com/xSuenJTK В этой попытке TinyMCE сломан, и раскрывающийся список не работает.

Это, вероятно, не имеет значения, но на всякий случай, если вам интересно, вот код, который я использую для извлечения кода встраивания из метаданных пользовательского сообщения, изменения его размера и вставки в сообщение: http://loak.pastebin.com /n7pAzEAw

Это отредактированная версия исходного вопроса, отражающая текущее состояние проекта и отвечающая на вопросы, опубликованные в комментариях. Спасибо Chris_O за вознаграждение за это. Также спасибо Рарсту и Джастину за помощь во многих вопросах на форуме ThemeHybrid.com. Я потратил на это часы и часы и застрял (я потратил пару часов один на этот вопрос). Любая помощь будет принята с благодарностью.

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

    • 0
    • Я добавил несколько примеров внизу. Если это недостаточно прояснит ситуацию, дайте мне знать.

      • 0
    • Любой? Эта штука включена?

      • 0
    • Спасибо за помощь! На данный момент это немного выходит за рамки моих навыков, но послужит хорошим руководством в процессе обучения. Я знаю о «классах» и понимаю, что уже использую класс в коде метабоксов, но я все еще не понимаю их. Еще одна вещь, о которой я «знаю», но не совсем понимаю, — это использование массивов.

      • 0
    • Ваш совет о том, чтобы сначала разобраться с основами, имеет смысл, но я сталкиваюсь с некоторыми ограничениями реального мира, которые требуют, чтобы я как можно скорее перенес это в производственную среду, и одним из наиболее важных факторов является редактор wysiwyg, потому что многие писатели очень нетехнические. Я не против сделать проект инкрементным и полагаться на костыли по пути, но этот подход, очевидно, должен быть масштабируемым. Тем не менее, мне кажется, что использование плагина «больше полей» может служить временным решением, пока я не выясню это, однако я не уверен, что это сработает с…

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

      • 0
    • Сохранение всего шоу в одном метаполе одновременно предотвращает и создает проблемы: это экономит время на сайте презентации, не заставляя вас выбирать, читать и циклически просматривать несколько полей. Однако, если что-то ломается в одном слайде и записывается в БД, это ломает все слайд-шоу. Определенно компромисс, но я всегда выбираю скорость и простоту разработки.

      • 0
    • Вы хотите сказать, что это экономит время на интерфейсе сайта? Почему это так, если он показывает только один слайд за раз?

      • 0
  2. Судя по всему, самым безопасным и простым путем будет создание форка плагина More Fields специально для вашего использования. Две самые большие функции, которые, как я вижу, нужны вашему форку, — это поле «фабрика» и интерфейс перетаскивания.

    Несколько полей

    Мое предложение состояло бы в том, чтобы взглянуть на класс WordPress Widget и использовать его в качестве модели для вашей фабрики полей — в основном, позаимствовать возможность создавать несколько экземпляров поля, как только вы создали для него структуру.

    Это ядро ​​того, как несколько виджетов работают на боковой панели:

    • Вы определяете код для каждого виджета один раз, расширяя WP_Widget класс.
    • Затем вы можете создать столько копий виджета, сколько захотите.
      • Специфика каждого виджета хранится в виде сериализованных данных в таблице опций.
    • Вы можете настроить каждый виджет, удалить их с помощью простой delete команды и явно установить их положение с помощью интерфейса перетаскивания «Внешний вид».

    Перетаскивание

    Еще раз, я предлагаю обратиться к системе виджетов WordPress для вдохновения. У нас уже есть довольно интуитивно понятный интерфейс перетаскивания, поэтому было бы довольно легко переназначить большую часть того же кода в другом месте. Или, если вы хотите стать по-настоящему необычным, вы можете реализовать свою собственную систему перетаскивания внутри отдельного пользовательского метаполя.

    Таким образом, каждый слайд будет определяться пользовательским мета-полем, связанным с публикацией. Порядок слайдов будет установлен отдельным настраиваемым мета-полем, которое также связано с публикацией. Я бы рекомендовал отправлять обновления слайдов через AJAX, чтобы вы могли динамически обновлять мета-поле порядка слайдов на основе информации (это избавляет от необходимости вручную нажимать «обновить» и ждать перезагрузки страницы, прежде чем перемещать вещи).

    Пользовательский интерфейс jQuery имеет отличный « перетаскиваемый » интерфейс, которым вы можете легко манипулировать для своих целей в этом пользовательском мета-окне. Трудная часть заключается не в создании интерфейса, а в обеспечении согласованной и точной связи между метаблоком и набором метаблоков слайдов в других местах страницы.

    В итоге

    Из вашего поста я понял, что у вас есть несколько работоспособное решение:

    • Вы добавили 15 настраиваемых полей в свой собственный тип сообщения с помощью виджета «Дополнительные поля», но хотите динамически добавлять/удалять поля, а не работать с заданным числом.
    • Вам нужен способ настроить порядок этих настраиваемых полей, чтобы слайды загружались по порядку.

    Я бы подошел к этому, абстрагировав процесс создания настраиваемых метаданных в класс, который я могу использовать снова и снова для создания новых настраиваемых метаполей. Затем я бы расширил класс, чтобы инициализировать два типа мета-полей: один для слайдов, другой для структуры слайдов. Я бы также встроил в метаблок структуры слайда возможность динамического создания новых метаблоков слайда (в метаблоках слайда будет свое собственное действие «удалить»).

    Все слайд-шоу будет храниться не в мета-полях слайдов, а в мета-полях структуры слайдов в настраиваемое мета-поле для поста — настраиваемое мета будет представлять собой зубчатый массив, в котором каждый из слайдов представлен как массивы внутри него — в заказ. Настройка порядка слайд-шоу в мета-поле структуры приведет к реорганизации массива и повторному сохранению метаданных поста. Таким образом, у меня есть только 1 мета-значение для чтения, когда я хочу получить доступ к слайд-шоу.

    Благодаря SlideDeck, More Fields и пользовательскому коду, который вы уже собрали, у вас уже есть большая часть вашего решения… вам просто нужно, чтобы все это работало одновременно. Я бы сначала сосредоточился на реализации корневой реализации, прежде чем добавлять украшения JavaScript — динамическое создание, изменение, сохранение и удаление слайдов важнее, чем редактор форматированного текста, IMO. Сначала разберись с этим. Тогда отключите систему заказов. Затем вы можете сосредоточиться на работе нескольких экземпляров TinyMCE на странице.

    • 0

Оставить ответ

You must login to add an answer.