Intereting Posts
Как отображать статьи в соответствии с выбранными пользователями параметрами? Фильтр wptexturize не работает на старых заголовках сообщений Добавление содержимого в архивные и таксономические страницы для пользовательских типов сообщений? Ссылка на полноразмерное изображение или страницу вложения в фото тему Попытка получить свойство ошибки, отличной от объекта, используя get_post_meta () Получить несколько ролей с помощью get_users Добавление виджетов программно: как избежать столкновений? Связывание страниц с неправильной ссылкой на производственную среду Последние комментарии только от моих блогов Faulty comment.php, комментарии не появятся после публикации? Объединить 2 разных пользовательских пули в одну постоянную ссылку? Только плагин добавляет действия в wp_head & wp_footer на отдельные сообщения Отправить комментарий через JSON с Android-устройства Невозможно переписать постоянные ссылки для пользовательской таксономии и типа сообщения, получить 404s. Использование плагина включить любой плагин в другой плагин или использовать другой плагин в другом

Как сохранить повторяющиеся поля с одним значением внутри массива?

Представьте, что я сейчас работаю над плагином слайдера, чтобы узнать много PHP и WordPress. Я создал некоторое повторяющееся поле с javascript.

Некоторые функциональные детали:

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

Проблема: я написал эту тему, потому что у меня есть некоторые проблемы с сохранением значений из одной переменной в массиве.

Когда я сохраню сообщение или страницу, первое поле будет перезаписано. Это связано с тем, что я просматриваю одно изображение и одну подпись, а не через переменную $_POST .

Вопрос: Мой вопрос заключается в том, как я могу решить эту проблему? Я также посмотрел исходный код, который @brasofilo рекомендовал в Github-Gist . Брашофило использовал только одну мета, но я хотел бы использовать многомерный массив для создания моих полей. И сохраните значения в одной строке в базе данных как массив.

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

Скрипт PHP:

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

 <?php // Add meta box support // This registers a function to be called when the WordPress admin interface is visited add_action("admin_init", "dsslider_manager_add_meta"); function dsslider_manager_add_meta(){ // Create this cool new meta box for Portfolio Options add_meta_box("dsslider-meta", "Brandbox Options", "dsslider_manager_meta_options", "brandbox-slider", "normal", "high"); } // Create the fields array $prefix = 'dsmeta_'; $custom_meta_fields = array( array( 'label' => 'Image', 'desc' => '', 'id' => $prefix . 'image', 'type' => 'image', 'repeatable' => true, ), array( 'label' => 'Image caption', 'desc' => '', 'id' => $prefix . 'image_caption', 'type' => 'text', 'repeatable' => true, ) ); // Callback unctions for setting up Brandbox Options function dsslider_manager_meta_options(){ global $custom_meta_fields, $post; if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) // (integer) (optional) The post ID whose custom fields will be retrieved. // Default: Current post return $post_id; echo '<div class="dsslider_manager_extras">'; // Markup for table head echo '<table class="meta ds-input-table">'; echo '<tbody class="ui-sortable">'; // Use nonce for verification echo '<input type="hidden" name="dsmeta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />'; // Begin a table row echo '<tr class="row" id="repeatable-[0]">'; echo '<td class="order">1</td>'; foreach ($custom_meta_fields as $field) { // Get value of this field if it exists for this post $meta = get_post_meta($post->ID, $field['id'], true); $type = $field['type']; // Each $meta in an table data echo '<td>'; // Check if value repeatable is set if ($field['repeatable']) { switch ($type) { // Image case case 'image': $image = get_template_directory_uri() . '/assets/images/default.jpg'; // Default image for the preview echo '<span class="default_image" style="display:none">' . $image . '</span>'; // If $meta == (equal to) true if ($meta) { $image = wp_get_attachment_image_src($meta, 'thumbnail'); $image = $image[0]; // Get the first key of the array - url } // End if echo '<input type="hidden" name="' . $field['id'] . '" class="upload_image" value="' . $meta . '" />'; // Save the image ID echo '<img src="' . esc_attr( $image ) . '" alt="" class="preview_image" />'; // Preview uploaded image echo '<input type="button" class="button add-image" value="Add image" rel="' . get_the_ID() . '" />'; // Add image echo '<small><a href="#" class="remove-image">Remove image</a></small>'; // Delete image break; // Text case case 'text': echo '<input type="text" name="' . $field['id'] . '[]' . '" id="' . $field['id'] . '" value="' . $meta . '" size="30" /> '; break; } // End switch statement } // End if echo '</td>'; } // End foreach loop echo '<td class="remove"><a class="repeatable-remove button" href="#">-</a></td>'; echo '</tr>'; // End .row echo '</tbody>'; // End tbody echo '</table>'; // End tbody echo '<ul class="hl clearfix ds-repeater-footer"><li class="right">'; echo '<a href="#" class="repeatable-add ds-button">Add New Slide</a>'; echo '</li></ul>'; echo '</div>'; // End .dsslider_manager_extras } // Save the data add_action('save_post', 'dsslider_manager_save_extras'); function dsslider_manager_save_extras($post_id) { global $custom_meta_fields; // Check autosave function if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; } // End if statement // Check permissions if ('page' == 'post_type') { if (!current_user_can('edit_page', $post_id)) { return $post_id; } elseif (!current_user_can('edit_post', $post_id)) { return $post_id; } } // End if statement // Loop through fields and save the data foreach ($custom_meta_fields as $field) { if (isset($_POST[$field['id']])) { $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); } } // End if statement } // End foreach loop } 

