WordPress HTML ausmisten

WordPress liefert allerhand im HTML-Code aus, das man vielleicht nicht drin haben möchte.
Man kann den HTML-Code entschlacken, indem man unten stehenden Code bzw. den Teil davon, den man für sinnvoll hält, in der functions.php des WordPress Themes ergänzt.
Für einige der Einstellungen gibt es auch extra Plugins, wobei für diese Änderungen ein paar Zeilen in der functions.php sicher geschickter sind.


Entfernen einzelner Elemente aus der WordPress HTML Ausgabe

Hinweis: Das Verschleiern und Unterdrücken von Versionsnummern ist eine gute Praxis, schafft jedoch keine Sicherheit. Bitte verwenden Sie stets aktuelle Software-Versionen, also u.a. ein aktuelles WordPress mit aktuellen Plugins.

wp_generator

Die WordPress Version wird im HTML Code angegeben:

<meta name="generator" content="WordPress 4.7.5" />

wird entfernt mit

remove_action('wp_head', 'wp_generator');

Möchte man zusätzlich auch z.B. im Feed (/feed und weitere) die Generator-Angabe entfernen:

function remove_wp_generator() { return ''; }
add_filter('the_generator','remove_wp_generator');

 

rsd, wlwmanifest

Links für Weblog Clients und den „Windows Live Writer

<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.example.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://www.example.com/wp-includes/wlwmanifest.xml" />

entfernt man mit

remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');

prev / next Links

Dienen der Angabe einer Reihenfolge von Beiträgen. Ob man die Angabe benötigt, kann man sich überlegen – tut auch nicht weh, sie drin zu lassen.

<link rel='prev' title='Hier ist die Seite davor' href='http://www.example.com/apfelernte' />
<link rel='next' title='Hier ist die Seite danach' href='http://www.example.com/traubenlese' />

wird entfernt mit

remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');

Veraltete Funktionen dafür:

// veraltete Funktionen
// remove_action('wp_head', 'start_post_rel_link');
// remove_action('wp_head', 'index_rel_link');
// remove_action('wp_head', 'parent_post_rel_link', 10, 0);
// remove_action('wp_head', 'start_post_rel_link', 10, 0);

Shortlink der aktuellen Seite

<link rel='shortlink' href='http://www.example.com/?p=5' />

Sowie der Shortlink im http Header

werden entfernt mit

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

Emoji js, css und dns-prefetch von s.w.org

WordPress schreibt javascript und css Code ins HTML, um Emojis zu unterstützen – egal ob man sie verwendet oder nicht.

Den Code kann man entfernen mit

remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );

Neu hinzugekommen ist ein dns-prefetch, offenbar ebenfalls im Zusammenhang mit Emojis. „s.w.org“ ist eine WordPress Domain.

<link rel='dns-prefetch' href='//s.w.org' />

entfernt man mit

add_filter( 'emoji_svg_url', '__return_false' );

RSS Feeds: Beiträge (posts) und Kommentare

RSS Feeds können praktisch sein, wenn man laufend neue Beiträge auf der Seite hat. Falls man diese Funktion nicht nutzt, kann man die Verweise auf die Feeds auch entfernen (die Feeds selbst sind noch vorhanden):


// Post+Kommentar+Kategorie Feed entfernen
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'feed_links_extra', 3);

Falls man dem Benutzer dann doch die RSS-Feeds der Beiträge anbieten möchte, muss man das anschließend wieder aktivieren:


// Post RSS-Feed wieder einschalten
add_action('wp_head', 'reinsert_post_feed');
function reinsert_post_feed()
{
   echo '&lt;link rel="alternate" type="application/rss+xml" '.
        'title="Backclub Nomnom e.V. Feed" href="'.get_bloginfo('rss2_url').'" /&gt;';
}

Parameter ver=… entfernen

WordPress schreibt gerne überall die Versionsnummer dazu, was leider dazu führt, dass man beim Lesen des HTML Codes auch gleich sämtliche verwendete Plugin-Versionen erhält. Das Verstecken der Versionen bietet keine Sicherheit, es verschleiert lediglich die Versionsnummer.

Mit einem Plugin, das .css und .js Code zusammenfasst, um ihn kompakter an den Client auszuliefern,  sollte man die meisten ver=… Parameter eh nicht mehr zu sehen bekommen.

Falls gewünscht, kann man Hinweise auf die aktuell verwendete WordPress-Version entfernen:

// wp Versions-Parameter ?ver=... von Skripts entfernen,
// falls unsere WordPress-Version angegeben wird
function vc_remove_wp_ver_css_js( $src )
{
   if (  strpos($src, 'ver='. get_bloginfo('version') )  )
      $src = remove_query_arg('ver', $src);
   return $src;
}
add_filter('style_loader_src',  'vc_remove_wp_ver_css_js', 9999);
add_filter('script_loader_src', 'vc_remove_wp_ver_css_js', 9999);

