23.3.3. trailingslashit() & untrailingslashit()

Auch untrailingslashit() und trailingslashit() sind eher weniger bekannt. Beide Funktionen machen etwas total simples, was aber immer wieder benötigt wird.

<?php
function untrailingslashit( $string ) {
	...
}
?>
<?php
function trailingslashit( $string ) {
	...
}
?>

Es gilt jeweils:

  • $string (string)
    Eine URL an die ein Slash angehängt oder entfernt werden soll.

Zurückgegeben wird der Eingabe-String mit oder ohne endenden Slash (/).

Beispiel:

Die WordPress Funktion rest_url() gibt in der Regel die URL zur REST-API ohne endenden Slash aus. In einem meiner Plugins schrieb ich den Wert mittels wp_add_inline_script() in eine Variable. Der Output sah dann ungefähr so aus:

var MM_OPTIONS = { "rest_url": "https://example.com/wp-json" };

Mittels jQuery konnte ich dann darauf zugreifen und einen AJAX-Request absetzen:

jQuery.ajax( {
  'url':  MM_OPTIONS.rest_url + '/path/to/route'
} );

Irgendwann meldete sich ein Kunde bei mir, dass es ihm nicht möglich sei, mein Plugin vollständig zu nutzen. Es stellte sich heraus, dass ein Dritthersteller-Plugin den rest_url-Filter nutzte und die Funktion trailingslashit() darauf anwendete.

Das Resultat war, dass meine JavaScript-Dateien nicht mehr funktionierten, da diese eine Anfrage an

https://example.com/wp-json//path/to/route

stellten (mit doppeltem Slash). Manchmal werden solche doppelten Slashes auch von Webservern gefiltert. Das passierte in diesem Fall allerdings auch nicht. Dadurch Schlug jeder Aufruf an jeden REST-API Endpunkt fehl.

Die Lösung war, die untrailingslashit()-Funktion darauf anzuwenden:

<?php
$vars = [
	'rest_url' => untrailingslashit( rest_url() )
];

wp_add_inline_script(
	'wpb-rs-admin-posts',
	"var MM_OPTIONS = " . json_encode( $vars ) . ";",
	'before'
);
?>