web-dev-qa-db-fra.com

_wp_page_template pour utiliser le modèle de manière dynamique

Je me demande s'il est possible de définir l'affichage d'un modèle de page choisi par l'utilisateur dans le contexte d'un query_posts utilisant get_template_part. En d'autres termes, j'ai configuré un modèle de page pour extraire toutes ses pages enfants et les afficher, mais j'ai besoin que chaque page enfant s'affiche en fonction du modèle de page choisi dans l'éditeur de page. Y a-t-il un moyen d'y arriver? Voici le code que j'ai pour le modèle de page parent jusqu'à présent.

<?php 
  $this_page=get_query_var('page_id');
  query_posts( array('post_type'=>'page', 'posts_per_page' => -1, 'post_parent' => $this_page, 'orderby' => 'menu_order', 'order' => 'ASC') ); 
  if(have_posts()): while(have_posts()): the_post(); 
?>

<?php get_template_part('_wp_page_template'); ?>

<?php endwhile; endif; ?>

Comme vous pouvez le constater, la requête extrait toutes les pages enfants. J'aimerais savoir comment afficher chacune de ces pages enfants en fonction du modèle de page qu'elles ont choisi.

Merci.

2
Jesse Winton

Tout d’abord, n’utilisez jamais query_posts, il écrase la requête principale et peut avoir des effets secondaires indésirables. Utilisez WP_Query à la place.

_wp_page_template est une méta clé de publication. La première chose à faire est donc de charger la valeur stockée dans cette clé pour chaque page, en utilisant get_post_meta. Cela nous donnera le nom du fichier, que nous pouvons ensuite essayer de charger.

$this_page = get_queried_object_id();
$child_pages = new WP_Query(
    array(
        'post_type'=>'page',
        'posts_per_page' => -1,
        'post_parent' => $this_page,
        'orderby' => 'menu_order',
        'order' => 'ASC'
    )
);
if( $child_pages->have_posts() ){
    while( $child_pages->have_posts() ){
        $child_pages->the_post();

        // get the filename stored in _wp_page_template
        $template = get_post_meta( get_the_ID(), '_wp_page_template', true );

        // load the file if it exists
        locate_template( $template, true, false );

    }
    // restore the global $post after secondary queries
    wp_reset_postdata();
}
0
Milo

Afin de sauvegarder le modèle de page (une partie) de l’administrateur, j’utiliserais un champ méta personnalisé et enregistrerais le nom de template_part dans chaque page/publication. Ensuite, appelez la méta de poste dans le modèle et transmettez-la à get_template_part.

// meta saved in admin is "child_template_type => "child_part_one"
// where the meta_key = "child_template_type"
// and meta_value = "child_part_one"

$part = get_post_meta($this_id, 'child_template_type');

get_template_part($part); // same as get_template_part('child_part_one')

Je recommanderais l'utilisation de champs personnalisés avancés. Créez un groupe de champs avec une option de sélection et entrez manuellement les noms de template_part. De cette façon, vous pouvez stocker la valeur en tant que nom de fichier pièce réel et permettre à l'utilisateur de voir un nom agréable pour chacun

child_part_one : View One
child_part_two : View Two
  1. Créez un groupe de champs appelé "éléments de modèle de liste d'enfants" (ou quelque chose;))
  2. Ajoutez un nouveau champ avec Choice> Select comme type de champ et nommez-le "child_template_part"
  3. Définir les options (ci-dessus) dans le champ "Choix"
  4. Ajouter les règles de type de publication dans la section "Emplacement"
  5. Enregistrez le groupe de champs et éditez votre publication/page pour sélectionner la partie du modèle.

Pour obtenir le modèle de pièce à l'aide d'ACF

$part = get_field('child_template_part', $this_id);
get_template_part($part);
0
JoshuaDoshua