web-dev-qa-db-fra.com

Récupérer chaque widget séparément d'une barre latérale

Je voudrais récupérer chaque widget existant dans une barre latérale, par exemple. pour les mélanger avec des messages à l'intérieur de la boucle principale.

Je sais que je peux utiliser différentes zones de widgets (barres latérales), mais cette approche encombre la page d'administration du widget avec quelques dizaines de barres latérales. Pour atténuer cela, j'ai pensé les ajouter à une seule barre latérale et les récupérer consécutivement si nécessaire.

Mais je suis coincé. Je n'ai aucune idée sur la façon de récupérer un widget séparément.

Mon approche provisoire consiste à utiliser wp_get_sidebars_widgets et the_widget mais je ne suis pas en mesure de récupérer le nom de la classe du widget.

Voici un extrait simplifié de mon code. Dans ce cas, j'essaie d'ajouter un widget tous les trois articles, mais c'est une simplification excessive de la logique (puisque je ne veux pas simplement les ajouter régulièrement) afin de vous donner une idée. Je voudrais visualiser chaque widget en utilisant the_widget ou toute autre fonction. Comment puis-je accomplir cela? C'est possible?

    <?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; ?>
6
furins

Je prends l'essentiel de la question comme suit: "... je ne parviens pas à récupérer le nom de la classe du widget"

Vous devrez vérifier la variable global_ $wp_registered_widgets pour renseigner les informations manquantes. Ce code de preuve de concept devrait vous donner l’idée. Le code suppose une barre latérale nommée sidebar-1. Vous devrez ajuster cela.

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
}

Pour plus de conseils, jetez un coup d’œil à la façon dont fonctionne dynamic_sidebar , qui est essentiellement ce que j’ai fait pour résoudre ce qui précède.

Non testé, mais c'était assez intéressant pour que je me moque d'un code plus complet:

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' ); 
}
3
s_ha_dum

Vous devez l'obtenir au bon moment. Je suggère sur le crochet wp action.

Pour cela, volons du code dans widgets.php , dans la fonction dynamic_sidebar:

add_action( 'wp', 'widgets_run' );
function widgets_run() {

    global $wp_registered_widgets;

    $sidebars_widgets = wp_get_sidebars_widgets();
    if ( empty( $sidebars_widgets ) )
        return false;

    foreach ( (array) $sidebars_widgets as $sidebar_id => $sidebar_widgets ) {

        foreach( $sidebar_widgets as $sidebar_widget ) {

            if ( ! isset( $wp_registered_widgets[ $sidebar_widget ] ) )
                continue;

            $classname_ = '';
                foreach ( (array) $wp_registered_widgets[ $sidebar_widget ]['classname'] as $cn ) {
                if ( is_string($cn) )
                    $classname_ .= '_' . $cn;
                elseif ( is_object($cn) )
                    $classname_ .= '_' . get_class($cn);
            }
            $classnames[] = ltrim($classname_, '_');

        }

    }

    print_r($classnames); // here you are the class names

}
2
vmassuchetto