it-swarm.com.de

Rufen Sie jedes Widget separat von einer Seitenleiste ab

Ich möchte jedes in einer Seitenleiste vorhandene Widget abrufen, um z. um sie mit Beiträgen innerhalb der Hauptschleife zu mischen.

Ich weiß, dass ich verschiedene Widget-Bereiche (Seitenleisten) verwenden kann, aber dieser Ansatz überfrachtet die Widget-Verwaltungsseite mit einigen zehn Seitenleisten. Um dies zu entschärfen, habe ich mir überlegt, sie einfach einer einzelnen Seitenleiste hinzuzufügen und sie bei Bedarf nacheinander abzurufen.

Aber ich stecke fest. Ich habe keine Ahnung, wie ein Widget separat abgerufen werden kann.

Mein vorläufiger Ansatz ist die Verwendung von wp_get_sidebars_widgets und the_widget , aber ich kann den Widgetklassennamen nicht abrufen.

Hier ist ein vereinfachter Ausschnitt meines Codes. In diesem Fall versuche ich, alle drei Beiträge ein Widget hinzuzufügen. Dies ist jedoch eine Vereinfachung der Logik (da ich sie nicht regelmäßig hinzufügen möchte), um Ihnen die Idee zu vermitteln. Ich möchte jedes Widget mit the_widget oder einer anderen Funktion visualisieren. Wie kann ich das erreichen? Ist es möglich?

    <?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

Ich nehme den Kern der Frage als: "... Ich kann den Widgetklassennamen nicht abrufen."

Sie müssen die global variable $wp_registered_widgets überprüfen, um die fehlenden Informationen auszufüllen. Dieser Proof-of-Concept-Code soll Ihnen die Idee geben. Der Code setzt eine Seitenleiste mit dem Namen sidebar-1 voraus. Sie müssen das anpassen.

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
}

Weitere Anleitungen finden Sie unter Schauen Sie sich an, wie dynamic_sidebar funktioniert . Dies ist im Grunde das, was ich getan habe, um das oben Genannte zu erarbeiten.

Ungetestet, aber das war interessant genug, dass ich mir etwas vollständigeren Code ausgedacht habe:

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

Sie müssen es zur richtigen Zeit bekommen. Ich schlage auf den wp Aktionshaken vor.

Lassen Sie uns dazu in der Funktion widgets.php Code aus dynamic_sidebar stehlen:

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