2012-09-22 6 views
5

Sto provando a creare un widget personalizzato per il mio plug-in e seguendo the codex.È necessario get_field_id() per il modulo archiviato nell'API di WordPress Widget?

Questo è quello che ho finora. Funziona e salva e visualizza il valore dell'opzione salvata.

<?php 
/** 
* Plugin Name: Sample Widget 
*/ 

$colors = array('red', 'blue', 'yellow'); 
update_option('sample_widget', $colors); 

add_action('widgets_init', create_function('', 'register_widget("Sample_Widget");')); 
class Sample_Widget extends WP_Widget { 

    public function __construct() { 
     parent::__construct(
      'foo_widget', 
      'Sample Widget', 
      array('description' => __('This is a description of the sample widget', 'text_domain'),) // Args 
     ); 
    } 

    public function widget($args, $instance) { 
     extract($args); 
     $title = apply_filters('widget_title', $instance['title']); 
     $color = apply_filters('widget_title', $instance['color']); 

     echo $before_widget; 
     if (! empty($title)) 
      echo $before_title . $title . $after_title; 
     echo 'the selected color is ' . $color . '<br />'; 
     echo $after_widget; 
    } 

    public function update($new_instance, $old_instance) { 
     $instance = array(); 
     $instance['title'] = strip_tags($new_instance['title']); 
     $instance['color'] = $new_instance['color']; 
     return $instance; 
    } 

    public function form($instance) { 
     if (isset($instance[ 'title' ])) { 
      $title = $instance[ 'title' ]; 
     } 
     else { 
      $title = __('New title', 'text_domain'); 
     } 
     if (isset($instance[ 'color' ])) { 
      $selected_color = $instance[ 'color' ]; 
     } 
     $colors = get_option('sample_widget'); 
     ?> 
     <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'); ?>" type="text" value="<?php echo esc_attr($title); ?>" /> 
     </p> 
     <p> 
      <select name="<?php echo $this->get_field_name('color'); ?>" id="<?php echo $this->get_field_id('color'); ?>"> 
       <option value="">Select...</option> 
       <?php foreach($colors as $color) echo '<option value="' . esc_attr($color) . '" ' . ($color == $selected_color ? 'selected="Selected"' : '') . '>'. $color .'</option>'; ?> 
      </select> 
     </p> 
     <?php 
    } 
} 

Ho due domande:

  1. Qual è per? Ho rimosso questa parte della linea e sembra funzionare bene. L'ho inserito per copiare solo il codice di lavoro del codice.
  2. Nel costruttore, il primo parametro in parent::__construct() è un ID di base. Potrebbe essere un valore stringa qualsiasi? L'ho cambiato in qualcos'altro da foo_widget e sembra funzionare.

Grazie per le vostre informazioni.

risposta

3
  1. Il è quello di generare un valore unico 'id' per questa opzione. In genere questo è così l'oggetto può essere manipolato tramite JS.

  2. Il id_base di foo_widget è un ID di root per tutti i widget di questo tipo. È un ID base opzionale per il widget, in lettere minuscole e, se lasciato vuoto, verrà utilizzata una porzione del nome della classe del widget. Deve essere unico. Questo sarà aggiunto a con il numero ID del widget individuo cioè foo_widget-001

Spero che questo ti aiuta!

+0

Per quanto riguarda il numero 1, sembra che sarebbe meglio lasciarlo così com'è. Grazie per il tuo contributo. Per quanto riguarda il n. 2, ho cambiato l'ID di base con qualcos'altro come 'something_else' da' foo_widget' e ho usato il valore stringa 'Sample_Widget' in' create_function ('', 'register_widget ("Sample_Widget");') 'e funziona ancora. Quindi sembra che possano essere valori diversi. Mi sto perdendo qualcosa? – Teno

+0

Sulla base di ciò che so sull'argomento e su una limitata esplorazione del database ... Mi chiedo se questa seconda istanza dell '"ID di base" sia ciò che WordPress usa per creare la tabella del database per memorizzare le informazioni del widget. Se vai alla tabella 'WP_Options' vedrai cose come 'widget_categories' o 'widget_text'. Suppongo che i tuoi widget attivi appaiano come "widget_Sample_Widget" nella base dati? Solo un pensiero – NerdNextDoor

+1

Ho trovato che il valore del parametro per "register_widget()" è il nome esteso della classe personalizzata. Http://codex.wordpress.org/Function_Reference/register_widget Quindi dovrebbe essere una cosa diversa dall'ID di base Quando ho sfogliato la tabella 'wp_options', in effetti ho trovato un elemento chiamato, widget_someting_else', non era 'widget_Sample_Widget'. Quindi, a questo punto, mi sento più sicuro che l'ID di base possa essere una qualsiasi stringa arbitraria all'interno della limitazione della lunghezza del carattere per la tabella delle opzioni.Per quanto ricordo era di massimo 45 caratteri. – Teno

Problemi correlati