web-dev-qa-db-fra.com

Définir un modèle de page par programme en fonction de l'ID de page

Comment définir le modèle de page en fonction de l'ID? Redux Framework est installé sur mon site et l’une des options consiste à définir une page d’enregistrement. Sur cette page, je souhaite utiliser un modèle spécifique, mais sur d'autres, il convient d'utiliser les modèles par défaut.

Je l'ai eu à moitié travailler avec

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'; 
  }
}

en ce que la page en question (celle avec l'ID stocké dans $my_options['my-reg-page']) a la page définie, mais les pages restantes utilisent index.php comme modèle et non les pages appropriées (single.php, page.php, etc.). Si je mets la condition en dehors du filtre, le modèle que je recherche ne sera pas affiché. Je souhaite éviter d'enregistrer des métadonnées, car je préférerais insérer le code dans mon fichier functions.php afin de l'utiliser dans plusieurs thèmes, qui utiliseraient différentes pages en tant que page appropriée, le cas échéant. Je sais que le moyen le plus simple de le faire est de définir le thème directement sur la page dans la zone d'administration, mais cela crée plusieurs options telles quelles. J'espère les réduire autant que possible.

Aucun conseil? Est-ce même possible?

2
Nate

Je devais faire quelque chose de très similaire pour l'un des plugins que je développais. J'ai enregistré deux cpt distincts lors de l'activation du plug-in, et chacun de ces cpt devrait utiliser un seul modèle personnalisé que j'avais fourni avec la base de code du plug-in.

Vous devriez pouvoir faire la même chose pour les modèles de page, en utilisant le filtre page_template .

Voici ma fonction utilisant le filtre single_template, qui peut être ajusté pour utiliser page_template à la place. Vous aurez simplement besoin de saisir la variable $ post globale afin de pouvoir vérifier le type ou l'ID de publication, puis de servir un modèle basé sur ces données.

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

}

Je n'ai pas testé cela avec des modèles de page, mais depuis la page du codex, cela semble fonctionner.

En vous basant sur votre exemple, vous voudrez peut-être essayer quelque chose de similaire au suivant:

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