Mostrar widgets de barra lateral dinámica específica en una página específica
Me han entregado un sitio de WordPress a medio terminar. Hace al menos un año que no uso WordPress y hay muchas cosas que encuentro diferentes. La forma en que estoy acostumbrado a mostrar diferente contenido en diferentes páginas es crear plantillas de página para cada página que necesita contenido único.
Estoy tratando de mostrar una barra lateral diferente en una página particular que en el resto del sitio. Lo que hubiera hecho hace un año es crear una plantilla de página para esta página y hacer un nuevo archivo de barra lateral y luego incluir el archivo de barra lateral en la plantilla de página. He descubierto que esto no funciona. Los principales culpables que puedo ver son loop.php
y loop-page.php
, que no existían en el tema básico que típicamente usaba cuando construía un sitio hace tiempo. Sin embargo, parece que quien tuvo sus manos en esto antes que yo ha copiado el tema 'twenty ten' y le ha hecho cambios bajo un nuevo nombre.
He registrado una nueva barra lateral dinámica en el functions.php
del tema y puedo verla en la sección Widgets del Panel de Control y agregar widgets a ella.
Sin embargo, no puedo hacer que se muestre en la página que quiero. He probado lo siguiente:
1.) Le di a la página una plantilla personalizada template_news.php
y coloqué lo siguiente donde debería llamarse la barra lateral:
include ('sidebar-news.php');
El archivo sidebar-news.php
contiene código que copié de sidebar.php
con el ID de barra lateral "News" que listé en functions.php
:
<?php if ( is_active_sidebar( 'sidebar-news' ) ) : ?>
<div id="secondary" class="widget-area" role="complementary">
<ul class="xoxo">
<?php dynamic_sidebar( 'sidebar-news' ); ?>
</ul>
</div>
<?php endif; ?>
La plantilla de página está aplicada a la página correcta.
2.) Fui a page.php
y cambié:
<?php get_sidebar(); ?>
a:
<?php
if(is_page('18')) {
include ('sidebar-news.php');
}
else {
get_sidebar();
} ?>
También he verificado varias veces que el ID de la página sea correcto y he intentado usar el slug en su lugar, pero sin éxito.
3.) Probé lo anterior en loop-page.php
4.) Coloqué la siguiente declaración condicional en sidebar.php
:
<?php
if ( is_active_sidebar( 'sidebar-news' ) && is_page('18') ) : ?>
<div id="sidebarnews" class="widget-area" role="complementary">
<ul class="xoxo">
<?php dynamic_sidebar( 'sidebar-news' ); ?>
</ul>
</div>
<?php endif; ?>
También, después de investigar y descubrir que la forma correcta de extender o cambiar la funcionalidad de un tema es crear un tema hijo, intenté hacer eso, pero causó que algunas cosas se rompieran que no tengo tiempo de intentar arreglar.
He descubierto que el 'sidebar.php' predeterminado está siendo llamado y mostrado en la página, sin embargo, aunque mi declaración condicional con el ID de página está presente, no está mostrando los widgets de la barra lateral personalizada.
Tampoco puedo encontrar cómo se está llamando la barra lateral predeterminada en la página porque eliminar get_sidebar();
por completo en mi plantilla personalizada template_news.php
, page.php
, o loop-page.php
no parece hacer nada.
Por favor, ¿alguien puede explicarme cómo agregar esta barra lateral a la página?

Creo que lo que necesitas es simplemente ejecutar register_sidebar()
en un hook 'widgets_init'
. El tema TwentyTen tiene ejemplos de register_sidebar()
en su archivo functions.php
, pero aquí tienes un ejemplo de cómo podría verse:
add_action( 'widgets_init', 'twentyten_widgets_init' );
function twentyten_widgets_init() {
register_sidebar( array(
'name' => __( 'Barra lateral de Noticias', 'yoursite' ),
'id' => 'sidebar-news',
'description' => __( 'Área de la Barra Lateral de Noticias', 'yoursite' ),
'before_widget' => '<li id="%1$s" class="widget-container %2$s">',
'after_widget' => '</li>',
'before_title' => '<h3 class="widget-title">',
'after_title' => '</h3>',
));
/*
* EL RESTO DEL CÓDIGO DE REGISTRO DE LA BARRA LATERAL DE twentyten_widgets_init() VA AQUÍ
*/
}
Además, en tu plantilla de página template_news.php
usa el siguiente código para llamar a tu barra lateral, que cargará el archivo sidebar-news.php
que creaste anteriormente:
<?php get_sidebar( 'news' ); ?>
No deberías necesitar ninguna de las otras cosas que intentaste, y definitivamente no necesitas declaraciones include
.

Ya he hecho esto. Fue lo primero que intenté exactamente como lo has descrito. Sin embargo, no funciona. El código en mi plantilla personalizada para el contenido y la barra lateral está siendo anulado por la configuración predeterminada en loop.php
y loop-page.php
.

@jlego - Hmm. Probé mi versión original con TwentyEleven y acabo de volver a probar con TwentyTen y funciona. loop.php
y loop-page.php
no tienen nada que ver con la generación de la barra lateral, a menos que, por supuesto, el otro desarrollador haya hecho cosas realmente extrañas. ¿Podrías actualizar tu pregunta y publicar esos dos archivos junto con el contenido de tu archivo template_news.php
?

@jlego - Además, si no tienes PhpStorm + Zend Debugger en tu conjunto de herramientas, podrías considerar conseguir una copia. Con él podrías rastrear tu sitio línea por línea y ver exactamente por qué funciona o no funciona.

Realmente me estaba frustrando porque sabía que esto debería funcionar, y había verificado todas las variables para asegurarme de que tenía la plantilla configurada correctamente y no tenía errores en mi código. Resulta que quien haya trabajado en esto antes que yo había logrado mostrar un blogroll en la página configurando esa página en particular como la página de "publicaciones" en el administrador de WordPress. Así que cuando intenté crear una plantilla personalizada, esa configuración estaba anulando mi plantilla y haciendo que la página ejecutara el código en esos archivos. Gracias por tu ayuda de todos modos. Voy a revisar PHPStorm y Zend Debugger.

Aunque esto no resolvió el problema específico que tenía, esta es la forma correcta de agregar una barra lateral a la página. Creo que la solución real a mi problema estaba limitada a mi caso particular, así que estoy marcando tu respuesta como la solución a esta pregunta debido al número de visitas que ha tenido.

Para mostrar un widget solo en páginas específicas cuando todas tus páginas tienen la misma barra lateral, puedes usar uno de estos plugins:
Simplemente oculta widgets en páginas especificadas. Añade casillas de verificación a cada widget para mostrarlo u ocultarlo en cada página del sitio.
Widget Logic te permite controlar en qué páginas aparecen los widgets usando las etiquetas condicionales de WordPress. También añade un filtro 'widget_content'.

También un excelente plugin para esto es https://wordpress.org/plugins/dynamic-widgets/
