Intereting Posts
API настройки WordPress. В options.php нет поля. Добавить столбец мультимедиа для редактирования экрана сообщения Включите jQuery (или что-нибудь) внутри тега <head> панели Custom Options Создание отдельных страниц для профилей авторов и списков сообщений автором Изображения, не отображаемые после перемещения сайта Facebook og: проблемы с изображением после изменения https Как использовать шаблон пользовательских комментариев Черри-рамки – функция переопределения в шаблоне general.php Разрешить редакторам переключаться на сайты (Multisite) Добавление полей в приложение – отображается только при вставке новых вложений Изменение вывода настраиваемого цикла с использованием WP_query Где находится содержимое WP_Head Является ли уязвимость wp_nonce_field уязвимой, если вы знаете имя действия? Показывать только предстоящие события или текущие события Установка и обновление плагинов при установке VPS WordPress

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

Я создаю виджет, он должен хранить около 10 идентификаторов. Сейчас я использую следующий метод поля для хранения каждого идентификатора в отдельном поле. Он хранит данные каждого поля отдельно в wordpress. Можно ли хранить данные всех полей только в одной строке в wordpress для примера с использованием массива?

<input class="widefat" id="<?php echo $this->get_field_id('item1_id'); ?>" name="<?php echo $this->get_field_name('item1_id'); ?>" value="<?php echo $instance['item1_id']; ?>" /> <input class="widefat" id="<?php echo $this->get_field_id('item2_id'); ?>" name="<?php echo $this->get_field_name('item2_id'); ?>" value="<?php echo $instance['item2_id']; ?>" /> 

Вам нужно собрать несколько полей под тем же именем, что и …

 name="collect[1]" name="collect[2]" 

… и настроить логику виджета на это.

Вот очень простой демонстрационный виджет:

 <?php # -*- coding: utf-8 -*- /* Plugin Name: Store Options as array */ add_action( 'widgets_init', array ( 'T5_Array_Options_Widget', 'register' ) ); class T5_Array_Options_Widget extends WP_Widget { /** * Constructor. */ public function __construct() { parent::__construct( strtolower( __CLASS__ ), 'Array Demo' ); } /** * Echo the settings update form * * @param array $instance Current settings */ public function form( $instance ) { $title = isset ( $instance['title'] ) ? $instance['title'] : ''; $title = esc_attr( $title ); printf( '<p><label for="%1$s">%2$s</label><br /> <input type="text" name="%3$s" id="%1$s" value="%4$s" class="widefat"></p>', $this->get_field_id( 'title' ), 'Title', $this->get_field_name( 'title' ), $title ); $fields = isset ( $instance['fields'] ) ? $instance['fields'] : array(); $field_num = count( $fields ); $fields[ $field_num + 1 ] = ''; $fields_html = array(); $fields_counter = 0; foreach ( $fields as $name => $value ) { $fields_html[] = sprintf( '<input type="text" name="%1$s[%2$s]" value="%3$s" class="widefat">', $this->get_field_name( 'fields' ), $fields_counter, esc_attr( $value ) ); $fields_counter += 1; } print 'Fields<br />' . join( '<br />', $fields_html ); } /** * Renders the output. * * @see WP_Widget::widget() */ public function widget( $args, $instance ) { print $args['before_widget'] . $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ) . $args['after_title'] . join( '<br />', $instance['fields'] ) . $args['after_widget']; } /** * Prepares the content. Not. * * @param array $new_instance New content * @param array $old_instance Old content * @return array New content */ public function update( $new_instance, $old_instance ) { $instance = $old_instance; $instance['title'] = esc_html( $new_instance['title'] ); $instance['fields'] = array(); if ( isset ( $new_instance['fields'] ) ) { foreach ( $new_instance['fields'] as $value ) { if ( '' !== trim( $value ) ) $instance['fields'][] = $value; } } return $instance; } /** * Tell WP we want to use this widget. * * @wp-hook widgets_init * @return void */ public static function register() { register_widget( __CLASS__ ); } } 

Backend

введите описание изображения здесь

Внешний интерфейс

введите описание изображения здесь

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

виджет

Вот моя form виджетов. – Три важных момента здесь

  1. Убедитесь, что значение по умолчанию для пустого array() если значение виджета не установлено
  2. В атрибуте name <label> name обратите внимание, что я прикрепляю [] в конце. Это говорит PHP, что я представляю массив значений для этого ключа
  3. Установите флажок в метке как <label><input type="checkbox" ...></label> . – У каждого из наших флажков не будет атрибута уникального id , поэтому атрибут <label> for не будет работать. Мы могли бы генерировать уникальные идентификаторы, но это хлопот. Если вы просто нанесете ярлык вокруг ввода, метка будет соответствующим образом связана без хлопот подключения for + id

Теперь код

 public function form($instance) { $title = isset($instance['title']) ? $instance['title'] : ''; $categories = isset($instance['categories']) ? $instance['categories'] : array(); ?> <p> <label for="<?php echo $this->get_field_id('title') ?>"> <?php _e( 'Title:' ) ?> </label> <input class="widefat" id="<?php echo $this->get_field_id('title') ?>" name="<?php echo $this->get_field_name('title') ?>" value="<?php echo $title ?>" /> </p> <p>Categories</p> <ul> <?php foreach (\get_categories() as $category): ?> <li> <label> <input type="checkbox" class="checkbox" name="<?php echo $this->get_field_name('categories') ?>[]" value="<?php echo $category->cat_ID ?>" <?php checked(in_array($category->cat_ID, $categories)) ?> /> <?php echo $category->name ?> </label> </li> <?php endforeach ?> </ul> <?php } 

И вот моя функция обновления

Я заинтересован в сохранении идентификаторов категорий в массиве, которые являются числами, поэтому я использую array_map с intval чтобы гарантировать, что все представленные данные являются действительными целыми числами. Кроме того, я использую array_filter для удаления любых недопустимых представлений.

 // @param array $a - the new instance options // @param arram $b - the old instance options public function update($a, $b) { return array( 'title' => isset($a['title']) ? strip_tags($a['title']) : $b['title'], 'categories' => isset($a['categories']) ? array_filter(array_map(function($id) { return intval($id); }, (array) $a['categories'])) : (array) $b['title'] ); } 

Особенно сложно описать этот материал WordPress. Если у вас возникнут вопросы, я буду рад разработать.