WordPress-404-Meldungen bei geÄnderten Weblog-Posting-URLs abfangen

Heute liebe Kinder erzähle ich Euch was, von dem ich wenig Ahnung habe. Also eigentlich wie immer.

Vor kurzem habe ich aus SEO-Gründen meine Weblog-Posting-URLs von Ziffern auf sprechende URLs umgestellt.

Mein Weblog hier läuft mit WordPress. Die Umstellung ging sehr gut über „Dean’s Permalinks Migration 1.0„. Trotzdem habe ich noch ein paar Umlaute umgestellt teilweise, was zunächst so aussah als ob es funktioniert, ein paar Tage später aber doch zu 404-Fehlermeldungen geführt hat.

Und in den Google Webmaster Tools wurden mir gleich mal 481 tote Hyperlinks angezeigt. Hilfe!

Uwe arbeitet in PHP!

Nach ein Bisschen Recherche, erfolglosen mod_rewrite-Arbeiten und ein Bisschen PHP-Auffrischungen habe ich mich dazu entschlossen die „functions.php“-Datei in meinem Theme anzupassen.

Also die Datei die in „wp-content/themes/ThemeName/functions.php“ liegt.

Meine Idee war, bei einem Hook einzusteigen und dann ganz quick-and-dirty String-Ersetzungen zu machen und dann eine HTTP-301-Anwort zu senden.

Das hat gut geklappt. Falls Ihr das auch mal benötigt, hier der Ausschnitt aus der „functions.php“:

add_action('template_redirect', 'check_for_404');

function check_for_404()
{
  if ( is_404() )
  {
    checkRedirectSubstringReplace("%c2%abwo-genau-liegt-denn-dieses-internet%c2%bb", "wo-genau-liegt-denn-dieses-internet");
    checkRedirectSubstringReplace("ein-erster-test-naturlich", "ein-erster-test-natuerlich");
    checkRedirectSubstringReplace("noch-12-tage-20-rabatt", "noch-12-tage-20-prozent-rabatt" );
    checkRedirectSubstringReplace("40%C2%B0-fieber", "40-grad-fieber" );
    checkRedirectSubstringReplace("fuchs-uberfahren", "fuchs-ueberfahren" );
    checkRedirectSubstringReplace("skript-programmierer-job-nahe-stuttgart", "skript-programmierer-job-naehe-stuttgart" );
    checkRedirectSubstringReplace("krane-vorm-businesshaus", "kraene-vorm-businesshaus" );
    checkRedirectSubstringReplace("fremdworter", "fremdwoerter" );
    checkRedirectSubstringReplace("ich-bin-beruhmt", "ich-bin-beruehmt" );
    checkRedirectSubstringReplace("zotter-schokolade-in-goppingen", "zotter-schokolade-in-goeppingen" );
    checkRedirectSubstringReplace("gunther-sucht-was", "guenther-sucht-was" );
    checkRedirectSubstringReplace("schoner-parken", "schoener-parken" );
    checkRedirectSubstringReplace("16%C2%B0-c", "minus-16-grad-celcius" );
    checkRedirectSubstringReplace("minus-17-%c2%b0c", "minus-17-grad-celcius");
    checkRedirectSubstringReplace("werbemull-report-vom-12-marz-2010", "werbemuell-report-vom-12-marz-2010" );
    checkRedirectSubstringReplace("phanomene-bei-vollem-internet-explorer-cache", "phaenomene-bei-vollem-internet-explorer-cache" );
    checkRedirectSubstringReplace("offnungszeiten-rathaus-eislingen", "oeffnungszeiten-rathaus-eislingen" );
    checkRedirectSubstringReplace("das-langste-wort-der-welt", "das-laengste-wort-der-welt" );
    checkRedirectSubstringReplace("das-windows-forms-net-aquivalent-zu-spy", "das-windows-forms-net-aequivalent-zu-spy" );
    checkRedirectSubstringReplace("ausflug-zur-ph%C3%A6no-nach-wolfsburg", "ausflug-zur-phaeno-nach-wolfsburg" );
    checkRedirectSubstringReplace("%C2%ABwer-magerquark-hat-hat-die-welt-verstanden%C2%BB", "wer-magerquark-hat-hat-die-welt-verstanden" );
    checkRedirectSubstringReplace("uberprufen-ob-eine-website-komprimiert-ist", "ueberpruefen-ob-eine-website-komprimiert-ist" );
    checkRedirectSubstringReplace("ueberprufen-ob-eine-website-komprimiert-ist", "ueberpruefen-ob-eine-website-komprimiert-ist" );
    checkRedirectSubstringReplace("werbemull-report-vom-21-marz-2010", "werbemuell-report-vom-21-marz-2010" );
    checkRedirectSubstringReplace("zeta-producer-desktop-8---beta-version-verfugbar", "zeta-producer-desktop-8-beta-version-verfuegbar" );
    checkRedirectSubstringReplace("zeta-producer-desktop-8-%E2%80%92-beta-version-verfugbar", "zeta-producer-desktop-8-beta-version-verfugbar" );

    checkRedirectFull("archive/1002215", "/" );
    checkRedirectFull("archive/592", "/" );
    checkRedirectFull("index.php/archive", "/" );
    checkRedirectFull("index.php/page", "/" );
    checkRedirectFull("archive/date", "/" );

    checkRedirectFull("archive/388", "/" );
    checkRedirectFull("/archive", "/" );
  }
}

function doesMatchSubStringUrl( $urlMatch )
{
  $url = $_SERVER["REQUEST_URI"];

  if( stripos($url, $urlMatch)===false )
  {
    return false;
  }
  else
  {
    return true;
  }
}

function checkRedirectFull( $old, $new )
{
  if ( doesMatchSubStringUrl( $old )===true )
  {
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $new);
    exit;
  }
}

function checkRedirectSubstringReplace( $old, $new )
{
  if ( doesMatchSubStringUrl( $old )===true )
  {
    $new_url = str_replace($_SERVER["REQUEST_URI"], $old, $new);

    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $new_url);
    exit;
  }
}

Frage an alle PHP-WordPress-Gurus da draußen: gibt es einen klevereren Weg?

Ressourcen

Folgende Infos haben mir geholfen:

4 Gedanken zu „WordPress-404-Meldungen bei geÄnderten Weblog-Posting-URLs abfangen

  1. Ich hatte das gleiche Problem bei Joomla… mit kleinen Änderungen kann man aber auch hier da was mit deiner Lösung anfange! Vielen Danke dafür.

    Gruß Sascha

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.