Me gustaría agregar mediante programación widgets a mis dos barras laterales que tengo. ¿No pude encontrar ninguna forma oficial de hacerlo?
Empecé a buscar en la base de datos. Descubrí que es la opción 'sidebars_widgets' que pone widgets en las barras laterales. Al mirar las opciones, los nombres de los widgets tienen un número agregado al final como: widget_name-6. ¿De dónde viene ese número?
Alguna idea de como arreglar esto?
Respuestas:
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'
. Avar_export()
puede dar algo como lo siguiente:Ignorar
'wp_inactive_widgets'
y'array_version'
. No tenemos que preocuparnos por eso.Las otras claves son identificativas para las barras laterales registradas. En este caso, las barras laterales pueden haberse registrado con este código:
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á precedida por la cadena
widget_
. Para obtener las opciones para todos los widgets RSS activos, tenemos que buscar ...Salida posible:
Tenga en cuenta el número 2 . Los argumentos para las instancias múltiples se almacenan en esta única opción ordenada por números.
Para ver qué clases de widgets ya son conocidas por WordPress, vaya
wp-admin/options.php
y desplácese hacia abajo hasta que vea algo como esto:Sí, datos serializados. No, no puedes leerlos aquí. No te preocupes, no tienes que hacerlo.
Un widget de demostración
Para ilustrar mejor el funcionamiento interno, he escrito un widget de demostración muy simple:
Tenga en cuenta que el constructor:
't5_demo_widget'
es$id_base
el identificador de este widget. Como puede ver en la captura de pantalla, sus argumentos se almacenan en la opciónwidget_t5_demo_widget
. Todos sus widgets personalizados serán tratados de esta manera. No tienes que adivinar el nombre. Y puesto que ha escrito sus widgets (probablemente) que conoce todos los argumentos de su clase de$instance
parámetros.Conceptos básicos
Primero debes registrar algunas barras laterales y el widget personalizado. La acción apropiada para esto es fácil de recordar:
'widgets_init'
. Ponga todo en un contenedor: una clase o una función. Para simplificar, usaré una función llamadat5_default_widget_demo()
.Todo el siguiente código va al
functions.php
. La clase yaT5_Demo_Widget
debería estar cargada. Solo lo puse en el mismo archivo ...Hasta ahora, muy simple. Nuestro tema ahora está listo para widgets, se conoce el widget de demostración. Ahora la diversion.
Realmente no quieres destruir la configuración del usuario. Si ya hay contenido en las barras laterales, su código no debería pasar por encima. Por eso nos detenemos en este caso.
De acuerdo, asumí que las barras laterales están vacías ... necesitamos un contador:
Los widgets están numerados . Estos números son segundos identificadores para WordPress.
Hagamos que la matriz lo cambie:
También necesitamos un contador (más sobre eso más adelante):
Y así es como usamos el contador, los nombres de la barra lateral y los argumentos del widget (bueno, solo tenemos un argumento:)
text
.Observe cómo se crea el identificador del widget: el
id_base
, un signo menos-
y el contador. El contenido del widget se almacena en otra variable$demo_widget_content
. Aquí está el contador de la clave y los argumentos del widget se almacenan en una matriz.Incrementamos el contador en uno cuando hayamos terminado para evitar colisiones.
Eso fue fácil. Ahora un widget RSS. ¡Más campos, más diversión!
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 ...
... y guardar todos los argumentos para la
t5_demo_widget
prisa. No es necesario actualizar la misma opción dos veces.Bueno, suficientes widgets para hoy, guardemos
sidebars_widgets
también:Ahora WordPress sabrá que hay algunos widgets registrados y dónde se almacenan los argumentos para cada widget. A
var_export()
en el sidebar_widgets se verá así:El código completo nuevamente:
Si va a ver
wp-admin/widgets.php
ahora, verá tres widgets preestablecidos:Y eso es. Utilizar …
... para imprimir los widgets.
Hay una pequeña falla: debe cargar el front-end dos veces para el registro inicial. Si alguien puede ayudarme aquí, estaré muy agradecido.
fuente
widget_t5_demo_widget
refiere aquíupdate_option( 'widget_t5_demo_widget', $demo_widget_content );
?Gracias por compartir su solución. He usado lo que se ha descrito en esta pregunta para crear un código que se puede usar para inicializar las barras laterales con mucha facilidad. Es muy flexible, puede crear tantos widgets como desee sin tener que modificar el código. Simplemente use los ganchos de filtro y pase los argumentos en una matriz. Aquí está el código comentado:
Esta es una función auxiliar que comprueba si la barra lateral ya tiene contenido:
Ahora necesitamos crear una función que esté conectada a la acción 'sidebar_init'.
Y ahora la inicialización del widget:
La última acción es crear los widgets en cada barra lateral:
Esta función se utiliza para realizar un seguimiento de cuántas instancias de un widget específico ya se han definido:
Lo último que debemos hacer es asignar valores. Utilice estas funciones de filtro:
Y:
Idealmente, llamaría initialize_sidebars en una función de configuración que se llama a la activación del complemento o tema de esta manera: Activación de tema:
Activación del complemento:
Para resumir el uso de este conglomerado de funciones:
cree una función que inicialice las barras laterales que se engancha al filtro 'alter_initialization_sidebars'.
cree una función para cada barra lateral que acaba de agregar que se engancha al filtro 'alter_initialization_widgets_ $ sidebarname'. Reemplace $ sidebarname con el nombre de cada barra lateral que creó en el paso 1.
También puede simplemente copiar este código no comentado en su archivo de funciones y comenzar a crear sus funciones de filtro de inmediato: Código en pastie (sin funciones de filtro de inicialización)
fuente
En primer lugar, gracias a @toscho por la respuesta detallada.
Este es un ejemplo simple para aquellos que buscan una solución simple y opciones de widget predeterminadas:
Nota 1: puede
sidebar-id
ir al menú de widgets e inspeccionar la barra lateral deseada. La primera<div id="widgets-holder-wrap">
's<div>
niño tienesidebar-id
.Nota 2: Puede acceder
widget_name
al menú de widgets e inspeccionar el widget deseado. Verás algo así<div id="widget-6_widget_name-__i__" class="widget ui-draggable">
.Deseo que ayude
fuente
Así es como lo haces:
(ADVERTENCIA, esto podría ELIMINAR todos los widgets anteriores si no volvió a colocar los widgets originales en la
widgets
matriz).El número se puede usar si luego desea agregar opciones al widget con algo como esto:
fuente
$widgets = get_option( 'sidebars_widgets' );