it-swarm.com.de

Probleme mit den Seitenleistenargumenten und wp_list_bookmarks

Ich bin auf ein Problem gestoßen, bei dem ich versucht habe, die Seitenleistenargumente (before_widget, after widget, after_widget, before_widget) als themenorientierte Parameter für die Funktion wp_list_bookmarks zu verwenden. Das heißt, die Ausgabe von wp_list_bookmarks sieht genauso aus wie die in WP_Widget_Links.

Ich habe den Code des Links-Widgets fast wörtlich kopiert, aber wenn ich versuche, die einzigen Seitenleistenargumente (über die globalen $ wp_registered_sidebars) wiederzuverwenden, erhalte ich einige CSS-Klassen für den Widget-Container, die mit WP_Widget_Links nicht angezeigt werden.

Zum Beispiel der folgende Dump eines Sidebar-Arguments:

'name' => 'Sidebar 1'
'id' => 'sidebar-1'
'before_widget' => '<li id="%1$s" class="widget %2$s">'
'after_widget' => '</li>'  
'before_title' => '<h2 class="widgettitle">'
'after_title' => '</h2>'

Beim Lesen des WP-Codes ging ich davon aus, dass es sicher ist,% 1 $ s,% 2 $ s für% id,% class bzw.% 2 $ s zu ändern. Sobald die wp_list_bookmarks ausgeführt werden, sollte ich mit before_widget <li id="linkcat-" class="widget linkcat"> enden. Nach dem Vergleich mit der Ausgabe des Links-Widgets fehlt jedoch der Klassenname des Widget-CSS, und die Ausgabe meines Codes sieht auf der Seite etwas seltsam aus.

Dies ist der Code, in dem ich die Funktion verwende, die als Filter für sidebars_widgets aufgerufen wird:

function my_sidebars_widgets($sidebar_widgets) {
    global $wpdb, $wp_registered_sidebars;
    static $hits;
    if(++$hits == 2) {

        $sidebar = array_values($wp_registered_sidebars);

        $before_title = $sidebar[0]['before_title'];
        $after_title = $sidebar[0]['after_title'];
        $before_widget = $sidebar[0]['before_widget'];
        $after_widget = $sidebar[0]['after_widget'];

        $before_widget = str_replace('%2$s','%class',$before_widget);
        $before_widget = str_replace('%1$s','%id',$before_widget);

        wp_list_bookmarks(apply_filters('widget_links_args',array(
            'title_before' => $before_title, 'title_after' => $after_title,
            'category_before' => $before_widget, 'category_after' => $after_widget,
            'hide_invisible' => true,'title_li' => 'Links',
            'categorize' => 0,'inquiry' => true
        )));
    }
    return $sidebar_widgets;
}

Hattest du eine Ahnung, was ich hier vermisse? Ich versuche immer wieder zu verstehen, wie WP Widgets füttern, aber bisher keine Erklärung, während ich den Code lese.

vielen Dank im Voraus für alle Ihre Überlegungen.

3
Horacio Nuñez

Nach ein paar var_dumps weiß ich das:

1) Wenn wp_list_bookmarks im WP_Widget_Links-> Widget aufgerufen wird Der Parameter 'class' wird ignoriert, da der Parameter 'category_before' nicht den Platzhalter %class enthält. Stattdessen sieht 'category_before' so aus, als ob 'class' where 'widget_links'.

So setzt die Funktion dynamic_sidebar die $ before_widget-Parameter für das Widget, sobald es aufgerufen wird.

Natürlich kann dies durch Filter wie 'widget_links_args' oder 'dynamic_sidebar_params' geändert werden.

2) Bei vielen Themes wird zur Darstellung von Standard-Widgets das wp_list_bookmarks aufgerufen, aber mit Null-Parametern werden die in bookmark-template.php definierten Standardwerte verwendet:

('class' => 'linkcat','category_before' => '<li id="%id" class="%class">')

und dies geschieht auch dann, wenn die Seitenleiste registriert ist mit:

('before_widget' => '<li id="%1$s" class="widget %2$s">')

dies kann zu einer kleinen Inkonsistenz führen, da der Parameter WP_Widget_Links'category_before' zunächst aus dem Parameter sidebar'before_widget' ausgeliehen wird.

2
Horacio Nuñez