Cuando comencé esta respuesta, debería ser solo una pequeña nota. Bueno, fallé. ¡Lo siento! Quédate conmigo, hay un regalo escondido en el fondo ...
Cómo se almacenan los widgets de WordPress
La lista de widgets se almacena en una opción llamada 'sidebars_widgets'
. Un var_export()
puede dar algo como lo siguiente:
array (
'wp_inactive_widgets' =>
array (
),
'top-widget' =>
array (
),
'bottom-widget' =>
array (
),
'array_version' => 3,
)
Ignora 'wp_inactive_widgets'
y 'array_version'
. No tenemos que preocuparnos por eso.
Las otras claves son identificador para barras laterales registradas. En este caso, las barras laterales pueden haberse registrado con este código:
// Register two sidebars.
$sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
'name' => $sidebar,
'id' => $sidebar,
'before_widget' => '',
'after_widget' => ''
)
);
}
Por defecto, las barras laterales están vacías después del registro. Por supuesto.
Para cada clase de widget registrada se crea una opción separada, que contiene todas las opciones necesarias. La opción está prefijada por la cadena widget_
. Para obtener las opciones para todos los widgets RSS activos, tenemos que examinar ...
get_option( 'widget_rss' );
Salida posible:
array (
2 =>
array (
'title' => 'WordPress Stack Exchange',
'url' => 'http://wordpress.stackexchange.com/feeds',
'link' => 'http://wordpress.stackexchange.com/questions',
'items' => 5,
'show_summary' => 1,
'show_author' => 0,
'show_date' => 0,
),
)
Anote el número 2 . Los argumentos para múltiples instancias se almacenan en esta opción ordenada por números.
Para ver qué clases de widgets ya se conocen en WordPress, vaya a wp-admin/options.php
y desplácese hacia abajo hasta que vea algo como esto:

