2017-04-11 15 views
0

In Wordpress gibt es eine Funktion wp_get_sidebars_widgets(), die ein multidimensionales Array aller registrierten Sidebar-IDs mit ihren untergeordneten Widget-IDs spuckt.PHParray traversal

Für Kontext ist dies ein Beispiel für die Ausgabe:.

Array 
(
[wp_inactive_widgets] => Array 
    (
    ) 

[sidebar-requests] => Array 
    (
     [0] => widget-demographics-4 
     [1] => recent-posts-7 
     [2] => widget-newsletter-11 
    ) 

[sidebar-team] => Array 
    (
     [0] => widget-sidebar-list-6 
     [1] => widget-donate-2 
    ) 

) 

I innerhalb eines Widgets dieses Code ist mit der ID der Seitenleiste zu finden, sie lebt in Zum Beispiel kann es nur ein ‚Widgets seine -Newsletter-11 ', und es lebt im Widgetbereich' sidebar-requests '.

Ich habe Probleme beim Speichern der ID dieses Widget-Bereichs. Hier ist eine einfache Version des Codes, den ich versuche zu verwenden.

$this_widget_id = 'widget-newsletter-11'; 
$this_widget_area_id; 

$all_widgets = wp_get_sidebars_widgets(); 

foreach ($all_widgets as $widget_area => $widget_id) { 
    if ($widget_id == $this_widget_id) 
     $this_widget_area_id = $widget_area; 
} 

Am Ende dieser, die gespeicherte Variable, bleibt $this_widget_area_id leer.

Was mache ich falsch?

+1

Sie müssen eine weitere Schleife in Ihrer Foreach hinzufügen. Das von '$ wp_get_sidebars_widgets()' zurückgegebene Array ist 2 Ebenen tief. So, wie Ihr Code derzeit steht, vergleichen Sie ein Array mit Ihrer Zeichenfolge "widget-newsletters-11" – WillardSolutions

+0

Ah! Perfekt! Ich habe 'foreach ($ widget_ids als $ widget_order => $ widget_id) hinzugefügt { if ($ widget_id == $ this_widget_id) $ this_widget_area_id = $ widget_area; } 'und alles funktioniert gut – idealbrandon

+0

Bevor Sie gehen diesen Code zu prod verpflichten, sollten Sie wirklich Ihre Vorgehensweise zu überdenken. wp_get_sidebars_widgets ist NICHT für diesen Zweck gedacht. Lesen Sie die Dokumentation: https://developer.wordpress.org/reference/functions/wp_get_sidebars_widgets/ – vlasits

Antwort

1

Ich denke, Sie ein Array gegen die Id sind überprüft, sollten Sie überprüfen, ob das spezifische Array die Id enthält:

foreach ($all_widgets as $widget_area => $widget_items) { 
    if (in_array($this_widget_id, $widget_items, true)) 
     $this_widget_area_id = $widget_area; 
} 

Hoffentlich habe ich Ihre Frage nicht falsch verstehen.

1

Sie möchten nicht die äußere Gruppe von Arrays durchlaufen. Sie wollen nur die Sidebar-Anfragen durchlaufen

$this_widget_id = 'widget-newsletter-11'; 
$this_widget_area_id; 

$all_widgets = wp_get_sidebars_widgets(); 
$all_widgets = $all_widgets[sidebar-requests]; 
foreach ($all_widgets as $widget_area => $widget_id) { 
    if ($widget_id == $this_widget_id) 
    $this_widget_area_id = $widget_area; 
} 
0

Danke @eatpeanutbutter für die Empfehlung, dass ich eine weitere Schleife hinzufügen. Ich fügte hinzu

foreach ($widget_ids as $widget_order => $widget_id) { 
    if ($widget_id == $this_widget_id) 
     $this_widget_area_id = $widget_area; 
} 

und alles funktioniert wie erwartet. Vielen Dank!

+0

Sicher, aber dieser gesamte Ansatz ist eine schlechte Idee. Ich bin nicht sicher, welches Problem Sie versuchen, mit diesem Stück Code zu lösen, aber mit wp_get_sidebars_widgets() ist fast sicher nicht der einzige Weg, um es zu erreichen, und es ist sicherlich nicht der empfohlene Weg. wp_get_sidebars_widgets() ist als privat gekennzeichnet und soll nicht von Theme- und Plugin-Entwicklern verwendet werden. – vlasits

+0

Guter Fang. Ich habe hier wirklich keine WP-spezifische Unterstützung erwartet, da ich wusste, dass es nur ein dummer PHP-Fehler war, den ich hatte, aber trotzdem einen guten Fang. Ich werde einige andere Optionen untersuchen, um dasselbe Ergebnis zu erzielen, ohne eine private WP-Funktion zu verwenden. – idealbrandon