Solutions Collecting From Web of "Как сохранить повторяющиеся поля с одним значением внутри массива?"

Вы сохраняете только одно изображение и одно изображение. Ваша петля в функции dsslider_manager_save_extras выполняет циклические глобальные $ custom_meta_fields, определенные в php-файле. Не через переменную $ _POST. Ваша петля должна выглядеть примерно так:

 foreach ( $_POST['fields'] as $field ) { ... } 

В HTML форма должна выглядеть так:

 <input type="hidden" name="fields[$field[ID]]" value=""/> 

Вы можете прочитать больше на эту тему здесь: https://stackoverflow.com/questions/2433727/submitting-a-multidimensional-array-via-post-with-php

Если ваша форма выглядит примерно так:

 <input type="text" name="fields[0]['image']" value="" /> <input type="text" name="fields[0]['caption']" value="" /> 

И повторяется путем увеличения индекса:

 <input type="text" name="fields[1]['image']" value="" /> <input type="text" name="fields[1]['caption']" value="" /> 

Тогда то, что вы получите позже, выглядит примерно так:

 $_POST['fields'] = array( 0 => array( 'image' => (value here) 'caption' => (value here) ), 1 => array( 'image' => (value here) 'caption' => (value here) ) ); 

Затем в save_post вы можете проверить, есть ли:

 isset($_POST['fields']) && is_array($_POST['fields']) && !empty($_POST['fields']) 

Затем вы можете перебирать ваши $custom_meta_fields в цикле while:

 $index = 0; $slides = array(); while(isset($_POST['fields'][$index])) { foreach($custom_meta_fields as $custom_meta_field) { // check if isset($_POST['fields'][$index][$custom_meta_fields['id']]) // and anything else you want to validate // and then save field in $slides[$index][$custom_meta_fields['id']] } $index++; } 

После того, как вы проверили все стороны, вы можете сохранить их в одном поле параметра:

 update_post_meta($post_id, $option_name, $slides); 

Кстати, с точки зрения $ _POST ['fields'] вы можете настроить свой массив следующим образом:

 $custom_meta_fields = array( 'slides' => array( array( 'label' => 'Image', 'desc' => '', 'id' => $prefix . 'image', 'type' => 'image', 'repeatable' => true, ), array( 'label' => 'Image caption', 'desc' => '', 'id' => $prefix . 'image_caption', 'type' => 'text', 'repeatable' => true, ) ) ); 

Тогда вы все еще можете зацикливаться.