WordPress Template-Dateien innerhalb Themes verschieben oder umbenennen

Baut man an einem größerem Theme welches Seitentemplates enthält, kann es nach einer Weile passieren, dass man diese Templates umbenennen oder in ein Unterverzeichnis verschieben möchte.

Dies ist bei neuen Websites kein Problem; Dort merkt man dann in der Regel nichts. Wenn man dagegen das Theme bei einer schon bestehenden Websites aktualisiert, kommt es zu einem Problem: Beim Aufruf der Seite mit dem verschobenen Template wird dieses nicht mehr gefunden. (Als Fallback wird dann das normale Seitentemplate aus „page.php“ verwendet).
Man muss also bei einer neuen Themeversion versuchen, abwärtscompatibel zu bleiben.

Die Information welches Template eine Seite verwendet, wird standardmäßig in der Post Meta Data „_wp_page_template“ gespeichert. Hier findet sich dann auch der Ansatz zur Lösung des Problems: Mit einem Filter auf „page_template“ wird geprüft, ob die aufzurufene Seite einen Eintrag in der „_wp_page_template“ hat und ob der Eintrag zu dem Template gehört, dessen Namen oder Ort geändert wurde.

Folgende Funktion hab ich hierzu erstellt:

/* Compatibility for old theme versions */
add_filter('page_template', 'mytheme_page_template');
function mytheme_page_template($t) {
    $compatlist = array(
        'impressum.php' => 'templates/imprint.php',
        'datenschutzerklaerung.php' => 'templates/privacy-policy.php'
    );
    $page_id = get_queried_object_id();
    $template = get_post_meta($page_id, '_wp_page_template', true);
    
    if($template && 'default'!= $template) {
        foreach ( $compatlist as $key => $value ) { 
            if ($key == $template) {
                 if(file_exists(trailingslashit(STYLESHEETPATH) . $value)){
                    $t = trailingslashit(STYLESHEETPATH) . $value;
                } elseif(file_exists(trailingslashit(TEMPLATEPATH) . $value)) {
                    $t = trailingslashit(TEMPLATEPATH) . $value;
                }
            }
        } 
    }
    return $t;
}

Beim Aufruf einer Seite wird also geschaut welches Template verwendet wird. Wenn das Template nicht „default“ ist wird das Array $compalist() geprüft, welches als Key den alten Namen und als Value den neuen Namen hat.