Je veux savoir s'il est possible d'obtenir l'ID d'une page avec un modèle spécifique. Est-il possible d'obtenir l'ID d'une page affectée à "page-special.php"?
Je veux savoir s'il est possible d'obtenir l'ID d'une page avec un modèle spécifique. Est-il possible d'obtenir l'ID d'une page affectée à "page-special.php"?
Réponses:
Lorsqu'une page est créée, le modèle attribué à cette page est enregistré en tant que méta de publication personnalisée de la même manière que les champs personnalisés. Le meta_keyest _wp_page_templateet le meta_valuesera le modèle de page
Vous pouvez simplement utiliser get_pagespour récupérer toutes les pages qui ont un meta_valuedu 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 l'on a juste besoin des identifiants de page, alors vous utilisez get_postset passez simplement la valeur pageas post_typeet 'ids asfields`. Cela garantira une requête beaucoup plus rapide et beaucoup plus optimisée car nous ne retournerons 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>';
set_transient( codex.wordpress.org/Transients_API ) si vous ne souhaitez pas trop interroger la base de données.
Si votre modèle de page réside dans le sous-dossier, dossier-thème / modèles-page / page-modèle.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'
));
Ces 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. REMARQUE: il suppose l'utilisation de Polylang et non 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
Voici une fonction complète qui fonctionne avec WPML et Polylang. Crédit à https://github.com/cyrale/
/**
* Search for a page with a particular template.
*
* @param string $template Template filename.
* @param array $args (Optional) See also get_posts() for example parameter usage.
* @param bool $single (Optional) Whether to return a single value.
*
* @return Will be an array of WP_Post if $single is false. Will be a WP_Post object if the page is find, FALSE otherwise
*/
if (!function_exists('get_page_by_template')) {
function get_page_by_template($template, $args = array(), $single = true) {
$pages_by_template = wp_cache_get('pages_by_template', 'cyrale');
if (empty($pages_by_template) || !is_array($pages_by_template)) {
$pages_by_template = array();
}
if (!isset($pages_by_template[$template])) {
$args = wp_parse_args(array(
'posts_per_page' => -1,
'post_type' => 'page',
'suppress_filters' => 0,
'meta_query' => array(
array(
'key' => '_wp_page_template',
'value' => $template,
),
),
), $args);
$pages = get_posts($args);
$pages_by_template[$template]= array(
'single' => !empty($pages) && is_array($pages) ? reset($pages) : false,
'pages' => $pages,
);
}
wp_cache_set('pages_by_template', $pages_by_template, 'cyrale');
return $pages_by_template[$template][$single ? 'single' : 'pages'];
}
}