Sí,datosserializados.No,nopuedesleerlosaquí.Notepreocupes,notienesquehacerlo.
Unwidgetdedemostración
Parailustrarmejorelfuncionamientointerno,heescritounwidgetdedemostraciónmuysimple:
/***Supersimplewidget.*/classT5_Demo_WidgetextendsWP_Widget{publicfunction__construct(){//id_base,visiblenameparent::__construct('t5_demo_widget','T5DemoWidget');}publicfunctionwidget($args,$instance){echo$args['before_widget'],wpautop($instance['text']),$args['after_widget'];}publicfunctionform($instance){$text=isset($instance['text'])?esc_textarea($instance['text']):'';printf('<textareaclass="widefat" rows="7" cols="20" id="%1$s" name="%2$s">%3$s</textarea>',
$this->get_field_id( 'text' ),
$this->get_field_name( 'text' ),
$text
);
}
}
Tenga en cuenta que el constructor: 't5_demo_widget'
es el $id_base
, el identificador de este widget. Como puede ver en la captura de pantalla, sus argumentos se almacenan en la opción widget_t5_demo_widget
. Todos tus widgets personalizados serán tratados así. No tienes que adivinar el nombre. Y como usted ha escrito sus widgets (probablemente) conoce todos los argumentos de los parámetros ' $instance
de su clase'.
Elementos básicos del tema
Primero tienes que registrar algunas barras laterales y el widget personalizado. La acción correcta para esto es fácil de recordar: 'widgets_init'
. Pon todo en un contenedor, una clase o una función. Para simplificar, usaré una función llamada t5_default_widget_demo()
.
Todo el siguiente código entra en el functions.php
. La clase T5_Demo_Widget
ya debería estar cargada. Acabo de ponerlo en el mismo archivo ...
add_action( 'widgets_init', 't5_default_widget_demo' );
function t5_default_widget_demo()
{
// Register our own widget.
register_widget( 'T5_Demo_Widget' );
// Register two sidebars.
$sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
'name' => $sidebar,
'id' => $sidebar,
'before_widget' => '',
'after_widget' => ''
)
);
}
Hasta ahora, tan simple. Nuestro tema ahora está listo para el widget, el widget de demostración es conocido. Ahora la diversión.
$active_widgets = get_option( 'sidebars_widgets' );
if ( ! empty ( $active_widgets[ $sidebars['a'] ] )
or ! empty ( $active_widgets[ $sidebars['b'] ] )
)
{ // Okay, no fun anymore. There is already some content.
return;
}
Realmente no quieres destruir la configuración del usuario. Si ya hay algo de contenido en las barras laterales, su código no debería ejecutarse sobre él. Por eso nos detenemos en este caso.
Bien, asumimos que las barras laterales están vacías ... necesitamos un contador:
$counter = 1;
Los widgets están numerados . Estos números son segundos identificadores para WordPress.
Hagamos que la matriz lo cambie:
$active_widgets = get_option( 'sidebars_widgets' );
También necesitamos un contador (más sobre esto más adelante):
$counter = 1;
Y aquí es cómo usamos el contador, los nombres de la barra lateral y los argumentos del widget (bueno, tenemos un solo argumento: text
).
// Add a 'demo' widget to the top sidebar …
$active_widgets[ $sidebars['a'] ][0] = 't5_demo_widget-' . $counter;
// … and write some text into it:
$demo_widget_content[ $counter ] = array ( 'text' => "This works!\n\nAmazing!" );
$counter++;
Observe cómo se crea el identificador del widget: el id_base
, un menos -
y el contador. El contenido del widget se almacena en otra variable $demo_widget_content
. Aquí está el contador, la tecla y los argumentos del widget se almacenan en una matriz.
Incrementamos el contador en uno cuando terminamos para evitar colisiones.
Eso fue fácil. Ahora un widget de RSS. ¡Más campos, más diversión!
$active_widgets[ $sidebars['a'] ][] = 'rss-' . $counter;
// The latest 15 questions from WordPress Stack Exchange.
$rss_content[ $counter ] = array (
'title' => 'WordPress Stack Exchange',
'url' => 'http://wordpress.stackexchange.com/feeds',
'link' => 'http://wordpress.stackexchange.com/questions',
'items' => 15,
'show_summary' => 0,
'show_author' => 1,
'show_date' => 1,
);
update_option( 'widget_rss', $rss_content );
$counter++;
Aquí hay algo nuevo: update_option()
esto almacenará el argumento del widget RSS en una opción separada. WordPress los encontrará automáticamente más tarde.
No guardamos los argumentos del widget de demostración porque ahora agregamos una segunda instancia a nuestra segunda barra lateral ...
// Okay, now to our second sidebar. We make it short.
$active_widgets[ $sidebars['b'] ][] = 't5_demo_widget-' . $counter;
#$demo_widget_content = get_option( 'widget_t5_demo_widget', array() );
$demo_widget_content[ $counter ] = array ( 'text' => 'The second instance of our amazing demo widget.' );
update_option( 'widget_t5_demo_widget', $demo_widget_content );
... y guarda todos los argumentos para el t5_demo_widget
de una vez. No es necesario actualizar la misma opción dos veces.
Bueno, suficientes widgets para hoy, también guardemos sidebars_widgets
:
update_option( 'sidebars_widgets', $active_widgets );
Ahora, WordPress sabrá que hay algunos widgets registrados y dónde se almacenan los argumentos para cada widget. Un var_export()
en el sidebar_widgets se verá así:
array (
'wp_inactive_widgets' =>
array (
),
'top-widget' =>
array (
0 => 't5_demo_widget-1',
1 => 'rss-2',
),
'bottom-widget' =>
array (
0 => 't5_demo_widget-3',
),
'array_version' => 3,
)
El completo < a href="https://github.com/toscho/T5-Default-Widget-Demo" title="Realmente espero que Chip Bennett nunca vea esto. Violé todos los requisitos de temas conocidos."> código de nuevo :
add_action( 'widgets_init', 't5_default_widget_demo' );
function t5_default_widget_demo()
{
// Register our own widget.
register_widget( 'T5_Demo_Widget' );
// Register two sidebars.
$sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
'name' => $sidebar,
'id' => $sidebar,
'before_widget' => '',
'after_widget' => ''
)
);
}
// Okay, now the funny part.
// We don't want to undo user changes, so we look for changes first.
$active_widgets = get_option( 'sidebars_widgets' );
if ( ! empty ( $active_widgets[ $sidebars['a'] ] )
or ! empty ( $active_widgets[ $sidebars['b'] ] )
)
{ // Okay, no fun anymore. There is already some content.
return;
}
// The sidebars are empty, let's put something into them.
// How about a RSS widget and two instances of our demo widget?
// Note that widgets are numbered. We need a counter:
$counter = 1;
// Add a 'demo' widget to the top sidebar …
$active_widgets[ $sidebars['a'] ][0] = 't5_demo_widget-' . $counter;
// … and write some text into it:
$demo_widget_content[ $counter ] = array ( 'text' => "This works!\n\nAmazing!" );
#update_option( 'widget_t5_demo_widget', $demo_widget_content );
$counter++;
// That was easy. Now a RSS widget. More fields, more fun!
$active_widgets[ $sidebars['a'] ][] = 'rss-' . $counter;
// The latest 15 questions from WordPress Stack Exchange.
$rss_content[ $counter ] = array (
'title' => 'WordPress Stack Exchange',
'url' => 'http://wordpress.stackexchange.com/feeds',
'link' => 'http://wordpress.stackexchange.com/questions',
'items' => 15,
'show_summary' => 0,
'show_author' => 1,
'show_date' => 1,
);
update_option( 'widget_rss', $rss_content );
$counter++;
// Okay, now to our second sidebar. We make it short.
$active_widgets[ $sidebars['b'] ][] = 't5_demo_widget-' . $counter;
#$demo_widget_content = get_option( 'widget_t5_demo_widget', array() );
$demo_widget_content[ $counter ] = array ( 'text' => 'The second instance of our amazing demo widget.' );
update_option( 'widget_t5_demo_widget', $demo_widget_content );
// Now save the $active_widgets array.
update_option( 'sidebars_widgets', $active_widgets );
}
Si vas a wp-admin/widgets.php
ahora verás tres widgets preestablecidos:
Y eso es todo. Utilizar ...
dynamic_sidebar( 'top-widget' );
dynamic_sidebar( 'bottom-widget' );
... para imprimir los widgets.
Hay una pequeña falla: debe cargar el extremo frontal dos veces para el registro inicial. Si alguien puede ayudar, estaré muy agradecido.