(Мой первый вопрос WP когда-либо задавался! Будьте нежны!)
Я строю сайт, который в основном страницы (то есть, статические), используя WP в качестве CMS. Внизу нескольких страниц появятся 1, 2 или 3 «промо-коробки» - в основном кнопки-изображения, которые ссылаются на другие части сайта. Хотя на каждой странице будет отображаться только до 3 промо-боксов, на выбор будет ~ 30 разных.
Когда мой клиент создает новую страницу, я бы хотел, чтобы он мог выбирать промо-боксы из выпадающего списка всех возможных промо-боксов.
Мне кажется, это должно работать так:
- Создайте собственный тип поста под названием «промо-бокс». (Хотя это также может быть тег для обычных сообщений.)
- Используйте такой инструмент, как Шаблон настраиваемого поля, чтобы создать раскрывающийся список в редакторе страниц, где значения параметров раскрывающегося списка динамически генерируются из списка всех существующих сообщений промо-бокса. ( Это часть, которую я не знаю, как сделать. )
- Получите доступ к полученным метаданным (номер сообщения - действительно все, что мне нужно, тогда я могу получить все остальное) в шаблоне страницы.
Основываясь на ответах на другие вопросы здесь, я вначале рассмотрел пользовательские поля WPAlchemy MetaBox, Posts-2-Posts и SLT, но, признаюсь, документация по каждому из них немного сложнее, чем я, поэтому я не углубился слишком глубоко
Совет? Является ли один из вышеперечисленных инструментов правильным решением для меня, и мне просто нужно выяснить это? Я что-то здесь упускаю?
источник
Ответы:
Как автор из WPAlchemy , я немного предвзятости, но вы , по сути есть рабочая модель хорошо обрисовал следовать в зависимости от того, что когда - либо путь вы выбираете.
Тем не менее, если вы используете WPAlchemy, вы должны сделать что-то вроде следующего (шаг № 2):
custom/meta.css
может содержать стили, с которыми вы можете стилизовать вашу форму, и,custom/meta.php
по сути, представляет собой HTML-файл с содержимым FORM мета-блока, в данном случае с раскрывающимся списком, чтобы создать раскрывающийся список, вы должны выполнить настраиваемый wp-запрос, чтобы получить все ваши собственные сообщения. типы. В WPAlchemy есть несколько специальных вспомогательных функций, помогающих создавать элементы формы.Существует дополнительная документация, которая поможет вам при работе с шаблоном.
Основная цель WPAlchemy состояла в том, чтобы держать контроль в руках разработчика, от стилизации (внешний вид + ощущение) до определения содержимого мета-блока.
И я, и другие всегда готовы помочь тем, кто комментирует и задает вопросы.
источник
do_meta_boxes
с некоторой условной логикой или, альтернативно, сadd_meta_boxes_{%TYPE%}
…Хе-хе, ты новичок! Мы разорвем тебя в клочья ...!
j / k :) Мы предлагаем теплый прием всем новичкам здесь, рад, что вы.
Поэтому я слышу это требование в третий раз, дважды от клиентов, а не от вас (и вашего клиента). Это говорит о том, что это достаточно распространенная потребность.
Мне понравился твой анализ, поэтому я решил написать код для твоего второго пункта. Я назвал это,
LittlePromoBoxes
потому что я никогда не могу выкинуть эту песню из головы, благодаря им . В основном я использую класс для инкапсуляции, чтобы избежать возможных конфликтов имен с функциями, которые мне нужно написать.Вы можете поместить этот класс в
functions.php
файл вашей темы или в файл .PHP плагина, который вы, возможно, пишете (но не волнуйтесь, он выглядит намного сложнее, чем он есть).Первая функция
on_load()
- это статическая функция, которую я вызываю в конце объявления класса для инициализации трех (3) хуков, которые вам понадобятся (например, статические функции - это функции, связанные с классом , а не с экземпляром) :init
Крюк , чтобы зарегистрироватьpromo-box
тип записи,add_meta_boxes_post
Крюк , чтобы позволить вам определить METABOX, иwp_insert_post_data
Крюк , чтобы позволить вам захватить выбранные промо коробки и сохранить в базе данных.Каждый из этих хуков ссылается на другую статическую функцию в классе (это были функции, которые я инкапсулировал, создавая класс.)
Я пропущу описание
action_init()
функции и моейmake_labels()
вспомогательной функции, предполагая, что вы знаете, как зарегистрировать тип сообщения на основе вашего вопроса.action_add_meta_boxes_post()
Функция регистрирует METABOX с помощью функции ядра WordPress ,add_meta_box()
и я заметил , что это параметры , чтобы объяснить , почему я прошел , что я проходил мимо каждого из них . Функция обратного вызова,the_little_promo_boxes_metabox()
конечно, является другой статической функцией класса, и именно она отображает содержимое в метабоксе. В основном он использует основную функцию WordPresswp_dropdown_pages()
для отображения списка рекламных блоков (обратите внимание, что он будет отображать другие типы записей, кроме «страницы», но только в том случае, если они помечены как находящиеся'hierarchical'=>true
в их регистрации типов записей. Почему только иерархические? написал это, вот почему! :)Поскольку мы показываем три (3) выпадающих списка, нам нужно дать каждому уникальный идентификатор в HTML (
"promo_box_{$i}"
), но одно и то же имя в квадратных скобках ('promo_boxes[]'
), чтобы PHP собирал их в массив внутри$_POST
переменной (к которой WordPress обращается к нам; Вы увидите, как через минуту) . И, конечно, нам нужно установить выбранное значение ((empty($promo_boxes[$i]) ? 0 : $promo_boxes[$i])
), если действительно одно из значений было выбрано ранее.Я также использовал основную функцию WordPress,
get_post_type_object()
чтобы показать, как получать метки от типа записи, а также использовал основную функцию WordPress,get_post_meta()
чтобы получить массив идентификаторов промо-боксов, используя ключ настраиваемого поля '_promo_boxes', который я покажу вам чтобы сохранить следующее (обратите внимание, что в названии я использовал предыдущее подчеркивание,'_promo_boxes'
которое заставляет WordPress скрываться от стандартного пользовательского интерфейса настраиваемого поля, когда пользователь редактирует сообщение.) .Последняя функция, которую нужно описать перед тем, как вы увидите код, -
filter_wp_insert_post_data()
получает существующие данные поста в первом параметре ($data
) и содержимое$_POST
массива благодаря WordPress в качестве второго параметра ($postarr
). Внутри этой функции мы вызываем основную функцию WordPressupdate_post_meta()
и извлекаем массив промо-боксов ($postarr['promo_boxes']
), чтобы сохранить значение пользовательского поля для ключа'_promo_boxes'
для поста, указанного в$_POST
массиве (то есть$postarr['ID']
).Тем не менее, вот код для
LittlePromoBoxes
класса:Есть еще две (2) статические функции, еще не упомянутые:
get_promo_boxes()
иget_promo_box()
; это вспомогательные функции, которые помогут вам получить сообщенияpost_type='promo-box'
по их порядковым номерам 1..3. Но чтобы сделать их более похожими на WordPress, вот две функции-обертки, которые нужно добавить вfunctions.php
файл вашей темы (обратите внимание, что вы можете передавать сообщение в качестве параметра, но вам это не нужно, если вы не используете сообщение, отличное от того, что в Loop ) :Теперь вы можете вызвать одну или обе эти функции в
single.php
файле темы с помощью кода, который может выглядеть следующим образом (этот код мог бы быть написан в цикле, но большинству разработчиков WordPress, похоже, нравится дублировать код, чтобы они могли читать его вместо устранения избыточности Итак, когда в Риме ...)источник