如何将Widget字段数据存储为数组?

时间:2013-04-04 作者:jay

我正在创建一个小部件,它需要存储大约10个ID。现在,我使用以下字段方法将每个ID存储在单独的字段中。它将每个字段的数据分别存储在wordpress中的a中。是否可以使用数组将所有字段的数据存储在wordpress for examlpe的一行中?

<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\']; ?>" 
    />

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

您必须收集多个同名字段,如下所示…

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__ );
    }
}

后端

enter image description here

前端

enter image description here

结束

相关推荐

Plugin options autoloading

在《专业WordPress开发》一书中,我发现了以下技巧:根据经验,如果博客的公共部分需要您的选项,请使用自动加载保存它们。如果只在管理区域需要它们,请保存它们而不自动加载如果所有插件开发人员都遵循这个建议,那么这不会导致后端出现许多额外的SQL查询,从而降低管理方面的速度吗?使用插件选项自动加载的好例子是什么?