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

2 мар. 2011 г., 17:25:59
Просмотры: 322
Голосов: 4

Вот сценарий:

В моем плагине я хочу, чтобы на странице редактора записей/страниц отображался метабокс.

Я хочу, чтобы метабокс был -точь-в-точь- как стандартный метабокс WordPress 'Пользовательские поля' (Добавить еще, удалить, обновить, выпадающий список с автозаполнением, ссылка 'Ввести новое', AJAX-магия и т.д.), но с небольшими отличиями:

  • Вместо просто 'Имя' и 'Значение', я хочу 'Цель', 'Имя' и 'Значение'

  • Вместо сохранения всех как 'публичные' пользовательские поля, которые автоматически появляются в стандартном метабоксе WordPress, я хочу хранить их все как единый многомерный массив внутри 'приватного', пространства имен, поля... например, _myplugin_custom_fields = array( 1 => array( 'target' => 'mytarget1', 'name' => 'myname1', 'value' => 'myvalue1' ), 2 => array( 'target' => 'mytarget2', 'name' => 'myname2', 'value' => 'myvalue2' ) )

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

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

Пожалуйста, дайте знать, если что-то неясно.

Заранее спасибо всем, кто ответит!

0
Все ответы на вопрос 3
0

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

Вы можете добавить дополнительное поле с помощью JavaScript и перехватить кнопку "Добавить", чтобы отправить данные в ваш собственный AJAX-обработчик, который сохранит их так, как вам нужно.

1 июл. 2011 г. 10:48:29
2

Я сохраняю свои произвольные поля с именем _meta_whatever. Начинать имя с подчеркивания предотвращает отображение произвольных полей в выпадающем списке в стандартных записях WordPress.

Для сохранения в массив я использую HTML-код такого вида:

...
<input type="text" class="short" name="_events_meta[startDate]" id="_events_meta[startDate]" value="<?php if(!empty($meta['startDate'])) echo $meta['startDate']; ?>"/>
<input type="text" class="extrashort" name="_events_meta[startTime]" id="_events_meta[startTime]" value="<?php if(!empty($meta['startTime'])) echo $meta['startTime']; ?>"/>
...

Для получения значений мета-полей я использую следующий код:

...
$meta = get_post_meta($post->ID,'_events_meta',TRUE);
...

Теперь у меня есть ассоциативный массив $meta, где ключевое имя задано в квадратных скобках атрибута id элемента input.

Для сохранения я использую код такого вида:

...
$new_data = $_POST['_events_meta'];
...
add_post_meta($post_id,'_events_meta',$new_data,TRUE);
...

Таким образом, данные сохраняются как одна запись в таблице wp_postsmeta.

Надеюсь, это поможет и ясно изложено с моей стороны?

2 мар. 2011 г. 19:04:38
Комментарии

Спасибо за ответ, но это не совсем то, что я ищу. Я знаю, как сделать эту часть (как показано во втором пункте), но главное, что мне нужно — это по сути дублировать метабокс Custom Fields, добавить третье поле (Target) и после дублирования метабокса поместить все значения в массив. Я думаю, что если смогу разобраться с первым пунктом, то смогу легко организовать массив. Еще раз спасибо, что нашли время помочь!

SethMerrick SethMerrick
2 мар. 2011 г. 20:05:53

@SethMerrick: Извините за недопонимание вашего вопроса. Теперь я понял, но это действительно сложный путь ;-)

Guru 2.0 Guru 2.0
2 мар. 2011 г. 20:09:33
0

Похоже, мы работаем над похожими вещами. Не уверен, что это поможет, но, возможно, даст вам новые идеи.

Первая часть из трёх в блоге — http://www.deluxeblogtips.com/2010/05/howto-meta-box-wordpress.html

Надеюсь, это будет полезно!

1 мая 2011 г. 23:03:06