Come archiviare i dati dei campi widget come un array?


11

Sto creando un widget, deve memorizzare circa 10 ID. In questo momento sto usando il seguente metodo di campo per memorizzare ciascuno degli ID in un campo separato. Memorizza i dati di ciascun campo in modo separato nel wordpress. È possibile memorizzare i dati di tutti i campi in una sola riga in wordpress per l'esame usando un array?

<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 è un array e contiene tutti i valori. E cosa intendi con 'per memorizzare i dati di tutti i campi in una sola riga'? Intendevi una riga del database?
Ralf912,

Risposte:


8

Devi raccogliere più campi con lo stesso nome come questo ...

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

... e regola la logica del tuo widget su questo.

Ecco un widget demo molto semplice:

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

backend

inserisci qui la descrizione dell'immagine

Fine frontale

inserisci qui la descrizione dell'immagine


+1 printfSintassi molto elegante

Ottima risposta su più campi, ma è possibile qualche aggiornamento sull'avere 2 campi di fila? Sto cercando di usarlo sul mio widget ma devo avere 2 campi di seguito come prezzo / destinazione, ma non riesco a capire come ottenerlo, ricevo sempre un qualche tipo di errore.
Aleksandar Đorđević,

@ AleksandarĐorđević Basta scrivere l'HTML per questo e non utilizzarlo class="widefat"per i campi.
fuxia

Se sono solo intelligente come pensi. Capisco che dovrei farlo salvare nel database come campo [0] [prezzo] e campo [0] [destinazione] e così via? ma in qualche modo non riesco a farlo bene.
Aleksandar Đorđević,

È possibile essere un array con coppie chiave / valore?
worldwildwebdev,

5

La risposta sopra è buona se hai bisogno di numerare i campi. Nel mio caso, non l'ho fatto. Ho un widget con opzioni che consentono all'utente di selezionare qualsiasi numero di categorie da utilizzare all'interno del widget.

aggeggio

Ecco il mio widget form. - Tre cose importanti qui

  1. Assicurarsi che il valore predefinito sia vuoto array()se il valore del widget non è impostato
  2. Nell'attributo form <label> name, nota che allego un []alla fine. Questo dice a PHP che sto inviando una matrice di valori per questa chiave
  3. Avvolgere la casella di controllo nell'etichetta come <label><input type="checkbox" ...></label>. - Ognuna delle nostre caselle di controllo non avrà un idattributo univoco , quindi l' <label> forattributo non funzionerà. Potremmo generare ID univoci, ma questa è una seccatura. Se si avvolge semplicemente l'etichetta attorno all'input, l'etichetta viene associata correttamente senza il fastidio di collegare il for+id

Ora il codice

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
}

Ed ecco la mia funzione di aggiornamento

Sono interessato a salvare gli ID categoria in un array, che sono numeri, quindi uso array_mapcon intvalper garantire che tutti i dati inviati siano numeri interi validi. Inoltre, utilizzo array_filterper rimuovere eventuali invii non validi.

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

È particolarmente difficile descrivere queste cose di WordPress. Se avete domande, sarò felice di elaborare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.