Je veux savoir s'il est possible d'obtenir l'ID d'une page avec un modèle spécifique. Est-ce possible d'obtenir l'ID d'une page ayant assigné "page-special.php"?
Lorsqu'une page est créée, le modèle attribué à cette page est enregistré en tant que méta de publication personnalisé, de la même manière que les champs personnalisés. Le meta_key
est _wp_page_template
et le meta_value
sera le modèle de page.
Vous pouvez simplement utiliser get_pages
pour récupérer toutes les pages qui ont un meta_value
du modèle spécifié.
$pages = get_pages(array(
'meta_key' => '_wp_page_template',
'meta_value' => 'page-special.php'
));
foreach($pages as $page){
echo $page->ID.'<br />';
}
Si vous n'avez besoin que des identifiants de page, vous utilisez alors get_posts
, puis vous ne passez que page
en tant que post_type
et la valeur 'idsas
fields`. Cela assurera une requête beaucoup plus rapide et beaucoup plus optimisée, car nous ne renverrons que la colonne post id dans la base de données et pas toutes pour les pages données.
( Nécessite PHP 5.4+ )
$args = [
'post_type' => 'page',
'fields' => 'ids',
'nopaging' => true,
'meta_key' => '_wp_page_template',
'meta_value' => 'page-special.php'
];
$pages = get_posts( $args );
foreach ( $pages as $page )
echo $page . '</br>';
Si votre modèle de page se trouve dans un sous-dossier, dossier-thème/page-templates/page-template.php, la requête ci-dessous fonctionnera:
$page_details = get_pages( array(
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'hierarchical' => 0,
'meta_value' => 'page-templates/page-template.php'
));
Les codes ci-dessus affichent également des sous-pages.
Merci
Ce qui suit est un script légèrement plus articulé qui prend en compte une langue, si nécessaire. Notez que cela suppose l'utilisation de Polylang, pas de WPML.
function get_post_id_by_template($template,$lang_slug = null){
global $wpdb;
$wh = ($lang_slug) ? " AND t.slug = %s" : "";
$query = $wpdb->prepare(
"SELECT DISTINCT p.ID
FROM $wpdb->posts p
INNER JOIN $wpdb->postmeta meta ON meta.post_id = p.ID
INNER JOIN $wpdb->term_relationships tr ON meta.post_id = tr.object_id
INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN $wpdb->terms t ON tt.term_id = t.term_id
WHERE p.post_status = 'publish' AND meta.meta_key = %s AND meta.meta_value = %s" . $wh,
'_wp_page_template',
$template,
$lang_slug
);
$ids = $wpdb->get_results($query);
if($ids && isset($ids[0])){
$p = $ids[0];
return $p->ID;
} else {
return false;
}
}// get_post_id_by_template