Gibt es Hooks für WordPress-Widgets (oder Seitenleisten)?

Lesezeit: 5 Minuten

Jeffs Benutzeravatar
Jeff

Ich versuche, ALLE Widget-Ausgaben durch einen einfachen Filter zu filtern, kann aber keine Haken finden und hatte gehofft, in die richtige Richtung gelenkt zu werden. Oder möglicherweise sind meine Bemühungen nicht einmal möglich?

Mein einfacher Filter sieht ungefähr so ​​aus:

function clean_widget_output( $input ) {
    return str_replace( array( "\t", "\n", "\r" ), '', $input );
}

add_[FILTER OR ACTION]( 'need_a_hook', 'clean_widget_output', 99 );

Irgendwelche Ideen? Ich bin ziemlich neu in PHP, aber ich kann herumkommen.

  • Ich bin mir nicht sicher, wann sie den widget_text-Filter eingeführt haben, vielleicht hatten sie ihn 2009 noch nicht, als diese Frage ursprünglich gestellt wurde. Siehe meinen Beispielcode unten in meiner Antwort für ein vollständiges (und sehr einfaches) funktionierendes Beispiel.

    – Entwickler Null

    30. März 2014 um 21:43 Uhr

Dies wurde aus der Notwendigkeit/dem Wunsch heraus getragen, das schreckliche HTML zu bereinigen, das von WordPress-Widgets ausgespuckt wird. Ich liebe, was sie tun, aber einige der Ergebnisse bringen mich zum Weinen.

Die kurze Antwort ist output buffering weil ich keine Widget- oder Sidebar-Hooks finden konnte.

Die lange Antwort lautet:

function tidy_sidebar( $sidebar_name_or_id )
{
    ob_start();

    $bool = dynamic_sidebar( $sidebar_name_or_id);

    if ( $bool )
    {
        $str = ob_get_contents();
        $str="do cleanup stuff...";
    }
    else
    {
        $str="";
    }
    ob_end_clean();

    return $str;
}

Dann ruf an echo tidy_sidebar( 'sidebar-name-or-id' ); aus deinem Thema.

  • Sie können jetzt den Widget-Wrapper und den Widget-Titel-HTML steuern, wenn Sie eine Seitenleiste registrieren, also sind Sie sich nicht sicher, wie viel dies benötigt wird. Wenn Ihnen ein Widget nicht gefällt, schreiben Sie es am besten mit der gewünschten Ausgabe um. Werfen Sie einen Blick auf die Widgets-API (codex.wordpress.org/Widgets_API) und die Funktion register_sidebar (codex.wordpress.org/Function_Reference/register_sidebar)

    – Roborourke

    3. November 2010 um 13:36 Uhr

Benutzeravatar von Andrew Patton
Andreas Patton

Ich hatte ein ähnliches Problem und nachdem ich Adam Browns durchgesehen hatte Liste aller WordPress-Filter-Hooksfestgestellt, dass der Hook, den ich brauchte, existiert (widget_title, wie pxl erwähnt), aber dass es keinen Haken gibt, um alle Widget-Ausgaben zu erhalten. Ich dachte, ich würde die Lösung erläutern, die für mich funktioniert hat.

Theoretisch ist die widget_title Hook sollte sich auf alle Widgets in Ihrem Blog auswirken, aber ich bin sicher, dass einige Widgets von Drittanbietern es versäumen, die erforderliche Codezeile zum Anwenden von Titelfiltern einzuschließen, sodass dies nicht narrensicher ist. Es hat jedoch für mich funktioniert und kann verwendet werden, um benutzerdefinierte „Shortcodes“ (genauer gesagt „Longcodes“) oder Syntaxen auf Ihre Widget-Titel anzuwenden. Zum Beispiel wollte ich gelegentlich HTML-Code in meine Widget-Titel einfügen, aber standardmäßig wird der gesamte HTML-Code entfernt. Also, um Dinge wie hinzufügen zu können <em> Tags in einigen meiner Titel in Text umzuwandeln, habe ich eine benutzerdefinierte Syntax gewählt: [[ instead of < & ]] Anstatt von > (z. B. [[em]] und [[/em]]) und dann eine Funktion in der Datei functions.php meines Themes erstellt, um diese benutzerdefinierte Syntax zu verarbeiten und durch das HTML-Äquivalent zu ersetzen:

function parse_html_widget_title( $text ) {
    return str_replace(array('[[', ']]'), array('<', '>'), $text);
}

Dann habe ich eine Zeile darunter hinzugefügt, um die Funktion als Filter hinzuzufügen:

add_filter('widget_title', 'parse_html_widget_title', 11); // 11 is one above the default priority of 10, meaning it will occur after any other default widget_title filters

Das add_filter / apply_filter Die Funktionalität übergibt den zu filternden Inhalt automatisch als ersten Parameter an die als Filter angegebene Funktion, das ist also alles, was Sie tun müssen.

Um etwas Ähnliches für die Hauptausgabe des Widgets zu tun, müssten Sie sich alle Ihre Widgets ansehen, um zu sehen, welchen Haken sie verwenden, und überprüfen, ob sie einen Filter für ihre Hauptausgabe haben, als verwenden add_filter() für jeden Hook, den Sie mit Ihrer benutzerdefinierten Callback-Funktion finden (zum Beispiel it’s widget_text für die Ausgabe des Text-Widgets oder get_search_form zum Suchformular [you can see it in wp-includes/general-template.php, at the get_search_form() function]). Das Problem ist, dass einige der dynamisch generierten Widgets keine Hooks haben (wie das Meta-Widget), weshalb die von Jeff bereitgestellte Ausgabepufferungslösung die vielseitigste, wenn auch nicht ideale Lösung ist.

  • DANKE!! Nach so etwas habe ich ewig gesucht – du bist ein Lebensretter. 🙂

    – Michèle

    4. Mai 2011 um 19:56 Uhr

Es gibt viele Hooks für WordPress-Widgets, die nicht dokumentiert sind. Der WordPress-Kodex listet sie aus irgendeinem Grund nicht auf (z. B. können sich diese Hooks in Zukunft ändern und werden mit neuen Updates und Versionen unerwartet brechen) … verwenden Sie diese also mit äußerster Vorsicht.

um herauszufinden, was sie sind, gibt es mindestens 2 Orte zu suchen:

<wordpress install directory>/wp-includes/default-filters.php
<wordpress install directory>/wp-includes/default-widgets.php

In diesen beiden Dateien ist eine ziemlich gute Auflistung aller Hooks enthalten, die WordPress verwendet.

Ein Beispiel wäre ein Filter für Widgets widget_title

Verwenden Sie diese noch einmal mit Vorsicht, es ist nicht garantiert, dass sie über die spezifische Version des Codes hinaus funktionieren, den Sie sich ansehen.

Ich bin mir nicht sicher, wann sie den widget_text-Filter eingeführt haben, vielleicht hatten sie ihn ’09 nicht, als diese Frage ursprünglich gestellt wurde, aber da er jetzt da ist und für alle, die diesen Stackoverflow bekommen, wie ich es von Google getan habe und zufällig weit genug nach unten gelesen, um diese Antwort zu sehen, ist es jetzt eigentlich ganz einfach:

function my_widget_filter( $content )
{
    // manipulate $content as you see fit
    return $content;
}

add_filter( 'widget_text', 'my_widget_filter', 99 );

Schauen Sie sich vielleicht auch die an dynamic_sidebar_params-Filter

Ein weiterer Link

1403000cookie-checkGibt es Hooks für WordPress-Widgets (oder Seitenleisten)?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy