Widget alanları verilerini dizi olarak nasıl saklayabilirim?


11

Bir widget oluşturuyorum, yaklaşık 10 kimlik saklaması gerekiyor. Şu anda her bir kimliği ayrı bir alanda saklamak için aşağıdaki alan yöntemini kullanıyorum. Her alanın verilerini wordpress'te ayrı olarak saklar. Bir dizi kullanarak examlpe için tüm alanların verilerini wordpress'te tek bir satırda saklamak mümkün müdür?

<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 olduğu bir dizi ve tüm değerleri içerir. Ve 'tüm alanların verilerini tek bir satırda saklamak' ile ne demek istiyorsun? Şunu mu demek istediniz: bir database row?
Ralf912

Yanıtlar:


8

Bunun gibi aynı ad altında birden çok alan toplamak zorundasınız ...

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

… Ve widget mantığınızı buna göre ayarlayın.

İşte çok basit bir demo widget'ı:

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

Arka uç

resim açıklamasını buraya girin

Başlangıç ​​aşaması

resim açıklamasını buraya girin


+1 Çok zarif printfsözdizimi

Birden çok alanda harika yanıt, ancak arka arkaya 2 alanın olmasıyla ilgili bazı güncellemeler mümkün mü? i benim widget üzerinde kullanmaya çalışıyorum ama fiyat / hedef gibi bir satırda 2 alan olması gerekiyor, ama nasıl almak anlayamıyorum, ben her zaman hata bir tür olsun.
Aleksandar Đorđević

@ AleksandarĐorđević Bunun için HTML'yi class="widefat"yazın ve alanlar için kullanmayın .
fuxia

Eğer düşündüğün kadar akıllıysam. Ben alan [0] [fiyat] ve alan [0] [hedef] gibi veritabanında kaydetmek için almak gerekiyordu anlıyorum? ama bir şekilde doğru yapamıyorum.
Aleksandar Đorđević

Anahtar / değer çiftlerine sahip bir dizi olmak foo mümkün mü?
worldwildwebdev

5

Alanların numaralandırılması gerekiyorsa yukarıdaki yanıt iyidir. Benim durumumda, yapmadım. Kullanıcı widget içinde kullanılacak herhangi bir sayıda kategori seçmek için izin seçenekleri ile bir widget var.

Araç

İşte widget'ım form. - Burada üç önemli şey var

  1. array()Widget'ın değeri ayarlanmamışsa , değeri varsayılan olarak boş olarak ayarladığınızdan emin olun
  2. Form <label> nameözniteliğinde, []sonunda bir eklediğime dikkat edin . Bu PHP'ye bu anahtar için bir dizi değer gönderdiğimi söyler
  3. Onay kutusunu etikete sarın <label><input type="checkbox" ...></label>. - Bizim onay kutularını her biri benzersiz olmaz idbu yüzden, niteliği <label> forözniteliği çalışma olmaz. Benzersiz kimlikler oluşturabiliriz, ancak bu bir güçlük. Etiketi yalnızca girişin etrafına sararsanız, etiket for+id

Şimdi kod

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
}

İşte güncelleme fonksiyonum

Kullandığım yüzden sayılardır dizideki Kategorisi Kimlikleri, tasarruf ilgilenen kulüpler array_mapile intvalgönderilen tüm veri geçerli tamsayı olmasını sağlamak için. Ayrıca, array_filtergeçersiz gönderimleri kaldırmak için kullanın .

// @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']
  );
}

Bu WordPress öğelerini tanımlamak özellikle zor. Herhangi bir sorunuz varsa, ayrıntılı bilgi vermekten memnuniyet duyarım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.