Intereting Posts
Индивидуальная отдельная страница типа сообщения (одно-{CPT-name}) 404, когда пуля включает дефисы Предварительный черновик с постоянными полями postname, не работающими с другим URL-адресом сайта После миграции веб-сайт работает очень медленно Как отправить фотографию в Facebook при публикации публикации? Custom Post Type переписывает переадресацию на главную страницу Перекодируйте URL-адрес с пользовательскими значениями в URL-адресе Остановить ошибку «загрузить размер файла» из печати Пользовательские rewrite_rules – только номера, а не буквенные символы загрузить определенный контент только на первой странице разбивки на страницы Плагин bbPress: списки форумов не отображаются в правильном порядке? Удалить поле комментария из комментариев Как я могу разрешить ошибку внутреннего сервера .htaccess, устанавливая многопользовательский WordPress? Как отправить электронную почту в WordPress с несколькими приложениями Код эхо-кода от URL-адреса или короткого кода пользовательская страница регистрации wp с user-meta

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

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

Когда я сохраняю сообщение, я могу получить массив зданий на интерфейсе. Однако, если я вернусь, чтобы отредактировать сообщение, мультиселекция не выделяет список ранее выбранных зданий. Поэтому, если я обновляю сообщение, я должен помнить, чтобы также повторно выделить здания, которые затронуты отключением. Все остальные (не массивные) поля успешно сохраняют свои данные.

Добавление настраиваемого MetaBox:

function add_custom_meta_box() { add_meta_box('system_outage','System Outage','show_system_outage','outage','normal','high'); } add_action('add_meta_boxes', 'add_custom_meta_box'); 

Создать полевой массив:

 $prefix = 'sysout_'; $outage_meta_fields = array( array( 'label' => 'Buildings Affected', 'desc' => 'Select the buildings affected', 'id' => $prefix.'buildings', 'type' => 'multiselect', 'options' => array( 'building1' => array( 'label' => 'Building 1', 'value' => 'building1' ), 'building2' => array( 'label' => 'Building 2', 'value' => 'building2' //This continues for a while ) ) ); ); 

Обратный вызов:

 function show_system_outage() { global $outage_meta_fields, $post; echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />'; echo '<table class="form-table">'; foreach ($outage_meta_fields as $field) { $meta = get_post_meta($post->ID, $field['id'], true); echo '<tr>'; echo '<th><label for="'.$field['id'].'">'.$field['label'].'</label></th>'; echo '<td>'; switch($field['type']) { case 'multiselect': echo '<select data-placeholder="Choose a building..." multiple="true" class="chosen" name="'.$field['id'].'[]" id="'.$field['id'].'">'; foreach ($field['options'] as $option) { echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>'; } echo '</select><br /><span class="description">'.$field['desc'].'</span>'; break; } echo '</td>'; echo '</tr>'; } echo '</table>'; } 

И затем я сохраняю данные:

 function save_custom_meta($post_id) { global $outage_meta_fields; if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__))) return $post_id; if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id; if ('page' == $_POST['post_type']) { if (!current_user_can('edit_page', $post_id)) return $post_id; } elseif (!current_user_can('edit_post', $post_id)) { return $post_id; } foreach ($outage_meta_fields as $field) { $old = get_post_meta($post_id, $field['id'], true); $new = $_POST[$field['id']]; if ($new && $new != $old) { update_post_meta($post_id, $field['id'], $new); } elseif ('' == $new && $old) { delete_post_meta($post_id, $field['id'], $old); } } } add_action('save_post', 'save_custom_meta'); 

Надеюсь, я отформатировал его так, чтобы он был смутно читаемым.

Любые указания по этому поводу будут с благодарностью получены. Благодаря!

Solutions Collecting From Web of "Пользовательский метабокс не отображает данные мультиселекта в режиме редактирования"

Я проверил ваш код, и это закончилось тем, что работало на меня:

 case 'multiselect': echo '<select name="'.$field['id'].'" id="'.$field['id'].'">'; foreach ($field['options'] as $option) { echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>'; } echo '</select><br /><span class="description">'.$field['desc'].'</span>'; break; 

Для массива полей я просто добавил еще одну опцию с пустым значением и меткой «Выбрать».
Кроме того, я удалил дополнительный «;» от второй до последней строки.

 $prefix = 'sysout_'; $outage_meta_fields = array( array( 'label' => 'Buildings Affected', 'desc' => 'Select the buildings affected', 'id' => $prefix.'buildings', 'type' => 'multiselect', 'options' => array( 'Select' => array( 'label' => 'Select', 'value' => '' ), 'building1' => array( 'label' => 'Building 1', 'value' => 'building1' ), 'building2' => array( 'label' => 'Building 2', 'value' => 'building2' //This continues for a while ) ) ) ); 

В ответ я заметил ответ Keeihead, потому что они определенно указали мне в правильном направлении. Тем не менее, статья в Reusable Custom Metaboxes по- прежнему не удалось извлечь данные из массива в раздел «Редактировать сообщение». К счастью, в их процессе добавления флажков содержалась часть, отсутствующая в нескольких инструкциях выбора.

 $prefix = 'sysout_'; $outage_meta_fields = array( array( 'label' => 'Buildings Affected', 'desc' => 'Select the buildings affected', 'id' => $prefix.'buildings', 'type' => 'chosen', //This was only changed to match the instructions 'multiple' => true, //This didn't have to be an option - I could have added multiple="multiple" in the HTML below 'options' => array( 'building1' => array( 'label' => 'Building 1', 'value' => 'building1' ), 'building2' => array( 'label' => 'Building 2', 'value' => 'building2' ) ) ) ); 

Часть, которая сделала все возможное, была is_array ( $meta )... часть. Это запрашивает базу данных для массива, и если значение присутствует в массиве, оно помещает опцию как «выбранную» в поле множественного выбора.

Обратите внимание: я также использую плагин JQuery Chosen , так что опция также присутствует в коде.

 case 'chosen': echo '<select name="'.$field['id'].'[]" id="'.$field['id'].'"' , $field['type'] == 'chosen' ? ' class="chosen"' : '' , isset( $field['multiple'] ) && $field['multiple'] == true ? ' multiple="multiple"' : '' , '>'; foreach ( $field['options'] as $option ) echo '<option value="' . $option['value'] . '"' , is_array( $meta ) && in_array( $option['value'], $meta ) ? ' selected="selected"' : '' , ' >' . $option['label'] . '</option>'; echo '</select><br />' . $field['desc']; break;