2017-01-11 4 views
0

Я искал пару дней и не нашел никакой информации о том, как разрешить пользователю администратора дублировать метабокс для персонализированного типа сообщения нажатием кнопки.Dynamically Create Wordpress Metabox

add_meta_box( 
    'Presentation', // $id 
    'Presentation', // $title 
    'show_custom_presentation_meta_box', // $callback 
    'presentations', // $page 
    'normal', // $context 
    'high', // $priority 
    $custom_presenter_meta_fields); // $callback_args 

Видя, как функция add_meta_box вызываются в add_meta_boxes действий, я не уверен, если какие-либо переменные может быть сохранен, что позволит цикл, чтобы добавить нужное количество метабоксов после того, как пользователь сохранил пост с дополнительными метабоксами ,

Я реализовал динамические поля, когда пользователь нажимает кнопку, добавляется и сохраняется дополнительное текстовое поле, когда сообщение обновляется.

Я не пытаюсь дублировать поля внутри метаболизма. Я ищу, чтобы создать дубликат всего метаболизма при нажатии кнопки +.

Точка в правильном направлении была бы высоко оценена. Благодаря!

+0

Можете ли вы уточнить? В основном вы хотите добавить метабокс с одним полем. Но пользователь может щелкнуть '+', чтобы вставить второе поле? И сохранить оба? – janw

+0

Не совсем, я смог выполнить то, что вы описываете. Метаболизм, я хотел бы дублировать, имеет около семи полей. Я хочу добавить дополнительный метаболизм с теми же 7 полями, когда пользователь нажимает кнопку +. – GDT

ответ

0

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

В отдельном метаболизме нам требуется поле, которое будет содержать количество желаемых динамических обменных веществ. * Обратите внимание, что это поле может быть скрытым или видимым.

dynamic metabox count

global $presenter_count; 

add_meta_box( 
    'Meetings', // $id 
    'Meetings Info', // $title 
    'show_custom_meetings_meta_box', // $callback 
    'meetings', // $page 
    'normal', // $context 
    'high', // $priority 
    $custom_meetings_meta_fields); // $callback_args   

$c = 0; 
$count = get_post_meta($post_id, 'meetings_presenter_count', true); 

while ($c < $count) { 

    $presenter_count = 0; 

    add_meta_box( 
     'Presentation'.$c, // $id 
     'Presentation '.++$c, // $title 
     'show_custom_meetings_meta_box', // $callback 
     'meetings', // $page 
     'normal', // $context 
     'low', // $priority 
     $custom_meetings_presenter_meta_fields); // $callback_args 
} 

Внутри функции обратного вызова, которая строит поля, которые мы хотим убедиться, что мы называем глобальной переменной мы создали $ presenter_count.

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

// Callback args for metabox 
$custom_meetings_presenter_meta_fields = array( 
     array( 
      'label' => 'Presenter\'s Name', 
      'desc' => 'The presenter\'s prefix and name', 
      'id' => $prefix.'name', 
      'type' => 'presenter_name' 
     )); 

// Callback function 
    function show_custom_meetings_meta_box($post, $custom_meetings_field) { 
global $custom_meetings_meta_fields, $custom_meetings_presenter_meta_fields, $post, $presenter_count; 
// Use nonce for verification 

echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />'; 
    // Begin the field table and loop 
    echo '<table class="form-table">'; 
    foreach ($custom_meetings_field['args'] as $field) { 
     // get value of this field if it exists for this post 
     $meta = get_post_meta($post->ID, $field['id'], true); 
     // begin a table row with 
     echo '<tr> 
       <th><label for="'.$field['id'].'">'.$field['label'].'</label></th> 
       <td>'; 
       switch($field['type']) { 
        // Presenter Name 
        case 'presenter_name': 

         $c = $presenter_count; 

         echo '<input type="text" name="'.$field['id'].'['.$c.']" id="'.$field['id'].'-'.$c.'" value="'.$meta[$c].'" size="30" /> 
          <br /><span class="description">'.$field['desc'].'</span>'; 

        break; 
       } //end switch 
     echo '</td></tr>'; 

     } 

    } // end foreach 
    echo '</table>'; // end table 
} 

мы также должны настроить кнопку для добавления пользователем команды metox.

enter image description here

код под кнопкой:

jQuery('.add-presentation').on('click', function(){ 
    var c = jQuery('#meetings_presenter_count').val(); // get presenter count 
    var pc = 0; 
    if (c != '') { 
     pc = c + 1; 
     // write a condition that allows for one presenter to exist 
     jQuery('#Presentation'+pc).after('Insert Metabox'); 
     jQuery('#meetings_presenter_count').val(pc); // Increment presenter count 
    }else{ // If no presenter box exists make count = 1 
     jQuery('#meetings_presenter_count').val('1'); 
     jQuery('#Meetings').after('Insert Metabox'); 
    } 

}); 
1

Я не могу предоставить полный ответ здесь, но может дать указатели.

Чтобы дублировать метабокс, вам нужно будет добавить javascript.

  1. На всех полях ввода убедитесь, что name="" поле предваряются как name="1_text"name="1_firstname"
  2. Выберите первый METABOX с JQuery.
  3. Duplicate it. Измените атрибуты имени на +1 name="2_text"name="2_firstname" Идентификатор номера в целом в вашем примере 'Presentation', // $id
  4. При сохранении обнаруживайте эти разные имена и сохраняйте их по своему усмотрению.
  5. На загрузке редактирования-страницы определить количество коробок и Еогеасп add_meta_box с правильными номерами

Edit. Точка 1 также может быть выполнена с помощью массивных обозначений:

<input type="text" name="text[1]" /> 
<input type="text" name="firstname[1]" /> 

Это легче при сохранении. И, вероятно, легче загружаться при загрузке.

+0

Спасибо! Я сейчас работаю над этим. Я отправлю сообщение, если я получу решение. Спасибо, janw! – GDT

+0

Если мои подсказки приводят к решению, пожалуйста, примите ответ. Тем не менее вы также можете добавить свой собственный ответ. – janw

+0

Я использую массив для имен. Сейчас я работаю над сохранением данных. Похоже, мне может понадобиться создать массив, содержащий каждый пост-идентификатор и количество обменов в сообщении, чтобы каждый мог быть сохранен и загружен правильно. – GDT

Смежные вопросы