Obtener ID de página por plantilla

19

Quiero saber si es posible obtener la ID de una página con una plantilla específica. ¿Es posible obtener el ID de una página que se asignó a "page-special.php"?

usuario3800799
fuente

Respuestas:

39

Cuando se crea una página, la plantilla asignada a esa página se guarda como metaetiquetado personalizado de la misma manera que los campos personalizados. El meta_keyes _wp_page_templatey meta_valueserá la plantilla de página

Simplemente puede utilizar get_pagespara recuperar todas las páginas que tienen una meta_valuede las plantillas especificadas

$pages = get_pages(array(
    'meta_key' => '_wp_page_template',
    'meta_value' => 'page-special.php'
));
foreach($pages as $page){
    echo $page->ID.'<br />';
}

EDITAR 23-07-2015

Si uno solo necesita los identificadores de página, entonces utiliza get_postsy luego pasa pagecomo valor de post_type' ascampos de identificadores' . Esto garantizará una consulta mucho más rápida y mucho más optimizada, ya que solo devolveremos la columna de ID de publicación en el DB 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>';
Pieter Goosen
fuente
Hey gracias. ¿No es un poco demasiado "pesado"? (pasando por todas las páginas)
user3800799
Depende de cuántas páginas tengas. En realidad, no hay una forma nativa más rápida que conozca para recuperar estos datos. Si tiene muchas páginas, le sugiero que utilice transitorios para almacenar esos datos y solo vacíe / elimine el transitorio cuando se publique una nueva página
Pieter Goosen
Un placer, me alegro de poder ayudar. Disfruta :-)
Pieter Goosen
@ user3800799 He actualizado la publicación si solo le interesa obtener los identificadores, nada más
Pieter Goosen
También puedes usar set_transient( codex.wordpress.org/Transients_API ) si no desea consultar demasiado la base de datos.
Chris Andersson
2

Si la plantilla de su página reside dentro de la subcarpeta, theme-folder / page-templates / page-template.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'
));

Estos códigos anteriores también muestran subpáginas también.

Gracias

Sushil Adhikari
fuente
0

El siguiente es un script ligeramente 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
Luca Reghellin
fuente
0

Aquí hay una función completa que funciona con WPML y Polylang. Crédito a 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'];
    }
}
Alex Vand
fuente