Wie werden nur einige Widgets einer Seitenleiste angezeigt?

Ich würde gerne eine Sidebar über drei Container aufteilen. Jeder Container sollte bis zu drei Widgets der Seitenleiste enthalten. Daher muss ich das HTML nur für die Widgets 0 bis 2, 3 bis 5 und 6 bis 8 getrennt finden.

Normalerweise würde ich dynamic_sidebar() , um die Seitenleiste anzuzeigen, aber diese function akzeptiert keine Parameter, um anzugeben, dass ich nur einen Bereich der Widgets der Seitenleiste haben möchte. Außerdem habe ich wp_get_sidebars_widgets() , aber es ist nicht für Themen gedacht.

Wie kann ich nur die Widgets in einem bestimmten Bereich einer dynamischen Sidebar abrufen? Zum Beispiel, das ist, woran ich denke.

 // functions.php // display range of widgets of a sidebar function dynamic_sidebar_range($name, $from, $to) { $widgets = get_dynamic_sidebar($name); // this function doesn't exist! for ($i = $from; $i < count($widgets) && $i < $to; ++$i ) { $widget = $widgets[$i]; echo $widget['before_widget'] . $widget['before_title'] . $widget['title'] . $widget['after_title'] . $widget['content'] . $widget['after_widget']; } } 

 // frontpage.php // consists of blocks of three posts or widgets alternatingly for ($sections = 0; $sections < 3; ++$sections) { // display three posts for ($i = 0; $i < 3 && have_posts(); ++$i) { the_post(); // ... } // display three widgets $from = $sections * 3; $to = $from + 3; dynamic_sidebar_range('name', $from, $to); } 

Solutions Collecting From Web of "Wie werden nur einige Widgets einer Seitenleiste angezeigt?"

Wenn Sie eine Seitenleiste über drei Container dynamic_sidebar() , müssen Sie dynamic_sidebar() nicht wirklich neu dynamic_sidebar() , um dynamic_sidebar() zu tun. Es gibt einen Filter namens dynamic_sidebar_params , mit dem die Seitenleiste aufgetriggers werden kann.

 function add_closing($params) { $params[0]['after_widget'] = $params[0]['after_widget'].''; return $params; } add_filter( 'dynamic_sidebar_params', function ($params) { static $c = 0; if (0 === $c || 0 === $c%3) { $params[0]['before_widget'] = '
'.$params[0]['before_widget']; remove_filter('dynamic_sidebar_params','add_closing'); } else { add_filter('dynamic_sidebar_params','add_closing'); } $c++; return $params; } );

Ich fand das interessant in einer “Code Golf” Art und Weise. Ich bin ziemlich sicher, dass drei verschiedene Seitenleisten, wie in Kommentaren vorgeschlagen, eine bessere Möglichkeit ist, dies zu tun.

Dadurch werden die Widgets in einer Seitenleiste in unterschiedlichen Containern, drei pro Container, eingeschlossen. Wenn Sie unterschiedliche Widget-Bereiche haben wollen, ist das, was Sie tun, völlig falsch, Dinge zu tun. Es wird verwirrender sein als einzelne Seitenleisten und es wird die Kontrolle vom Endbenutzer entfernen. Das ist nicht zu erwähnen, dass Sie Core-Code weitgehend neu erstellen müssen.

Verwenden Sie das Sidebar-System wie gewünscht.