WordPress XML-Sitemap-Plugin mit XMLWriter – Kurzanleitung

Veröffentlichung 28. August 2018 @ 23:44
Letzte Änderung 29. August 2018 @ 15:27

Überblick

  • „Primitives“ Plugin zur Erstellung einer aktuellen XML-Sitemap-Datei für Beiträge und Seiten bei Veröffentlichung eines Beitrags / einer Seite
  • Nutzung der PHP-XMLWriter-Erweiterung zur Erzeugung eines standarkonformen XML-Schemas für das Sitemapprotokoll
  • Präfixe „self“ für PHP-Funktionen und „self-“ für Plugin-Verzeichnis und Plugin-Datei

Voraussetzungen

Netzwerk

  • Website https://wordpress.example.com

Software

  • WordPress 4.9.8 #https://wordpress.example.com/wp-admin/update-core.php

Ordner und Dateien

  • Installation /usr/share/wordpress/wp-content/plugins/self-xml-sitemap

Plugin-Verzeichnis anlegen

mkdir /usr/share/wordpress/wp-content/plugins/self-xml-sitemap

Plugin-Datei erstellen

<?php
/*
Plugin Name: SELF XML Sitemap
Description: Create updated XML sitemap file 'sitemap.xml' in main directory every time a page or post is published
Version: 2018-08-28
Author: Thomas Fabian
Author URI: https://www.fabiblog.de
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
*/
if (!function_exists ('selfCreateXmlSitemap'))
{
  function selfCreateXmlSitemap ()
  {
    // Get all pages and posts
    $args = ['numberposts' => -1, 'post_type' => ['page', 'post']];
    $posts = get_posts ($args);
    // Create XML sitemap file
    $xmlWriter = new XMLWriter ();
    $xmlFile = ABSPATH . 'sitemap.xml';
    $xmlWriter->openURI ($xmlFile);
    $xmlWriter->setIndent (true);
    $xmlWriter->startDocument ('1.0', 'UTF-8');
    $xmlWriter->startElement ('urlset');
    $xmlWriter->writeAttribute ('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
    foreach ($posts as $post)
    {
      setup_postdata ($post);
      $xmlWriter->startElement ('url');
      $xmlWriter->writeElement ('loc', get_permalink ($post->ID));
      $xmlWriter->writeElement ('lastmod', strstr ($post->post_modified, ' ', true));
      $xmlWriter->endElement ();
    }
    $xmlWriter->endElement ();
    $xmlWriter->endDocument ();
    $xmlWriter->flush ();
  }
  // Hook function selfCreateXmlSitemap to actions publish_page and publish_post
  add_action ('publish_page', 'selfCreateXmlSitemap');
  add_action ('publish_post', 'selfCreateXmlSitemap');
}
?>

Zugriffsrechte setzen

chown --recursive www-data:www-data /usr/share/wordpress/wp-content/plugins/self-xml-sitemap

Plugin aktivieren

https://wordpress.example.com/wp-admin/plugins.php
  SELF XML Sitemap - Aktivieren

Quellen

https://codex.wordpress.org/Writing_a_Plugin
https://developer.wordpress.org/plugins/
https://developer.wordpress.org/reference/
https://secure.php.net/manual/de/book.xmlwriter.php
https://www.sitemaps.org/protocol.html

WordPress Shortcode-Plugin – Kurzanleitung

Veröffentlichung 15. August 2018 @ 22:40
Letzte Änderung 28. August 2018 @ 23:32

Überblick

  • „Primitives“ Plugin für Shortcodes für den Zeitpunkt der Veröffentlichung und der letzen Änderung eines WordPress-Beitrags
  • Präfixe „self“ für PHP-Funktionen und „self-“ für Plugin-Verzeichnis, Plugin-Datei und Shortcodes

Voraussetzungen

Netzwerk

  • Website https://wordpress.example.com

Software

  • WordPress 4.9.8 #https://wordpress.example.com/wp-admin/update-core.php

Ordner und Dateien

  • Installation /usr/share/wordpress/wp-content/plugins/self-shortcodes

Plugin-Verzeichnis anlegen

mkdir /usr/share/wordpress/wp-content/plugins/self-shortcodes

Plugin-Datei erstellen

<?php
/*
Plugin Name: SELF Shortcodes
Description: Provide shortcodes 'self-modified' for last modification timestamp and 'self-published' for publishing timestamp
Version: 2018-08-15
Author: Thomas Fabian
Author URI: https://www.fabiblog.de
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
*/
if (!function_exists ('selfShortcodeModified'))
{
  function selfShortcodeModified ()
  {
    return get_the_modified_date () . ' @ ' . get_the_modified_time ();
  }
  if (!shortcode_exists ('self-modified'))
  {
    add_shortcode ('self-modified', 'selfShortcodeModified');
  }
}
if (!function_exists ('selfShortcodePublished'))
{
  function selfShortcodePublished ()
  {
    return get_the_date () . ' @ ' . get_the_time ();
  }
  if (!shortcode_exists ('self-published'))
  {
    add_shortcode ('self-published', 'selfShortcodePublished');
  }
}
?>

Zugriffsrechte setzen

chown --recursive www-data:www-data /usr/share/wordpress/wp-content/plugins/self-shortcodes

Plugin aktivieren

https://wordpress.example.com/wp-admin/plugins.php
  SELF Shortcodes - Aktivieren

Beispiel für Nutzung innerhalb eines Beitrags

...
<i>Veröffentlichung [self-published]</i>
<i>Letzte Änderung [self-modified]</i>
...

Quellen

https://codex.wordpress.org/shortcode
https://codex.wordpress.org/Writing_a_Plugin
https://developer.wordpress.org/plugins/
https://developer.wordpress.org/reference/

WordPress – Mail-Header Return-Path und X-Mailer mit Hook modifizieren

Die Mail-Funktion in WordPress hat zwei Nachteile. Zum einen weicht in bestimmten Fällen der Return-Path-Header vom From-Header ab, was zur empfängerseitigen Einordnung der versendeten E-Mails als Spam führen kann (siehe Fixing the WordPress Email Return-Path Header). Zum anderen gibt der per Voreinstellung mitgeschickte X-Mailer-Header potentiellen Angreifern unnötigerweise zusätzliche Informationen über das verwendete Mailprogramm.

Um den korrekten Return-Path-Header zu setzen und die Übertragung des X-Mailer-Headers zu unterdrücken, müssen wir nicht direkt in den Quelltext eingreifen, sondern können einen sogenannten „Hook“ nutzen. Mit Hooks ist die Erweiterung des WordPress-PHP-Codes an festgelegten Schnittstellen möglich. Der WordPress-Kern wird bei dieser Art der Programmierung nicht verändert und unsere Erweiterungen bleiben auch bei etwaigen Updates erhalten.

Man unterscheidet zwei Arten von Hooks, nämlich „Actions“ und „Filter“. Mit Actions kann man den WordPress-Kern um zusätzliche Funktionen ergänzen oder vorhandene Routinen anpassen. Sie werden durch bestimmte Ereignisse innerhalb von WordPress ausgelöst. Filter dienen dazu, Daten aus der Datenbank vor der Ausgabe im Browser zu modifizieren oder Eingabedaten aus dem Browser für die Datenbank aufzubereiten.

Für unsere Mail-Header-Modifikationen werden wir einen Action-Hook verwenden. Hierzu definieren wir eine Action-Funktion phpmailer_header_fix, die mit Hilfe der Hook-Funktion add_action() mit dem vordefinierten Ereignis phpmailer_init verknüpft wird. Mit dem Eintreten dieses Ereignisses erhalten wir Zugriff auf das Objekt $phpmailer, das für den E-Mail-Versand zuständig ist. Der zugehörige Programmcode lautet:

function phpmailer_header_fix($phpmailer)
{
  $phpmailer->Sender = $phpmailer->From;
  $phpmailer->XMailer = ' ';
}
add_action('phpmailer_init', 'phpmailer_header_fix');

Der $phpmailer-Eigenschaft Sender, die den Return-Path beinhaltet, weisen wir die Eigenschaft From zu und stellen damit sicher, dass der Inhalt der beiden Header identisch ist. Zur Unterdrückung des X-Mailer-Headers setzen wir die Eigenschaft XMailer auf '  '. Das Leerzeichen ist wichtig, da die Zuweisung einer komplett leeren Zeichenfolge nicht zum gewünschten Ergebnis führen würde.

Man kann die Action-Funktion(en) auch in einer Klasse kapseln. Die entsprechende Klassendefinition würde dann wie folgt aussehen:

class phpmailer_header
{
  function __construct()
  {
    add_action('phpmailer_init', array($this, 'fix'));    
  }
  function fix($phpmailer)
  {
    $phpmailer->Sender = $phpmailer->From;
    $phpmailer->XMailer = ' ';
  }
}
new phpmailer_header();

In diesem Fall wird add_action statt des Namens der Action-Funktion ein Array bestehend aus dem Objektnamen und der Methode fix übergeben.

Den Programmcode kann man beispielsweise in der Datei functions.php speichern, sinnvollerweise in einem Child Theme (siehe WordPress – Child Theme erstellen).

Die beschriebenen Header-Änderungen wurden unter WordPress Version 4.5.2 getestet. Weitere Informationen zu Hooks, Actions und Filtern sowie phpmailer_init finden sich im WordPress Codex über das Plugin API und in der Referenz Plugin API/Action Reference/phpmailer init.

WordPress – Avatar in Beitragsüberschrift anzeigen

Leider bietet WordPress in der Basisversion keine Option, einen Avatar des Autors in den Metainformationen unterhalb des Beitragstitels anzuzeigen. Diese Möglichkeit kann man durch die Erweiterung eines Child Themes mit dem nachfolgend beschriebenen Verfahren nachrüsten. Die Methode funktioniert auch direkt im Standard-Theme, bei einem Update des Themes gehen allerdings unsere Änderungen verloren.

Für die folgenden Ausführungen verwenden wir das Theme Twenty Fourteen unter WordPress Version 4.2.4.

Child Theme erstellen

Als Vorbereitung legen wir – falls noch nicht vorhanden – ein Child Theme Twenty Fourteen Child für das Standard-Theme / Parent Theme Twenty Fourteen an. Der Child Theme-Ordner heißt twentyfourteen-child und beinhaltet die beiden Dateien functions.php und style.css. Wir können hierbei z. B. nach der Anleitung WordPress – Child Theme erstellen vorgehen.

Avatar integrieren

Für die Darstellung der Metainformationen über Datum und Autor eines Beitrages im Standard-Theme Twenty Fourteen ist die Funktion twentyfourteen_posted_on in der Datei inc/template-tags.php verantwortlich. Die Abfrage if ( ! function_exists( ‚twentyfourteen_posted_on‘ ) ) : macht die Funktion „pluggable“, d. h. wir können sie mit einer eigenen gleichnamigen Funktion überschreiben. Hierbei machen wir uns zunutze, dass WordPress die Funktionen des Child Themes vor denen des Parent Themes lädt.

Wir kopieren zunächst die Funktionsdefinition von twentyfourteen_posted_on inkl. der if-Abfrage aus der Datei inc/template-tags.php im Parent Theme Twenty Fourteen an das Ende der Datei functions.php im Child Theme Twenty Fourteen Child. inc/template-tags.php finden wir im Administrationsbereich unter DesignEditor nach Auswahl von Twenty Fourteen als zu bearbeitendem Theme. Danach fügen wir vor der Ausgabeanweisung printf … die Zeile echo get_avatar(get_the_author_meta(‚ID‘), 32); ein. Der Aufruf von get_avatar liefert ein Bild des Autoren-Avatars mit einer Höhe und Breite von 32 Pixeln.

Unsere modifizierte Version von functions.php sollte schließlich wie folgt aussehen:

...
if (!function_exists('twentyfourteen_posted_on')):
function twentyfourteen_posted_on()
{
  if (is_sticky() && is_home() && !is_paged())
  {
    echo '<span class="featured-post">' . __('Sticky', 'twentyfourteen') . '</span>';
  }
  echo get_avatar(get_the_author_meta('ID'), 32);
  printf('<span class="entry-date"><a href="%1$s" rel="bookmark"><time class="entry-date" datetime="%2$s">%3$s</time></a></span><span class="byline"><span class="author vcard"><a class="url fn n" href="%4$s" rel="author">%5$s</a></span></span>',
    esc_url(get_permalink()),
    esc_attr(get_the_date('c')),
    esc_html(get_the_date()),
    esc_url(get_author_posts_url(get_the_author_meta('ID'))),
    get_the_author());
}
endif;

Avataranzeige anpassen

Die Anzeige des Avatars können wir noch mit zusätzlichen Einträgen in der Datei style.css im Child Theme individuell anpassen. Mit den nachfolgenden Formatanweisungen stellen wir beispielsweise den Autoren-Avatar rund dar und legen einen Abstand von 80% der Schriftgröße zu den übrigen Metainformationen fest:

...
div.entry-meta img.avatar {
        border-radius: 50%;
        margin-right: 0.8em;
}

Sollen die Kommentar-Avatare ebenfalls rund sein, ergänzen wir noch:

...
div.comment-author img.avatar {
        border-radius: 50%;
}

Falls wir die Avatar-Anzeige ausschalten möchten, fügen wir eine Zeile ein, in der wir der Eigenschaft display den Wert none zuweisen:

...
div.entry-meta img.avatar {
        border-radius: 50%;
        margin-right: 0.8em;
        display: none;
}

WordPress – Child Theme erstellen

Aufgrund der offenen und gut dokumentierten Architektur von WordPress sind die Designvorlagen („Themes“) weitestgehend an die eigenen Vorstellungen anpassbar. Um das Layout eines Blogs zu ändern oder neue Funktionen hinzuzufügen, kann man z. B. ein Theme direkt modifizieren oder geeignete Plugins installieren. In vielen Fällen ist jedoch die Nutzung eines sogenannten „Child Themes“ sinnvoller, die auch von den WordPress-Entwicklern im WordPress Codex über Child Themes empfohlen wird.

Ein Child Theme „erbt“ die Funktionen und Eigenschaften eines sogenannten „Parent Themes“, so dass wir keine komplett neue Designvorlage erstellen müssen. Darüber hinaus bleiben unsere Modifikationen und Erweiterungen auch bei einem Update des Parent Themes erhalten. Diesen Vorteilen steht ein im Vergleich zur direkten Änderung eines Themes höherer Aufwand gegenüber.

Wir werden im Folgenden exemplarisch ein Child Theme für das Theme Twenty Fourteen in WordPress 4.2.4 erstellen.

Verzeichnis und Dateien anlegen

Die einfachste Child Theme-Struktur besteht aus einem Child Theme-Verzeichnis mit den beiden Dateien style.css und functions.php. In der Stylesheet-Datei style.css werden die (CSS)-Layout-Vorgaben hinterlegt. Die Datei functions.php beinhaltet die (PHP)-Funktionen. Entsprechende Dateien existieren – neben weiteren – auch in den (Parent) Theme-Verzeichnissen, die bei der WordPress-Installation angelegt werden.

Das Child Theme-Verzeichnis wird wie die anderen Theme-Verzeichnisse in einem Unterordner des WordPress-Themes-Verzeichnisses /wp-content/themes gespeichert. In unserem Fall werden wir mit dem Theme Twenty Fourteen als Ausgangsbasis schließlich folgende Verzeichnisstruktur erhalten:

/wp-content
  ...
  /themes
    ...
    /twentyfourteen
    /twentyfourteen-child
      functions.php
      style.css
    ...
  ...

Direkter Serverzugang / Fernzugriff

Haben wir direkten Zugriff auf den WordPress-Server oder die Möglichkeit, uns per Telnet bzw. SSH einzuwählen, können wir die Child Theme-Installation mit Root-Rechten in einem Terminal-Fenster durchführen. Hierzu legen wir zuerst im WordPress-Themes-Verzeichnis einen neuen Ordner twentyfourteen-child mit den beiden leeren Dateien style.css und functions.php an. Bei einer typischen WordPress-Installation unter Ubuntu mit dem Themes-Verzeichnis /usr/share/wordpress/wp-content/themes verwenden wir die Anweisungen:

root@server:~# mkdir /usr/share/wordpress/wp-content/themes/twentyfourteen-child
root@server:~# touch /usr/share/wordpress/wp-content/themes/twentyfourteen-child/style.css
root@server:~# touch /usr/share/wordpress/wp-content/themes/twentyfourteen-child/functions.php

In die Datei style.css fügen wir folgende Zeilen ein, wobei die Einträge durch eigene Angaben zu ersetzen sind:

/*
 Theme Name:   Twenty Fourteen Child
 Theme URI:    ...
 Description:  ...
 Author:       ...
 Author URI:   ...
 Template:     twentyfourteen
 Version:      ...
 License:      ...
 License URI:  ...
 Tags:         ...
 Text Domain:  ...
*/

Am wichtigsten ist hierbei der Eintrag hinter Template:, der den Verzeichnisnamen des Parent Themes, in unserem Fall twentyfourteen, enthalten muss.

In die Datei functions.php schreiben wir folgenden PHP-Code:

<?php
add_action('wp_enqueue_scripts', 'theme_enqueue_styles');
function theme_enqueue_styles()
{
  wp_enqueue_style('parent-style', get_template_directory_uri() . '/style.css' );
}
?>

Hiermit wird die Stylesheet-Datei style.css des Parent Themes geladen. Das Laden der Stylesheet-Datei des Child Themes geschieht normalerweise automatisch. Ein zusätzlicher Aufruf von wp_enqueue_style ist daher in der Regel nicht erforderlich.

FTP-Zugang

Ist nur ein eingeschränkter Server-Zugang per FTP möglich, legen wir zunächst lokal auf unserem Rechner mit einem (Text-)Editor die Dateien style.css und functions.php mit den oben beschriebenen Inhalten an. Danach verbinden wir uns mit einem FTP-Client wie FileZilla mit dem Server, erzeugen dort das Verzeichnis twentyfourteen-child und laden die beiden Dateien hoch.

Child Theme aktivieren

Zur Umstellung auf unser Child Theme klicken wir im Administrations-Bereich von WordPress unter Design – Themes auf den Aktivieren-Button des Themes Twenty Fourteen Child. Nach dieser Änderung kann es vorkommen, dass unser Menü nicht mehr (vollständig) angezeigt wird. Zur Behebung des Problems müssen wir in Design – Menüs bei Anordnung im Theme (bei neueren WordPress-Versionen Position im Theme) die Häkchen gemäß den Einstellungen im Parent Theme Twenty Fourteen erneut setzen und das Menü speichern.

Nun können wir unter Design – Editor das Layout unseres Child Themes ändern. Mit folgender Ergänzung in der Datei style.css vergrößern wir beispielsweise die Breite der Hauptbereichs mit dem Inhaltsbereich, der Navigation, usw. von 474 auf 640 Pixel:

...
.site-content .entry-header,
.site-content .entry-content,
.site-content .entry-summary,
.site-content .entry-meta,
.page-content {
        margin: 0 auto;
        /* max-width: 474px; */
        max-width: 640px;
}
.post-navigation,
.image-navigation {
        margin: 24px auto 48px;
        /* max-width: 474px; */
        max-width: 640px;
        padding: 0 10px;
}
.archive-header,
.page-header {
        margin: 24px auto;
        /* max-width: 474px; */
        max-width: 640px;
}
.contributor-info {
        margin: 0 auto;
        /* max-width: 474px; */
        max-width: 640px;
}
.comments-area {
        margin: 48px auto;
        /* max-width: 474px; */
        max-width: 640px;
        padding: 0 10px;
}
.site-main .mu_register,
.widecolumn > h2,
.widecolumn > form {
        margin: 0 auto 48px;
        /* max-width: 474px; */
        max-width: 640px;
        padding: 0 30px;
}

WordPress – Menüeinträge ohne Inhalt

Ist ein WordPress-Blog mit einer mehrstufigen Menüstruktur aufgebaut, so sind oft Menüeinträge ohne speziellen Inhalt wünschenswert, die ausschließlich zu Gliederungszwecken eingesetzt werden. Leider ist ein solcher Eintragstyp in WordPress standardmäßig nicht vorhanden.

Eine einfache und elegante Lösung, um Menüpunkte zu erstellen, die keine Seiten, Links, Kategorien o. ä. enthalten, wird in dem Beitrag How to Add Titles in WordPress Menu Without Linking to a Page vorgestellt. Die dort beschriebene Vorgehensweise wird nachfolgend kurz zusammengefasst.

Wir legen zunächst im Administrations-Bereich unter Design – Menüs – Links einen Link mit einem beliebigen nichtleeren Text im Feld URL wie beispielsweise # und dem gewünschten Menüeintrag im Feld Linktext an und fügen ihn zum Menü hinzu. Danach löschen wir in der Menüstruktur in den Eigenschaften des individuellen Links den Eintrag im Feld URL. Weitere Änderungen sind nicht erforderlich.

Wie ein Blick in den HTML-Quelltext einer Seite mit einem derart erzeugten Menü zeigt, generiert WordPress bei einem leeren URL-Feld in einem Link-Eintrag einen sogenannten „Platzhalter“-Hyperlink ohne href-Attribut in der Form <a>Menüeintrag</a>. Dieser stellt gemäß der HTML-Sprachreferenz des W3C („World Wide Web Consortium“) zulässigen HTML-Code dar.

Die beschriebene Vorgehensweise funktioniert ab WordPress Version 4.2.4. Ältere Versionen habe ich (noch) nicht getestet.