Ottieni l'ID della pagina per modello


19

Voglio sapere se è possibile ottenere l'ID di una pagina con un modello specifico. È possibile ottenere l'ID di una pagina assegnata a "page-special.php"?

Risposte:


39

Quando viene creata una pagina, il modello assegnato a quella pagina viene salvato come meta post personalizzato nello stesso modo dei campi personalizzati. L' meta_keyè _wp_page_templatee meta_valuesarà il modello di pagina

Puoi semplicemente utilizzare get_pagesper recuperare tutte le pagine che hanno un meta_valuemodello specificato

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

MODIFICA 23-07-2015

Se uno ha solo bisogno degli id ​​della pagina, allora usi get_postse poi passi il valore pageas post_typee 'ids asfield`. Ciò garantirà una query molto più veloce, molto più ottimizzata poiché restituiremo solo la colonna ID post nel db e non tutte per le pagine indicate

( Richiede 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>';

Ehi, grazie. Non è un po 'troppo "pesante"? (scorrendo tutte le pagine)
user3800799

Dipende da quante pagine hai. In realtà non esiste un modo nativo più veloce che io conosca per recuperare questi dati. Se hai molte pagine, suggerirei di utilizzare i transitori per archiviare quei dati e svuotare / eliminare il transitorio solo quando viene pubblicata una nuova pagina
Pieter Goosen,

Piacere mio, felice di poterti aiutare. Buon divertimento :-)
Pieter Goosen,

@ user3800799 Ho aggiornato il post se sei interessato solo a ottenere gli ID, nient'altro
Pieter Goosen,

È inoltre possibile utilizzare set_transient( codex.wordpress.org/Transients_API ) se non si desidera interrogare troppo il database.
Chris Andersson,

2

Se il tuo modello di pagina risiede all'interno di una sottocartella, cartella-tema / modelli-pagina / modello-pagina.php, allora sotto la query funzionerà:

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

Questi codici sopra mostrano anche le pagine secondarie.

Grazie


0

Quello che segue è uno script leggermente più articolato che tiene conto di una lingua, se necessario. NOTA presuppone l'utilizzo di Polylang, non di 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

0

Ecco una funzione completa che funziona con WPML e Polylang. Ringraziamo 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'];
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.