Quiero saber si es posible obtener el ID de una página con una plantilla específica. ¿Es posible obtener el ID de una página asignada a "page-special.php"?
Quiero saber si es posible obtener el ID de una página con una plantilla específica. ¿Es posible obtener el ID de una página asignada a "page-special.php"?
Cuando se crea una página, la plantilla asignada a esa página se guarda como meta personalizada de la misma forma que los campos personalizados. El meta_key
es _wp_page_template
y el meta_value
será la plantilla de la página
Simplemente puede hacer uso de get_pages
para recuperar todas las páginas que tienen un meta_value
de la plantilla especificada
$pages = get_pages(array(
'meta_key' => '_wp_page_template',
'meta_value' => 'page-special.php'
));
foreach($pages as $page){
echo $page->ID.'<br />';
}
Si uno solo necesita los ID de página, entonces usa get_posts
y luego pasa page
como post_type
y el valor de 'ids as
fields'. Esto asegurará una consulta mucho más rápida y mucho más optimizada, ya que solo devolveremos la columna de ID de publicación en la base de datos y no todas para las páginas dadas
( Requiere 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 su plantilla de página se encuentra dentro de la subcarpeta, carpeta de tema / página-plantillas / página-plantilla.php, la siguiente consulta funcionará:
$page_details = get_pages( array(
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'hierarchical' => 0,
'meta_value' => 'page-templates/page-template.php'
));
Los códigos anteriores también muestran subpáginas también.
Gracias
El siguiente es un script un poco más articulado que tiene en cuenta un idioma, si es necesario. NOTA que asume el uso de Polylang, no 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