จะเก็บข้อมูลฟิลด์วิดเจ็ตเป็นอาร์เรย์ได้อย่างไร?


11

ฉันกำลังสร้างวิดเจ็ตมันต้องเก็บประมาณ 10 ID ตอนนี้ฉันใช้เมธอดฟิลด์ต่อไปนี้เพื่อจัดเก็บแต่ละ ID ในฟิลด์แยก มันเก็บข้อมูลของแต่ละฟิลด์ในแยกใน 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']; ?>" 
    />

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

ถ้าฉันเป็นคนฉลาดอย่างที่คุณคิด ฉันเข้าใจว่าฉันควรจะให้มันบันทึกลงในฐานข้อมูลเป็นฟิลด์ [0] [ราคา] และฟิลด์ [0] [ปลายทาง] เป็นต้น แต่อย่างใดฉันไม่ได้ทำมันถูกต้อง
Aleksandar Đorđević

เป็นไปได้ไหมที่ foo เป็นอาร์เรย์ที่มีคู่คีย์ / ค่า
worldwildwebdev

5

คำตอบข้างต้นเป็นสิ่งที่ดีถ้าคุณต้องการหมายเลขที่จะต้อง ในกรณีของฉันฉันไม่ได้ ฉันมีวิดเจ็ตพร้อมตัวเลือกที่อนุญาตให้ผู้ใช้เลือกจำนวนหมวดหมู่ที่จะใช้ภายในวิดเจ็ต

วิดเจ็ต

formนี่คือเครื่องมือของฉัน - สามสิ่งสำคัญที่นี่

  1. ตรวจสอบให้แน่ใจว่าได้ตั้งค่าเป็นค่าว่างarray()หากไม่ได้ตั้งค่าของวิดเจ็ต
  2. ใน<label> nameแอตทริบิวต์แบบฟอร์มแจ้งให้ทราบว่าฉันแนบ[]ท้าย สิ่งนี้บอก 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
}

และนี่คือฟังก์ชั่นอัพเดทของฉัน

ฉันสนใจที่จะบันทึกรหัสหมวดหมู่ในอาร์เรย์ซึ่งเป็นตัวเลขดังนั้นฉันจึงใช้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 นี้ หากคุณมีคำถามใด ๆ ฉันยินดีที่จะอธิบายอย่างละเอียด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.