Verzeichnisse versus Permalinks: Wie man in WordPress Kollisionen vermeidet

Verzeichnisse versus Permalinks: Wie man in WordPress Kollisionen vermeidet 1

Liegen im WordPress-Verzeichnis andere Verzeichnisse (im Volksmund: Ordner), so funktionieren gleichlautende Permalinks nicht, denn der Server fragt deren Existenz ab, bevor er eine Anfrage an WordPress durchreicht.

Das ist selbst bei einer normalen Installation schon gegeben:

root/
	- index.php
	- wp-admin/
	- wp-content/
	- wp-includes/

Legen wir jetzt eine Seite mit dem Permalink wp-admin/ an, so ist diese nicht erreichbar. Wir sollten die Reihenfolge der Serverkontrolle – existierende Dateien und Verzeichnisse vor virtuellen – nicht ändern. Aber wir können verhindern, dass solche Permalinks überhaupt entstehen.

Es gibt einen Hook dafür. Eigentlich sogar drei. Sie tragen die schönen Namen wp_unique_post_slug_is_bad_hierarchical_slug, wp_unique_post_slug_is_bad_flat_slug und wp_unique_post_slug_is_bad_attachment_slug. Aufgerufen werden sie, ehe WordPress den Slug für den Permalink eines Beitrages oder Anhangs erzeugt.

Bei allen drei Hooks bekommen wir auf Wunsch zwei Argumente: einen boolschen Wert (ungefiltert FALSE) und den Slug. Geben wir dem Filter ein TRUE zurück, sagen WordPress also, dass dies ein schlechter Slug ist, so sucht es einen anderen. Dabei hängt es aufsteigende Zahlen an den ursprünglichen Slug, bis es einen findet, der nicht mit anderen Permalinks oder unserem Filter kollidiert.
Aus unserem wp-admin/ würde also wp-admin-2/.

Unsere Funktion zum Filtern kann ganz einfach aussehen:

add_filter(
    'wp_unique_post_slug_is_bad_hierarchical_slug',
    'marketpress_prevent_directory_slugs',
    10, 2
);

/**
 * Do not allow slugs matching existing directories.
 *
 * @author  MarketPress.com
 * @see     wp_unique_post_slug()
 * @wp-hook wp_unique_post_slug_is_bad_hierarchical_slug
 * @wp-hook wp_unique_post_slug_is_bad_flat_slug
 * @wp-hook wp_unique_post_slug_is_bad_attachment_slug
 * @param   bool   $bool Boolean value passed by the hook, default to false.
 * @param   string $slug
 * @return  bool   TRUE if there is a directory with the same name.
 */
function marketpress_prevent_directory_slugs( $bool, $slug )
{
    if ( is_dir( ABSPATH . '/' . $slug ) )
        return TRUE;

    return $bool;
}

Liegt die WordPress-Installation in einem separaten Verzeichnis, muss der Pfad freilich angepasst werden.

Weil dieser Code keine Benutzeroberfläche braucht und nach dem Aktivieren einfach läuft, haben wir ihn in unser Repository Mini-Plugins auf GitHub gestellt. Du kannst ihn aber auch hier als separates Plugin herunterladen: Protect directory URLs.

Newsletter abonnieren

Das könnte dich auch interessieren

Lokale Installation von WordPress und WooCommerce

Über eine lokale Installation von WordPress auf deinem Computer kannst du WooCommerce testen, Updates einspielen und Anpassungen durchführen - alles r ...

Mehr erfahren

WooCommerce einrichten Teil 1 - Grundeinstellungen & Produkte

Aktualisiert am 14.12.2020 Die Onlineshop-Erweiterung WooCommerce ist ein mächtiges Werkzeug mit unzähligen Einstellungsmöglichkeiten. Der nachfolgen ...

Mehr erfahren

Online-Kurse mit WordPress erstellen und mit WooCommerce verkaufen

Online-Kurse sind zeitgemäß und vermitteln ortsunabhängiges Wissen an Lernende. Über den Verkauf von Online-Kursen mit WooCommerce kannst du dein eigen ...

Mehr erfahren

Kommentare

3 Kommentare

  1. Sehr praktisch! Danke.
    Innerhalb der Redirects gibt es natürlich auch eine Hierarchie/Reihenfolge. Die zusätzlichen Standardweiterleitungen (/login und /admin), die ebenfalls auf wp-login.php weiterleiten, werden z.B. von Beiträgen/Seiten mit gleichem Start torpediert …
    Kann man das ähnlich lösen?

  2. Klar, du kannst auch TRUE zurückgeben, wenn 'login' === $slug und so weiter.

  3. Klasse Tipp! Und was für geile Namen für die Hooks 😉 Die gehören vermutlich zu den längsten überhaupt im Core oder gibt es noch längere?

Schreibe eine Antwort an Torsten Antwort abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Du kannst folgende HTML Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>