Rufen Sie jedes Widget separat von einer Seitenleiste ab

7

Ich möchte jedes in einer Seitenleiste vorhandene Widget abrufen, um es z. B. mit Posts innerhalb der Hauptschleife zu mischen.

Ich weiß, dass ich verschiedene Widget-Bereiche (Seitenleisten) verwenden kann, aber dieser Ansatz überfüllt die Widget-Verwaltungsseite mit einigen zehn Seitenleisten. Um dies zu mildern, dachte ich, sie einfach zu einer einzelnen Seitenleiste hinzuzufügen und sie bei Bedarf nacheinander abzurufen.

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

Mein vorläufiger Ansatz besteht darin, wp_get_sidebars_widgets und the_widget zu verwenden, aber ich kann den Namen der Widget-Klasse 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 zu starke Vereinfachung der Logik (da ich sie nicht nur regelmäßig hinzufügen möchte), um Ihnen die Idee zu vermitteln. Ich möchte jedes Widget mit the_widgetoder 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; ?>
Furine
quelle

Antworten:

3

Ich nehme den Kern der Frage als: "... Ich kann den Namen der Widget-Klasse nicht abrufen."

Sie müssen die globalVariable überprüfen $wp_registered_widgets, um die fehlenden Informationen einzugeben. Dieser Proof-of-Concept-Code soll Ihnen die Idee geben. Der Code setzt eine Seitenleiste mit dem Namen voraus sidebar-1. 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 hilfreiche Informationen, werfen Sie einen Blick auf , wie dynamic_sidebarWerke , die im Grunde ist das, was ich die oben zu arbeiten , tat.

Ungetestet, aber das war interessant genug, dass ich etwas vollständigeren Code verspottete:

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' ); 
}
s_ha_dum
quelle
@ Furins: siehe das Update
s_ha_dum
Das Betrachten von dynamic_sidebarCode sollte der naheliegendste Ansatz sein, und ich habe nicht daran gedacht! Jetzt fühle ich mich albern. +1 auch, um meine Frage (richtig) auf einen einzigen Satz zu reduzieren. Der Code enthält einige kleine Fehler, die jedoch trivial sind und die Richtigkeit der Antwort nicht ändern, da sie nur das falsche Widget ausgeben (sollte es sein $widgets[$i/3]). Vielen Dank!
Furins
Ich muss falsch verstanden haben, welche Widgets wo zeigen sollten. Das tut mir leid. Ich bin froh, dass es geholfen hat.
s_ha_dum
2

Sie müssen es zum richtigen Zeitpunkt bekommen. Ich schlage vor am wpAction Hook.

Lassen Sie uns dazu widgets.phpin der dynamic_sidebarFunktion Code 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

}
vmassuchetto
quelle
Der Code ist robust, da er Variablen überprüft, bevor er sie verwendet. Ich werde einen Teil davon stehlen, um ihn mit der Antwort von s_ha_dum zusammenzuführen. Ganz am Ende sind beide vorgestellten Ansätze korrekt, aber der Ansatz von s_ha_dum konzentriert sich mehr auf meine Frage und ist daher leichter auf mein spezifisches Problem anwendbar. Vielen Dank jedoch, wenn ich nur beide akzeptieren könnte ...
Furins
Das ist in Ordnung, @furins. Wir sind hier, um uns gegenseitig zu helfen. Und wenn wir Variablen überprüfen, sehen wir am Ende nur die relevanten Warnmeldungen.
Vmassuchetto