Sidebar
ein-/ausblenden

WordPress head erleichtern

Plugin für WordPress SEO

Anzeige

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

42 Kommentare zu „WordPress head erleichtern“

  1. 1
    Kommentar von nastorseriessix

    Danke für die Information, jetzt kann ich das mal ein wenig besser anpassen demnächst im Zuge meines Redesign. :)

  2. 2
    Kommentar von Paul

    Kann man diese Abfragen nicht durch statische Texte ersetzen?

  3. 3
    Kommentar von Crazy Girl

    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 ;-)
    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 ;-) Ist ja oft genug drin, wie z.B. auch in der Home Navigation.

  4. 4
    Kommentar von Frank Bültge

    @Paul: ja, aber damit wird die Flexibilität eingeschränkt; bringt auch in der Performance nicht viel, da es von WP gecacht word.

  5. 5
    Kommentar von Markus

    super danke für den tipp

  6. 6
    Kommentar von Thorsten

    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?

  7. 7
    Kommentar von Frank Bültge

    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.

  8. 8
    Kommentar von Thorsten

    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

  9. 9
    Kommentar von Crazy Girl

    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 ;-)

  10. 10
    Kommentar von Markus

    für was genau ist den eigentlich der rsd_link?

  11. 11
    Kommentar von Frank Bültge

    Damit wird RSD Support geleistet, zum Beispiel für den Zugriff von Dekstop- oder iPhone-Tools.

    Really Simple Discovery is a way to help client software find the services needed to read, edit, or "work with" weblogging software.

  12. 12
    Kommentar von Markus

    besten dank frank^^

  13. 13
    Kommentar von Henning

    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

  14. 14
    Kommentar von Frank Bültge

    @Henning: Sie gehören in die functions.php des 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 der functions.php aufgehoben, 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.

  15. 15
    Kommentar von Henning

    @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!

  16. 16
    Kommentar von Frederik

    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 ;-)

  17. 17
    Kommentar von Frank Bültge

    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.

  18. 18
    Kommentar von Markus

    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

  19. 19
    Kommentar von Frank Bültge

    @Markus: die Lokalisierung kann via Hook admin_init integriert werden, wenn es aber AJAX Komponenten gibt, dann ist das zu spät und daher ist der Hook init besser, allerdings solltest du es mit dem Conditional Tag is_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.:

    if ( !is_admin() ) {
    	add_action( 'init', array(&$this, 'textdomain') );
    }
    
    function textdomain() {
    	load_plugin_textdomain( FB_MY_TEXTDOMAIN, false, dirname( plugin_basename(__FILE__) ) . '/languages' );
    }
  20. 20
    Kommentar von Markus

    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 ...

  21. 21
    Kommentar von Holger Kruse

    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 :)

  22. 22
    Kommentar von tux.

    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?

  23. 23
    Kommentar von Frank Bültge

    @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.

  24. 24
    Kommentar von tux.

    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. ;)

  25. 25
    Kommentar von Presswurst

    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.

  26. 26
    Kommentar von Frank Bültge

    @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.

  27. 27
    Kommentar von Olli

    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

  28. 28
    Kommentar von ärdbaer

    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

  29. 29
    Kommentar von Andreas Herrmann

    Immer wieder ein hilfreiches Idyll hier ... die WordPresswissensoase sozusagen. :O)

  30. 30
    Kommentar von realloc

    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.

  31. 31
    Kommentar von Frank Bültge

    @realloc: dann sollte es auch gehen, denn der Aufruf ist sicher in der gleichen Priorität 10, 0

  32. 32
    Kommentar von realloc

    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.

  33. 33
    Kommentar von realloc

    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.

  34. 34
    Kommentar von thomas

    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.

  35. 35
    Kommentar von realloc

    @thomas Danke, aber das ist mir inzwischen bekannt (siehe auch unter dem Workaround).

  36. 36
    Kommentar von Jan

    Wie entfernt man denn rel="shortlink" ?
    Habe dazu leider nichts gefunden im Netz...

  37. 37
    Kommentar von Frank Bültge

    @Jan: versuche mal

    remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
    remove_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );

  38. 38
    Kommentar von Jan

    Thx das funktioniert. Habe nun noch rel="next" entdeckt, das sollte auch weg.. mal schaun wie das klappt

  39. 39
    Kommentar von Bernhard

    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.

  40. 40
    Kommentar von Frank Bültge

    @Bernhard: nein, geht so nicht, da er die Funktion im Aufruf des Hook erzeugt.

  41. 41
    Kommentar von Horst Gräbner

    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

  42. 42
    Kommentar von Frank Bültge

    @Horst: ja, Landingsite

Kommentar schreiben

Kommentarregeln: Bleib cool, kritisch ist in Ordnung, aber wenn du unhöflich bist, dann lösche ich deinen Kommentar. Bitte benutze deinen persönlichen Namen oder Initialen und nicht den Namen eines Unternehmens, dies würde als Spam gewertet und wird gelöscht. Der Zusammenhang zwischen Namen und URL sollte nicht offensichtlich auf Spam hindeuten! ♥ Ansonsten, vielen Dank für den Kommentar und viel Spaß mit meinem Blog.

E-Mail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.

Kommentar-Hilfe

händischer Spam:
Beachte die Kommentarregeln, jede Form von versuchtem Spam wird gelöscht. Warum und wieso steht in einem meiner Beiträge.

Bezug auf Textstellen:
Du kannst direkt bezug auf Textstellen im Beitrag nehmen. Dazu muss lediglich der Bereich im Artikel markiert werden; daraufhin erscheint ein Button, der den markierten Text in das Kommentarfeld übernimmt und als Zitat auszeichnet. Die Funktion ist nur bei aktivem JavaScript nutzbar.

xHTML:
Du kannst folgende Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <blockquote cite=""> <code> <pre> <em> <strong> <strike> <ul> <ul> <li>

Achte darauf, wenn du Code im Kommentar hinterlegen willst, dann muss der Code maskiert sein. Dann wird er nicht interpretiert. Der Code muss mit Hilfe von HTML-Entities dargestellt werden, d.h. dass man z.B. < als &lt; und > als &gt; einfügt.

E-Mail-Benachrichtigung bei neuen Kommentaren ?
Wenn der Haken in der Checkbox gesetzt ist, dann wirst du über neue Kommentare vie E-Mail informiert. Der Versand erfolgt nur, wenn du die URL in der Bestätigungs-E-Mail genutzt hast oder schon Abonnent hier im Blog bist.

Kommentar erscheint nicht:
Alle Kommentare werden manuell geprüft, freigegeben und nach Möglichkeit beantwortet. Bitte um etwas Geduld und Nachsicht.

Identifikationsbilder (Avatare):
Auf Gravatar.com kann man sich mit seiner E-Mail-Adresse registrieren und ein Bild hochladen, dann erscheint dieses Gravatar hier und in vielen weiteren Blogs.

Spamschutz:
Das Kommentarformular ist mit einem Spamschutz ausgerüstet. Solltest du diesen Artikel ohne JavaScript besuchen und kommentieren wollen, so muss du die Frage beantworten und das jeweilige Wort in das Textfeld eingeben.