J'ai créé un modèle nommé product.php
avec l'en-tête suivant:
<?php
/*
Template Name: Product Page
*/
Comment puis-je lister, dans une barre latérale, chaque page qui utilise le modèle "Product Page"?
J'ai essayé de lire la documentation de la fonction wp_list_pages()
, mais il semblait seulement possible de lister le filtrage par post_type
et non par le modèle utilisé.
Vous pouvez le faire avec un WP_Query
meta_query
. Le nom de fichier du modèle de page est stocké dans post meta sous la clé _wp_page_template
:
$args = array(
'post_type' => 'page',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_wp_page_template',
'value' => 'product.php'
)
)
);
$the_pages = new WP_Query( $args );
if( $the_pages->have_posts() ){
while( $the_pages->have_posts() ){
$the_pages->the_post();
the_title();
}
}
wp_reset_postdata();
le modèle de page est défini via un champ méta avec la clé '_wp_page_template'
. La valeur de ce champ méta est le nom de fichier complet php du fichier de modèle, quelque chose comme
'page-products.php'
vous pouvez donc créer une fonction personnalisée pour obtenir facilement la page avec un modèle spécifique en utilisant meta_key et meta_value param off get_pages
(ou en utilisant un WP_Query
avec un argument 'meta_query'
):
get_pages_by_template( $template = '', $args = array() ) {
if ( empty($template) ) return false;
if ( strpos($template, '.php') !== (strlen($template) - 4) ) $template .= '.php';
$args['meta_key'] = '_wp_page_template';
$args['meta_value'] = $template;
return get_pages($args);
}
Cette fonction accepte comme premier argument (obligatoire) le modèle et comme second argument (facultatif) tous les arguments de get_pages .
le modèle peut être passé avec ou sans l'extension '.php':
$pages = get_pages_by_template('page-products');
ou
$pages = get_pages_by_template('page-products.php');
Ensuite, vous pouvez utiliser la page récupérée à votre guise: parcourez-la et affichez des balises, créez un widget personnalisé utilisant la fonction, etc.