Obter ID da página por modelo

19

Quero saber se é possível obter o ID de uma página com um modelo específico. É possível obter o ID de uma página atribuída a "page-special.php"?

user3800799
fonte

Respostas:

39

Quando uma página é criada, o modelo atribuído a essa página é salvo como meta post personalizada, da mesma maneira que os campos personalizados. O meta_keyé _wp_page_templatee o meta_valueserá o modelo da página

Você pode simplesmente usar get_pagespara recuperar todas as páginas que possuem um meta_valuedos modelos especificados

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

EDIT 23-07-2015

Se alguém precisar apenas dos IDs da página, use-os get_postse depois passe pagecomo valor post_type"e ascampos dos IDs" . Isso garantirá uma consulta muito mais rápida e muito mais otimizada, pois retornaremos apenas a coluna de ID da postagem no banco de dados e não todas para as páginas especificadas.

( Requer PHP 5.4 ou superior )

$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
fonte
Ei, obrigado. Não é um pouco "pesado"? (percorrendo todas as páginas)
user3800799
Depende de quantas páginas você possui. Na verdade, não há uma maneira nativa mais rápida que eu conheça para recuperar esses dados. Se você tem um monte de páginas, gostaria de sugerir que você faça uso de transientes para armazenar esses dados e única embutida / apagar o transitório quando uma nova página é publicado
Pieter Goosen
O prazer é meu, feliz por poder ajudar. Desfrute :-)
Pieter Goosen
@ user3800799 Eu atualizei o post se você está interessado apenas em obter os ids, nada mais
Pieter Goosen
Você também pode usar set_transient( codex.wordpress.org/Transients_API ) se não desejar consultar muito o banco de dados.
Chris Andersson
2

Se o seu modelo de página estiver dentro da subpasta, pasta-tema / modelos-página / modelo-página.php, a consulta abaixo funcionará:

$page_details = get_pages( array(
 'post_type' => 'page',
 'meta_key' => '_wp_page_template',
 'hierarchical' => 0,
 'meta_value' => 'page-templates/page-template.php'
));

Os códigos acima também exibem subpáginas.

obrigado

Sushil Adhikari
fonte
0

A seguir, um script um pouco mais articulado que leva em conta um idioma, se necessário. OBSERVAÇÃO: ele pressupõe o uso do Polylang, não do 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
fonte
0

Aqui está uma função completa que funciona com WPML e Polylang. Crédito para 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
fonte