Как избежать изобретения велосипеда с пользовательскими полями в метабоксе моего плагина?
Вот сценарий:
В моем плагине я хочу, чтобы на странице редактора записей/страниц отображался метабокс.
Я хочу, чтобы метабокс был -точь-в-точь- как стандартный метабокс 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 помочь мне указать правильное направление? У меня большой опыт в добавлении и использовании метабоксов в темах и плагинах, но эта задача меня полностью ставит в тупик.
Пожалуйста, дайте знать, если что-то неясно.
Заранее спасибо всем, кто ответит!

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

Я сохраняю свои произвольные поля с именем _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
.
Надеюсь, это поможет и ясно изложено с моей стороны?

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

Похоже, мы работаем над похожими вещами. Не уверен, что это поможет, но, возможно, даст вам новые идеи.
Первая часть из трёх в блоге — http://www.deluxeblogtips.com/2010/05/howto-meta-box-wordpress.html
Надеюсь, это будет полезно!
