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.
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();
}
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
Pour obtenir le modèle de pièce à l'aide d'ACF
$part = get_field('child_template_part', $this_id);
get_template_part($part);