sethmerrick
  • 0
Новичок

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

  • 0

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

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

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

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

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

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

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

Пожалуйста, говорите, если я неясно выразился.

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

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

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

    • 0
    • Спасибо за вклад, но это не совсем то, что я ищу. Я знаком с тем, как это сделать (как показано во втором пункте), но главное, что мне нужно здесь, это как в основном продублировать метабокс настраиваемых полей -И- добавить 3-е поле (Цель) -И -, после дублирования метабокса настраиваемых полей, забивая все мои значения в массив. Я думаю, что если я смогу понять, как обращаться с первым пунктом списка, я смогу довольно легко определить, как организовать свой массив. Еще раз спасибо, что нашли время внести свой вклад!

      • 0
    • @SethMerrick: извините за неправильное понимание вашего вопроса. Теперь я понимаю, но это действительно трудный путь 😉

      • 0
  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

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

    • 0
  3. Похоже, мы работаем над похожими вещами. Не уверен, что это поможет, но может дать вам некоторые другие идеи.

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

    Надеюсь, поможет!

    • 0

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

You must login to add an answer.