WordPress bringt seit Version 2.5 stetig neue Standard Funktionen in den head des Themes ein, immer über den Hook wp_head. Auch mit WordPress 2.8 wurden neue Funktion ergänzt, die vorrangig den Link-Tag bedienen. Nicht immer ist das aber gewollt und daher können die Funktionen auch deaktiviert werden, schlicht und einfach mit Hilfe der Funktion remove_action.
Funktion remove_action
remove_action( $tag, $function_to_add, $priority, $accepted_args );
This function removes a function attached to a specified action hook. This method can be used to remove default functions attached to a specific action hook and possibly replace them with a substitute.
Important: To remove a hook, the $function_to_remove and $priority arguments must match when the hook was added. This goes for both filters and actions. No warning will be given on removal failure.
via: WP Codex
Die folgenden Syntax zeigt einen Auszug, der nur einen Teil der Ausgabe zeigt, die man im Theme aktiv haben kann. Sie resultieren aus den Standard Funktion, die in den head des Themes geladen werden. Erkennbar, in dem man in der Datei wp-includes/default-filters.php nach dem Hook wp_head sucht. Nicht alle Filter sollte man deaktivieren, da sie in den meisten Fällen sinnvoll sind. Aber WordPress ist nicht nur in klassischen Blogscenarios im Einsatz und daher bietet es sich, wenn man zumindest die Lösung kennt. Diese ist dann im zweiten Syntax-Feld zu erkennnen.
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://bueltge.de/xmlrpc.php?rsd" />
<link rel='index' title='bueltge.de [by:ltge.de]' href='http://bueltge.de' />
<link rel='start' title='WP - Datenbank sichern' href='http://bueltge.de/datenbank-sichern/9/' />
<link rel='prev' title='WordPress Konstanten nutzen' href='http://bueltge.de/wordpress-konstanten-nutzen/962/' />
Hier werden nun diverse Funktion deaktiviert, beispielhaft und nicht als Empfehlung. Untersucht euren Head und schaltet ab, was ihr nicht benötigt. Weniger Markup freut nicht nur die Ladezeit.
remove_action( 'wp_head', 'feed_links_extra', 3 ); // Display the links to the extra feeds such as category feeds
remove_action( 'wp_head', 'feed_links', 2 ); // Display the links to the general feeds: Post and Comment Feed
remove_action( 'wp_head', 'rsd_link' ); // Display the link to the Really Simple Discovery service endpoint, EditURI link
remove_action( 'wp_head', 'wlwmanifest_link' ); // Display the link to the Windows Live Writer manifest file.
remove_action( 'wp_head', 'index_rel_link'); // index link
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 ); // prev link
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 ); // start link
remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 ); // Display relational links for the posts adjacent to the current post.
remove_action( 'wp_head', 'wp_generator' ); // Display the XHTML generator that is generated on the wp_head hook, WP version
Als Hinweis, wer noch nicht mit eigenen Funktionen im Theme gearbeitet hat: Zugriffe auf Hooks werden durch die Pluginschnittstelle realisiert oder in der functions.php des Themes abgelegt. Sollte es die Datei nicht geben, dann einfach anlegen und im Theme ablegen, WordPress erkennt die Datei und inkludiert die Funktionen.
Ergänzung
Mit WordPress 3.0 gibt es einen Filter, der dafür sorgt, dass das P in WordPress immer groß geschrieben wird; muss man aus meiner Sicht nicht haben, kostet nur unnötig Last. Daher entfernt man auch diesen Filter, der auf drei Hooks geht.
// Remove Format WordPress
foreach ( array( 'the_content', 'the_title', 'comment_text' ) as $filter ) {
remove_filter( $filter, 'capital_P_dangit' );
}
Mit 3.0 wurde auch der Filter für relational links umgestellt, daher der folgende Code, der beide Filter beachtet, je nach WordPress version.
if ( !remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 ) )
remove_action ('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
Ergänzt von realloc
Danke für die Information, jetzt kann ich das mal ein wenig besser anpassen demnächst im Zuge meines Redesign.
Kann man diese Abfragen nicht durch statische Texte ersetzen?
@Paul: ja, aber damit wird die Flexibilität eingeschränkt; bringt auch in der Performance nicht viel, da es von WP gecacht word.
Direkt nach dem Update letzte Woche habe ich das auch gleich wieder gemacht. Ist einiges dazu gekommen bei 2.8 was WP in den Head schreibt. Und gerade z.B. auch die Feed Links sind oft eh schon im Theme drin, doppelt gemoppelt hält nicht unbedingt besser
Ist ja oft genug drin, wie z.B. auch in der Home Navigation.
Den index_rel_link finde ich persönlich auch ziemlich unrelevant. Wenn die Suchmaschinen nicht wissen was meine Startseite ist, wer soll es denn dann noch wissen
super danke für den tipp
Hallo Frank,
danke für den Beitrag! Wie finde ich allerdings die Namen der Funktionen heraus?
Das Plugin Admin Management Xtended z.b. fügt im wp_head folgendes ein:
meta name='AMEWP' content='2.0.2'Der Code der hierfür verantworlich ist lautet (general-functions.php, Zeile 784-786):
function ame_feheader_insert() {echo "\n";
}
Mittels
remove_action('wp_head','ame_feheader_insert');habe ich versucht den meta-tag zu entfernen - leider ohne Erfolg.
Hast du ein Tipp für mich?
Ich vermute, dass du die Priorität nicht beachtest, ansonsten ist das richtig.
remove_action('wp_head', 'ame_feheader_insert', 1);Alternativ wäre es sicher gut, wenn man Oliver, der Autor der Plugins, darüber informiert, ob man das nicht anders lösen kann.
Vielen Dank, das war die Lösung! Ich werde Oliver mal eine E-Mail zu dem Thema schreiben.
Nun noch eine Frage, die nextgen-gallery von Alex Rabe fügt den Version-Tag so ein:
add_action('wp_head', create_function('', 'echo "\nversion . '\' />\n";') );In dem Fall habe ich ja keinen Namen der Funktion, wie unterbinde ich dann das es eingefügt wird?
Gruß Thorsten
Ansonste xe doch einfach die entsprechede function im Plugin aus (vor jede Zeile 2 //) und schon ist sie deaktiviert. Musst Dir halt eine Notiz machen, damit beim nächsten Update des Plugins nicht wieder alles weg ist. Etwas mühseelig, aber ich mache das auch so wenn mir in Plugins was nicht gefällt
für was genau ist den eigentlich der rsd_link?
Damit wird RSD Support geleistet, zum Beispiel für den Zugriff von Dekstop- oder iPhone-Tools.
besten dank frank^^
Hallo alle,
ich habe den Artikel nun zwei Mal gelesen, kann aber eine Information nicht finden oder überlese sie ständig: wo müssen die remove_action(); Aufrufe denn eingebaut werden? Unmittelbar im template vor dem wp_head-Funktionsaufruf?
Danke für einen Hinweis,
Henning
@Henning: Sie gehören in die
functions.phpdes Themes oder in ein extra Plugin; sie sind eher gedacht für Leute, die wissen was sie tun, auch wenn man damit nichts kaputt machen kann. Am besten sind sie in derfunctions.phpaufgehoben, da sie in dem Fall explizit zum Theme gehören. Gibt es die Datei nicht, einfach als php-Datei anlegen und im Theme speichern, WP erkennt sie dann.@Frank Ich werde mal testen. Programmiererfahrung gibt es reichlich, das bedeutet leider noch nicht, dass sich einem der Datei-Wust von WordPress gleich auf den ersten Blick erschliesst - bei den themes muss ich immer noch einen Moment draufschauen
. Vielen Dank!
Ist es denn nun sinnvoll (sprich: gibt es Beweise für die Effektivität?), optionale Funktionen zu entfernen oder nicht? Ich habe mich über doppelte Einträge auch schon gewundert, jedoch frage ich mich, ob es nicht einfach schnurzpiepegal ist
Für die Last ist nicht sonderlich wichtig, da die meisten Einträge gecacht werden. Der Link zum ersten und nächsten Beitrag ist da schon andrs, der ist jedesmal ein Query. Hinzu kommt, dass weniger Markup Zeit bringt und bei Google besser ankommt.
Hi Frank, hab mal wieder ne Frage und wusste auf die schnelle nicht wo es reinpasst. Du schreibts im Beitrag wie ich den Head erleichtern kann, ich würde gerne wissen, wie ich den Admin-Head von WordPress um etwas ergänzen kann. Ich habe mein neues Theme fast fertig und diesmal auch eine Theme-Options-Page. Da das Template zweisprachig ist bzw. sein soll, muss ich meine Lokalisierung irgendwie auch im WP-Backend verankern, also via load_theme_textdomain (xy) ... Hast Du eine Idee wie ich das hinbekomme und muss dann noch ne Pfadangabe zu den Lokalisierungsdateien mit rein? Habs schon mit add_action (admin_head) probiert aber das wäre wohl auch zu einfach gewesen
Greets, Markus
@Markus: die Lokalisierung kann via Hook
admin_initintegriert werden, wenn es aber AJAX Komponenten gibt, dann ist das zu spät und daher ist der Hookinitbesser, allerdings solltest du es mit dem Conditional Tagis_admin()abfragen, damit die der Hook nur im Admin gezogen wird. Die Sprachdatei selbst wird bei Backend-Sachen und Plugins mit einer anderen Funktion gezogen:load_plugin_textdomain()Bsp.:
Erstmal Danke für die schnelle Antwort, leider funktioniert das in dieser Form nicht. Irgendwie muss WordPress den Weg in den Theme-Ordner finden, und sofern ich das richtig verstehe wir bei load_plugin_textdomain der Ordner /plugins nach dem File durchforstet. Ich hab die mo/po-files im Hauptordner des Themes, aber wirklich keinen Plan wie ... bleibt einfach alles englisch und die deutsche Übersetzung wird nicht angezeigt ...
Danke für den Tipp, genau das hab ich gesucht..
Wenn man WordPress nicht immer nur als Blog sondern auch ab und zu als CMS benutzt, nerven die Tags ohne Ende
Irgendwas mache ich falsch.
remove_action('wp_head', 'wlwmanifest_link', 1);remove_action('wp_head', 'rsd_link', 1);
remove_action('wp_head', 'ame_feheader_insert', 1);
Dennoch bleiben alle drei Tags erhalten. Liegt es an der Priorität?
@tux.: nein, sollte nicht so sein; denn wenn man die Parameter der Prio weg lässt, dann wird 10 genutzt, also später und das klappt in meinen Tests bestens. Die ersten beiden Filter kannst du auch via Plugin entfernen - Secure WordPress; den letzten kenne ich nicht, eventuell ein Plugin. Da kann es nicht immer erfolgreich sein, denn nicht jedes Plugin geht über den Filter wp_head um Inhalte in den head zu bringen.
Der letzte ist das weiter oben schon angesprochene Plugin, die ersten beiden tun halt nix ...
Dann werde ich mal Secure WordPress anschauen, bevor ich mir hier noch was kaputtspiele. Danke für die Antwort.
Hallo,
vielen Dank für die Tipps.
Allerdings muss ich mal "dumm" nachfragen:
Das Plugin "fancyzoom" setzt mehrere Javascript-Aufrufe in den Header.
Wie kann ich nun erreichen, dass diese Scripte nur dann geladen werden, wenn ein Beitrag aufgerufen wird, der fancyzoom verwendet?
Danke für die Antwort im Voraus.
@Presswurst: nicht so einfach, dazu müsste man das Plugin erweitern, eine Box in den Edit-Bereich bringen, der du sagst, ja lade das JS oder es muss über den Artikel geparst werden, ob es notwendig ist, was aber auch wieder Last kostet.
Vielen Dank. Der Artikel hat mir bei meinem neuen Theme bzw. Projekt ein Stück weit weitergeholfen. Hab´s bislang immer über die Löschung des gesamten wp_head() geregelt. Und bestimmte Sachen wieder eingefügt!
So ist´s natürlich besser!
Gruß
Olli
Hallo,
kann man so auch irgendwie das Custom Header Image (keine Ahnung, wie es genau heißt) aus dem Hook entfernen?
Wenn ja, wie genau geht das, das bringt mich gerade zur Verzweiflung...?
Gruß,
Björn
Immer wieder ein hilfreiches Idyll hier ... die WordPresswissensoase sozusagen. :O)
Ich habe gerade das Phänomen bei der RC3, dass beispielsweise
remove_action ('wp_head', 'parent_post_rel_link', 10, 0);keine Wirkung mehr zeigt. Irgendwelche Ideen? wp-inlucdes/default-filters.php scheint an der Stelle, wo die Action hinzugefügt wurde, unverändert zu sein.
@realloc: dann sollte es auch gehen, denn der Aufruf ist sicher in der gleichen Priorität 10, 0
Leider sehe ich aber sowohl
link rel='prev'als auch
link rel='next'im Header, trotzdem ich entsprechende remove_action-Anweisungen seit einiger Zeit so benutze und es bisher funktionierte. Ich werde mir das noch mal genauer anschauen.
Wie schon geschrieben, ich beobachte das gerade bei 3.0 RC3.
Ich hab's gefunden. Um mal zu sehen, was da überhaupt so alles registriert ist, habe ich mir
$GLOBALS['wp_filter']mal ausgeben lassen. Ich denke, dass hier noch eine Fehler in der RC3 steckt.remove_action ('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);Das ist übrigens nicht der einzige Filter bzw. Action, die so ein Postfix hat.
hallo realloc,
hatte auch mit wp3 das nichtsnutzige rel prev wieder drin.
hab Franks if Abfrage:
if ( !remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 ) )
remove_action ('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
genommen
....und weg ist gut.
@thomas Danke, aber das ist mir inzwischen bekannt (siehe auch unter dem Workaround).
Wie entfernt man denn rel="shortlink" ?
Habe dazu leider nichts gefunden im Netz...
@Jan: versuche mal
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
remove_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
Thx das funktioniert. Habe nun noch rel="next" entdeckt, das sollte auch weg.. mal schaun wie das klappt
Danke. Dein Artikel von 2009 scheint trotz der vergangenen Zeit immer noch sehr hilfreich.
Hast Du eigentlich auch einen Tipp, wie ich die Versionsnummer des Next Gen Gallery Plugins sauber aus dem Header bekomme? Aktuell kommentiere ich einfach die Zeile 131
add_action('wp_head', create_function(...) );in der Datei nggallery.php aus. Aber das wird mir ja bei einem Plugin-Update gelöscht.@Bernhard: nein, geht so nicht, da er die Funktion im Aufruf des Hook erzeugt.
Hey, vielen Dank für den Tipp!
Der Header ist jetzt deutlich schlanker und auch ein lästiger W3C-Fehler ist jetzt nicht mehr vorhanden, alles grün!
Deine Website hat einen festen Platz in den Favoriten, aber heute bin ich über die Suma gekommen. Dabei wurde mir genau angezeigt, das ich über eine Suche gekommen bin und mit welchem Suchbegriff.
Ist das ein Plugin, welches dieses Funktionalität liefert?
Gruß aus Köln
Horst Gräbner
@Horst: ja, Landingsite