위젯 필드 데이터를 배열로 저장하는 방법?


11

위젯을 만들고 있는데 약 10 개의 ID를 저장해야합니다. 지금은 다음 필드 방법을 사용하여 각 ID를 별도의 필드에 저장합니다. 워드 프레스에서 각 필드의 데이터를 별도로 저장합니다. 배열을 사용하여 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
$instance 배열의 모든 값을 포함한다. 그리고 '모든 필드의 데이터를 한 행에 저장하는 것'은 무엇을 의미합니까? 하나의 데이터베이스 행을 의미 했습니까?
Ralf912

답변:


8

같은 이름으로 여러 필드를 수집해야합니다.

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

백엔드

여기에 이미지 설명을 입력하십시오

프론트 엔드

여기에 이미지 설명을 입력하십시오


+1 매우 우아한 printf구문

여러 필드에 대한 훌륭한 답변이지만 2 필드를 연속으로 업데이트 할 수 있습니까? 나는 이것을 내 위젯에서 사용하려고하지만 가격 / 목적지와 같은 행에 2 개의 필드가 필요하지만 그것을 얻는 방법을 알 수는 없지만 항상 어떤 종류의 오류가 발생합니다.
Aleksandar Đorđević

@ AleksandarĐorđević 그냥 HTML을 작성 class="widefat"하고 필드 에는 사용하지 마십시오 .
fuxia

내가 생각하는대로 똑똑하다면 데이터베이스에 field [0] [price] 및 field [0] [destination] 등으로 저장해야한다는 것을 알고 있습니다. 하지만 어떻게 든 제대로하지 못했습니다.
Aleksandar Đorđević

foo가 키 / 값 쌍을 갖는 배열이 될 수 있습니까?
worldwildwebdev

5

필드에 번호를 매기려면 위의 대답이 좋습니다. 제 경우에는 그렇지 않았습니다. 사용자가 위젯 내에서 사용할 범주를 원하는 수만큼 선택할 수있는 옵션이있는 위젯이 있습니다.

위젯

여기 내 위젯이 form있습니다. — 여기서 중요한 세 가지

  1. array()위젯 값이 설정되지 않은 경우 기본값을 빈 값으로 설정하십시오
  2. 양식 <label> name속성 []에서 끝에 a 를 첨부합니다 . 이것은 PHP 에게이 키에 대한 값의 배열을 제출하고 있음을 알려줍니다.
  3. 라벨의 확인란을로 포장합니다 <label><input type="checkbox" ...></label>. - 우리의 체크 박스의 각각은 고유 한 필요가 없습니다 id그렇게, 속성을 <label> for속성이 작동하지 않습니다. 고유 ID를 생성 할 수는 있지만 번거 롭습니다. 입력 주위 에 레이블을 감싸면 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
}

그리고 여기 내 업데이트 기능이 있습니다

내가 사용하는, 그래서 나는, 숫자 배열의 카테고리 ID를 절약에 관심 array_mapintval제출 된 모든 자료가 유효한 정수인지 확인 할 수 있습니다. 또한 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']
  );
}

이 워드 프레스에 대해 설명하기가 특히 어렵습니다. 궁금한 점이 있으면 자세히 알려 드리겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.