loop – Recupere cada widget por separado de una barra lateral

Pregunta:

Me gustaría recuperar cada widget existente en una barra lateral para, por ejemplo, mezclarlos con publicaciones dentro del bucle principal.

Sé que puedo usar diferentes áreas de widgets (barras laterales), pero este enfoque satura la página de administración de widgets con algunas decenas de barras laterales. Para mitigar esto, pensé en agregarlos a una sola barra lateral y recuperarlos consecutivamente cuando sea necesario.

Pero estoy estancado. No tengo idea de cómo recuperar un widget por separado.

Mi enfoque tentativo es usar wp_get_sidebars_widgets y the_widget, pero no puedo recuperar el nombre de la clase del widget.

Aquí hay un fragmento simplificado de mi código. En este caso, estoy tratando de agregar un widget cada tres publicaciones, pero es una simplificación excesiva de la lógica (ya que no quiero simplemente agregarlos regularmente) para brindarles la idea. Me gustaría visualizar cada widget usando the_widget o cualquier otra función. ¿Cómo puedo lograr esto? ¿Es posible?

    <?php 
    $i = 1;
    $widgets = wp_get_sidebars_widgets(); // I KNOW THE USE OF THIS IS DISCOURAGED (PRIVATE) BUT CANNOT FIND ALTERNATIVES. 
    if ( have_posts() ) : ?>

        <?php while ( have_posts() ) : the_post(); ?>

            <?php
                if ($i%3 == 0){
                    echo "<h1>WIDGET #".($i/3)."</h1>";
                    the_widget($widgets['homepage-1'][$i/3]); // THIS DOES NOT WORKS SINCE I'M NOT GIVING THE CLASS NAME. HOW TO RETRIEVE IT?
                }
                get_template_part( 'content', get_post_format() );
                $i++;
            ?>

        <?php endwhile; ?>

        <?php _s_paging_nav(); ?>

    <?php else : ?>

        <?php get_template_part( 'content', 'none' ); ?>

    <?php endif; ?>

Respuesta:

Considero que el núcleo de la pregunta es: "… No puedo recuperar el nombre de la clase del widget"

Deberá verificar la variable global $wp_registered_widgets para completar la información que falta. Este código de prueba de concepto debería darle una idea. El código asume una barra lateral llamada sidebar-1 . Tendrás que ajustar eso.

global $wp_registered_widgets;
$widgets = wp_get_sidebars_widgets(); 
var_dump($widgets['sidebar-1']); // dump the data
foreach ($widgets['sidebar-1'] as $widget) {
  var_dump($wp_registered_widgets[$widget]); // dump the data
}

Para obtener más orientación, eche un vistazo a cómo funciona dynamic_sidebar , que es básicamente lo que hice para resolver lo anterior.

No probado, pero esto fue lo suficientemente interesante como para crear un código más completo:

global $wp_registered_widgets;
$i = 1;
$widgets = wp_get_sidebars_widgets(); 
$widgets = $widgets['homepage-1'];
if ( have_posts() ) { 
  while ( have_posts() ) { 
    the_post(); 
    if ($i%3 == 0){
      echo "<h1>WIDGET #".($i%3)."</h1>";
      $cn = $wp_registered_widgets[$widgets[$i%3]]['callback'][0];
      $cn = get_class($cn);
      the_widget($cn,$widgets[$i%3]);
    }
    get_template_part( 'content', get_post_format() );
    $i++;
  }
  _s_paging_nav(); 
} else {
  get_template_part( 'content', 'none' ); 
}

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım