このように同じ名前で複数のフィールドを収集する必要があります…
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__ );
}
}
バックエンド
フロントエンド
$instance
あるアレイと、すべての値が含まれています。そして、「すべてのフィールドのデータを1つの行に格納する」とはどういう意味ですか?1つのデータベース行を意味しましたか?