WordPress: So erstellst du Rewrite Rules mit PHP

Marc Wag­ner

Juli 14, 2022

2 min read|

In Word­Press kannst du mit­tels PHP eige­ne Rewri­te­Rules erstel­len, um so indi­vi­du­el­le URLs zu gene­rie­ren. Dafür sind ledig­lich 3 Schrit­te not­wen­dig. In die­sem Arti­kel erklä­re ich, wie du unkom­pli­ziert eige­ne Rewri­te­Rules über PHP für dei­ne Word­Press Web­sei­te erstel­len kannst.

Anlegen der Rewrite Rules #

Word­Press bie­tet für das anle­gen von Rewri­te­Rules die Funk­ti­on add_rewrite_rule an.

add_rewrite_rule(string $regex, string|array $query, string $after = 'bottom');

Dadurch kön­nen wir jeder­zeit eige­ne Rewri­te Rules erzeu­gen. Wir ver­wen­den die­se Funk­ti­on, indem wir sie in unse­rer functions.php imple­men­tie­ren.

Inhalte einer anderen Seite laden

add_action('init', function(){
    add_rewrite_rule('job/([a-zA-Z0-9\-]+)/bewerben', 'index.php?pagename=jetzt-bewerben&job-name=$matches[1]','top');
});

In unse­rem Bei­spiel oben erstel­len wir nun eine neue Rewri­te Rule, die beim Auf­ruf einer URL in die­sem For­mat ‘https://meine-domain-xyz.de/job/elektriker-m‑w‑d/bewerben’ den Inhalt der Sei­te ‘https://meine-domain-xyz.de/jetzt-bewerben’ aus­gibt. Hier­für dient der Para­me­ter “page­na­me”.

Zusätz­lich tei­len wir Word­Press mit, dass der Wert zwi­schen ‘job’ und ‘bewer­ben’ als GET Para­me­ter mit der Bezeich­nung ‘job-name’ über­ge­ben wer­den soll. Damit wir die­sen Par­am­ter in Word­Press ver­wen­den kön­nen, müs­sen wir dem Sys­tem mit­tei­len, dass die­ser Para­me­ter exis­tiert.

Ein eigenes Template laden

Alter­na­tiv kannst du über dei­ne Rewri­te Rule auch ein indi­vi­du­el­les Tem­p­la­te laden. Hier­für musst du ledig­lich den Action-Hook ‘template_include’ ver­wen­den und das Tem­p­la­te, das du ver­wen­den möch­test inte­grie­ren.

add_action( 'template_include', function( $template ) {
    if ( false == get_query_var( 'job-name' ) || '' == get_query_var( 'job-name' )) {
        return $template;
    }
 
    return get_template_directory() . '/page-job-name.php';
});

Jetzt wird immer dann, wenn in der Abfra­ge der Para­me­ter ‘job-name’ vor­kommt, das Tem­p­la­te ‘page-job-name.php’ gela­den und aus­ge­ge­ben.

Anfrage Parameter (query vars) definieren #

In der oben erstell­ten Rewri­te Rule haben wir einen neu­en Para­me­ter ‘job-name’ defi­niert. Um die­sen ver­wen­den zu kön­nen, müs­sen wir ihn jedoch zunächst bei Word­Press regis­trie­ren. Dafür ver­wen­den wir den Fil­ter ‘query_vars’ und ergän­zen das Array um unse­ren eige­nen Para­me­ter.

add_filter('query_vars', function($query_vars){
    $query_vars[] = 'job-name';
    return $query_vars;
});

Über ‘get_query_var’ kön­nen wir dann unse­ren Para­me­ter ein­fach und unkom­pli­ziert abfra­gen.

Rewrite Rules Cache leeren #

Zuletzt müs­sen wir noch den Cache für die Rewri­te Rules neu laden. Hier­für kön­nen wir ent­we­der die Funk­ti­on flush_rewrite_rules ver­wen­den, oder aber ein­fach im Word­Press Dash­board > Ein­stel­lun­gen > Per­ma­links den “Spei­chern” But­ton betä­ti­gen.

Wich­tig: Falls du dich dafür ent­schei­dest, die Funk­ti­on flush_rewrite_rules zu ver­wen­den, soll­test du dar­auf ach­ten, die­se auch wie­der zu ent­fer­nen. Ansons­ten wer­den die Rewri­te Rules bei jedem Laden dei­ner Word­Press Web­sei­te neu erzeugt und beein­träch­ti­gen die Per­for­mance dei­ner Web­sei­te.

Fazit #

Das war es auch schon. Word­Press erlaubt es dank sei­ner Modu­la­ri­tät schnell und unkom­pli­ziert eige­ne Rewri­te Rules zu defi­nie­ren, die wir auf unse­re Bedürf­nis­se anpas­sen kön­nen. Hast du bereits ein­mal eige­ne Rewri­te Rules erzeugt oder hast du wei­te­re Anre­gun­gen, dann las es uns ger­ne wis­sen.

88e86fcb816eff22bc917094df2862d8dd5c0e978b333e6dd5f36f808990c261 96

Arti­kel von:

Marc Wag­ner

Hi Marc here. I’m the foun­der of Forge12 Inter­ac­ti­ve and have been pas­sio­na­te about buil­ding web­sites, online stores, appli­ca­ti­ons and SaaS solu­ti­ons for busi­nesses for over 20 years. Befo­re foun­ding the com­pa­ny, I alre­a­dy work­ed in publicly lis­ted com­pa­nies and acqui­red all kinds of know­ledge. Now I want to pass this know­ledge on to my cus­to­mers.

Hast du eine Fra­ge? Hin­ter­lass bit­te einen Kom­men­tar