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:
- ¿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.
- 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 desdefoo_widget
y parece funcionar.
Gracias por su información.
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
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
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