it-swarm.com.de

Programmgesteuertes Festlegen der Seitenvorlage basierend auf der Seiten-ID

Wie würde ich die Seitenvorlage basierend auf der ID festlegen? Ich habe Redux Framework auf meiner Site installiert und eine der Optionen besteht darin, eine Registrierungsseite einzurichten. Auf dieser Seite möchte ich eine bestimmte Vorlage verwenden, auf anderen Seiten sollten jedoch die Standardvorlagen verwendet werden.

Ich habe es halb arbeiten lassen

add_filter( 'page_template', 'my_function' );
function my_function(){
  global $my_options;
  $page_id = get_queried_object_id();
  if ( $my_options['my-reg-page'] == $page_id ) {
    return get_template_directory() . '/reg-page.php'; 
  }
}

, dass für die betreffende Seite (die Seite mit der in $my_options['my-reg-page'] gespeicherten ID) die Seite festgelegt wurde, für die übrigen Seiten jedoch index.php als Vorlage und nicht die entsprechenden Seiten (single.php, page.php usw.) verwendet werden. Wenn ich die Bedingung außerhalb des Filters einstelle, wird die gesuchte Vorlage nicht angezeigt. Ich möchte das Speichern von Metadaten vermeiden, da ich den Code lieber in meine functions.php-Datei stecken würde, um ihn in mehreren Themen zu verwenden, die bei Bedarf unterschiedliche Seiten als relevante Seite verwenden würden. Ich weiß, dass es am einfachsten ist, das Thema direkt auf der Seite im Admin-Bereich festzulegen, aber das schafft so wie es ist mehrere Optionen. Ich hoffe, sie so weit wie möglich zu reduzieren.

Irgendein Rat? Ist es überhaupt möglich?

2
Nate

Ich musste für eines der Plugins, die ich entwickelte, etwas sehr Ähnliches tun. Ich habe während der Plugin-Aktivierung zwei separate Cpt registriert, und jeder dieser Cpt sollte eine benutzerdefinierte einzelne Vorlage verwenden, die ich mit der Plugin-Codebasis gebündelt hatte.

Sie sollten in der Lage sein, dasselbe für Seitenvorlagen zu tun, indem Sie den page_template Filter verwenden.

Hier ist meine Funktion, die den Filter single_template verwendet, der angepasst werden kann, um stattdessen page_template zu verwenden. Sie müssen lediglich die globale Variable $ post abrufen, um den Post-Typ oder die Post-ID zu überprüfen und dann eine Vorlage bereitzustellen, die auf diesen Daten basiert.

add_filter( 'page_template', 'custom_page_template' );
public function custom_page_template( $page_template ) {
        global $post;

        switch ( $post->ID) {

            default :
            case '2' : // page ID 2
                if( file_exists( get_stylesheet_directory() . '/single-event-template.php' ) ) {
                    $page_template = get_stylesheet_directory() . '/single-event-template.php'; 
                return $single_template;
            break;

            case '14' : // page ID 14
                $page_template= plugin_dir_path( dirname( __FILE__ ) ) . 'public/partials/single-event-location-template.php';
                return $page_template;
            break;

        } // end switch

}

Ich habe dies nicht mit Seitenvorlagen getestet, aber von der Codex-Seite aus scheint es so, als ob es funktionieren sollte.

In Anlehnung an Ihr Beispiel möchten Sie möglicherweise Folgendes ausprobieren:

add_filter( 'page_template', 'my_function' );
function my_function( $page_template ){
  global $post;
  $page_id = $post->ID;
  if ( $my_options['my-reg-page'] == $page_id ) {
    $page_template = get_template_directory() . '/reg-page.php'; 
  } else {
   $page_template = get_template_directory() . '/some-other-page-template.php'; 
  } 
  return $page_template;
}
2
EHerman