Man kann obigen Code natürlich anpassen, so dass sämtliche ver=… Parameter entfernt werden, allerdings werden die .js und .css Dateien dann ggf. länger im Browser gecachet, was zu Problemen führen kann. Die Vor- und Nachteile sollten jemandem hinreichend bekannt sein, der bis hierhin gelesen hat :-)

REST Api und json

Im HTML Code findet man u.a. (Zeilen gekürzt):

<link rel="alternate" type="application/json+oembed" href="http://www.example.com/wp-json/oembed/..." />
<link rel="alternate" type="text/xml+oembed" href="http://www.example.com/wp-json/oembed/...format=xml" />

Sofern man die REST Api nicht verwendet, also nicht automatisiert von Extern auf Beiträge zugreifen möchte (mehr Informationen zu dieser Api siehe WordPress Seiten), kann man die Zeilen inkl. json API entfernen:


// REST Api Hinweise entfernen
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('template_redirect', 'rest_output_link_header', 11, 0);

function remove_json_api ()
{
   // REST API Zeilen aus dem HTML Header entfernen
   remove_action('wp_head', 'rest_output_link_wp_head', 10);
   remove_action('wp_head', 'wp_oembed_add_discovery_links', 10);
   // REST API endpoint entfernen
   remove_action('rest_api_init', 'wp_oembed_register_route');
   // oEmbed auto discovery entfernen
   add_filter('embed_oembed_discover', '__return_false');
   // oEmbed results nicht filtern
   remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10);
   // oEmbed discovery links entfernen
   remove_action('wp_head', 'wp_oembed_add_discovery_links');
   // oEmbed-JavaScript entfernen
   remove_action('wp_head', 'wp_oembed_add_host_js');
   // rewrite rules zum Einbetten entfernen
   add_filter('rewrite_rules_array', 'disable_embeds_rewrites');
}
add_action( 'after_setup_theme', 'remove_json_api' );


Beispiel

/*
Diverse Einstellungen für die functions.php (dort am Ende einfügen)
*/

// Diverse Einträge entfernen
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wlwmanifest_link');

// Generator-Angaben, z.B. im Feed, entfernen
function remove_wp_generator() { return ''; }
add_filter('the_generator','remove_wp_generator');
// prev+next Links in Beiträgen entfernen
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');

// shortlink entfernen
remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0);

// Post+Kommentar+Kategorie RSS Feed-Links entfernen (entfernt nicht die Feeds selbst)
remove_action('wp_head', 'feed_links', 2);
remove_action('wp_head', 'feed_links_extra', 3);

// wp Versions-Parameter ?ver=... von Skripts entfernen, falls unsere WordPress-Version angegeben wird
function vc_remove_wp_ver_css_js( $src )
{
   if (  strpos($src, 'ver='. get_bloginfo('version') )  )
      $src = remove_query_arg('ver', $src);
   return $src;
}
add_filter('style_loader_src',  'vc_remove_wp_ver_css_js', 9999);
add_filter('script_loader_src', 'vc_remove_wp_ver_css_js', 9999);

// Emoji js, css und dns-preload entfernen
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
add_filter('emoji_svg_url', '__return_false');

// REST Api Hinweise entfernen
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('template_redirect', 'rest_output_link_header', 11, 0);

function remove_json_api ()
{
   // REST API Zeilen aus dem HTML Header entfernen
   remove_action('wp_head', 'rest_output_link_wp_head', 10);
   remove_action('wp_head', 'wp_oembed_add_discovery_links', 10);
   // REST API endpoint entfernen
   remove_action('rest_api_init', 'wp_oembed_register_route');
   // oEmbed auto discovery entfernen
   add_filter('embed_oembed_discover', '__return_false');
   // oEmbed results nicht filtern
   remove_filter('oembed_dataparse', 'wp_filter_oembed_result', 10);
   // oEmbed discovery links entfernen
   remove_action('wp_head', 'wp_oembed_add_discovery_links');
   // oEmbed-JavaScript entfernen
   remove_action('wp_head', 'wp_oembed_add_host_js');
   // rewrite rules zum Einbetten entfernen
   add_filter('rewrite_rules_array', 'disable_embeds_rewrites');
}
add_action('after_setup_theme', 'remove_json_api');

 

Weitere Einstellungen

xml-rpc-Schnittstelle

WordPress schreibt ggf., sofern man pingback im Backend beim Erstellen von Seiten / Beiträgen angegeben hatte, den Link mit in den HTML-Code. Allerdings ist die xml-rpc-Schnittstelle standardmäßig auch dann auf http://www.example.com/xmlrpc.php aktiviert, wenn man sie nicht im HTML propagiert.

Sofern man die xml-rpc-Schnittstelle nicht benötigt (für pingback-Funktion, Zugriff über Smartphone-App etc.), kann man den Zugriff darauf verweigern, z.B. in der .htaccess (Apache Webserver):

RedirectMatch 403 /xmlrpc.php