2012-09-22 11 views
5

Estoy tratando de crear un widget personalizado para mi complemento y siguiendo the codex.¿Es get_field_id() Necesario para el formulario archivado en WordPress Widget API?

Esto es lo que tengo hasta ahora. Está funcionando y guarda y muestra el valor de la opción guardada.

<?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 
    } 
} 

Tengo dos preguntas:

  1. ¿Qué es para? Eliminé esta parte de la línea y parece funcionar bien. Lo puse para copiar el código de trabajo del código.
  2. En el constructor, el primer parámetro en parent::__construct() es una ID de base. ¿Podría ser este algún valor de cadena? Lo cambié a algo más desde foo_widget y parece funcionar.

Gracias por su información.

Respuesta

3
  1. El genera un valor 'id' único para esta opción. Normalmente esto es para que el objeto pueda ser manipulado a través de JS.

  2. La id_base de foo_widget es una Identificación de raíz para todos los widgets de este tipo. Es una ID de base opcional para el widget, en minúsculas, y si se deja en blanco, se usará una parte del nombre de clase del widget. Tiene que ser único. Esto se añade al número de identificación del widget individuo es decir, foo_widget-001

Espero que esto ayude!

+0

En cuanto al n. ° 1, parece que será mejor que lo deje como está. Gracias por tu contribución. En cuanto al # 2, cambié el ID base a algo más como 'something_else' de' foo_widget' y usé el valor de cadena 'Sample_Widget' en' create_function ('', 'register_widget ("Sample_Widget");') 'y todavía funciona. Entonces parece que pueden ser valores diferentes. ¿Me estoy perdiendo de algo? – Teno

+0

Basándome en lo que sé sobre el tema y en una navegación de base de datos limitada ... Me pregunto si esta segunda instancia de la 'base ID' es lo que WordPress usa para crear la tabla de la base de datos para almacenar la información del widget. Si vas a la tabla 'WP_Options' verás cosas como 'widget_categories' o 'widget_text'. Supongo que sus widgets activos aparecerán como "widget_Sample_Widget" en la base de datos. Solo un pensamiento – NerdNextDoor

+1

Encontré que el valor del parámetro para 'register_widget()' es el nombre de clase personalizado ampliado. Http://codex.wordpress.org/Function_Reference/register_widget Así que debería ser una cosa diferente de la base ID. Cuando navegué por la tabla 'wp_options', de hecho encontré un elemento llamado,' widget_someting_else'; no era 'widget_Sample_Widget'. Así que en este punto, siento más seguro de que la ID base puede ser cualquier cadena arbitraria dentro de la limitación de longitud de caracteres para la tabla de opciones. Hasta donde recuerdo, tenía hasta 45 caracteres. – Teno

Cuestiones relacionadas