wake-up-neo.com

Festlegen der Seitenvorlage automatisch basierend auf dem übergeordneten Element

Wie der Titel andeutet, versuche ich, jede neue Seite unter X übergeordnet auf eine bestimmte Seitenvorlage festzulegen. Entweder über eine Funktion/Plugin/Code

beispiel: Wenn ich eine "Schweizer Käse" -Seite erstelle, die ein untergeordnetes Element der "Schach" -Seite ist, weist wp dieser automatisch die Seitenvorlage "Käse" zu

5
alme1304

Auf der Administratorseite können Sie die Metadaten für den page-post_type programmgesteuert aktualisieren:

global $post;
if ( 
    'swiss_cheese' === $post->post_parent 
    AND is_admin()
)
    update_post_meta( $post->ID, '_wp_page_template', 'some_template.php' );

Auf der dem Besucher zugewandten Seite können Sie einfach in die Vorlagenumleitung springen:

function wpse63267_template_include( $template )
{
    global $post;

    if ( 'swiss_cheese' === $post->post_parent )
    {
        $new_template = locate_template( array( 'swiss-cheese-template.php' ) );
        if ( ! empty( $new_template ) ) {
            return $new_template ;
        }
    }
    return $template;
}
add_filter( 'template_include', 'wpse63267_template_include', 99 );
5
kaiser

ich habe die lösung von kaiser mit einer anderen lösung aus dem netz kombiniert, um sie dynamischer und kugelsicherer zu machen.

außerdem steht im wp-Codex: Das Laden einer anderen Vorlage mit dem Aktions-Hook template_redirect ist keine gute Verwendung. Wenn Sie eine andere Vorlage einbinden und dann exit () (oder die ()) verwenden, werden keine nachfolgenden template_redirect-Hooks ausgeführt ...

Und ich habe diese Dynamik zur Hölle gemacht. Sie können sagen: Kinder von Seite X verwenden die Vorlage Z. Wenn Sie jedoch set eine Vorlage für ein Kind von Seite X in der Administrationsoberfläche festlegen, verwenden Sie diese Vorlage (für genau dieses Kind).

Hier ist eine Lösung (wenn Kind von Seite X weiterleiten ...)

function jnz_is_child( $pid ) {
    global $post;
    $ancestors = get_post_ancestors( $post->$pid );
    $root = count( $ancestors ) - 1;
    $parent = $ancestors[$root];
    if( is_page() && ( $post->post_parent === $pid || in_array( $pid, $ancestors ) ) ) {
        return true;
    } else {
        return false;
    }
};
function wpse140605_template_redirect( $template ) {
    if ( $template === locate_template('page.php') ) { // if template is not set in admin interface
        if ( jnz_is_child( 656 ) || jnz_is_child( 989 ) ) {
            $new_template = locate_template( array( 'page-whatever.php' ) ); // if template file exist
            if ( '' != $new_template ) {
                return $new_template ;
            }
        }
    }
    return $template;
};
add_filter( 'template_include', 'wpse140605_template_redirect', 99 );

Grundsätzlich überprüfe ich in der ersten Funktion jnz_is_child() anhand der Seiten-ID, ob die Seite ein untergeordnetes Element von Seite X (oder sogar ein untergeordnetes Element von X ..) ist.

Und in der zweiten Funktion wpse140605_template_redirect() mache ich den Ersatz (wenn Seite Eltern === 656 oder === 989: Vorlage page-whatever.php verwenden). Natürlich kann die zweite Funktion mehrere if / else if-Abschlüsse enthalten, und diese Funktion prüft, ob die Vorlagendatei vorhanden ist. Denn wenn es nicht existiert, wird PHP einen Fehler auslösen.

Und die erste Funktion ist auch überall innerhalb des Themas verwendbar (wie is_page() etc.).

Hier ist eine weitere untergeordnete Variante, bei der sogar das aktuelle Element ausgewählt ist (eine Kombination aus is_page und is_child):

function jnz_is_child( $pid ) {
  global $post;
    $ancestors = get_post_ancestors( $post->$pid );
    if( is_page() && ( is_page( $pid ) || $post->post_parent === $pid || in_array( $pid, $ancestors ) ) ) {
      return true;
    } else {
      return false;
    }
};
0
honk31