Ottenere l'ID della pagina dal template
Quando viene creata una pagina, il modello assegnato a quella pagina viene salvato come meta personalizzato del post nello stesso modo dei campi personalizzati. La chiave meta_key
è _wp_page_template
e il valore meta_value
sarà il modello della pagina.
Puoi semplicemente utilizzare get_pages
per recuperare tutte le pagine che hanno un meta_value
corrispondente al modello 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 hai bisogno solo degli ID delle pagine, puoi utilizzare get_posts
passando page
come post_type
e 'idscome valore di
fields`. Questo garantisce una query molto più veloce e ottimizzata, poiché restituiremo solo la colonna degli ID nel database e non tutti i campi per le pagine specificate.
(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"? (scorrere tutte le pagine)

Dipende da quante pagine hai. In realtà non conosco un modo nativo più veloce per recuperare questi dati. Se hai molte pagine, ti suggerirei di utilizzare i transient per memorizzare quei dati e svuotare/eliminare il transient solo quando viene pubblicata una nuova pagina

È stato un piacere, felice di aver potuto aiutare. Buon lavoro :-)

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

Potresti anche usare set_transient
(https://codex.wordpress.org/Transients_API) se non vuoi interrogare troppo il database.

@ChrisAndersson A meno che tu non abbia centinaia di pagine, impostare un transient sarà abbastanza inutile qui. Il mio codice esegue solo una query al database super veloce poiché interroghiamo solo gli ID dei post, il che aumenta notevolmente le prestazioni. I transient eseguono due chiamate al database ad ogni caricamento di pagina, anche se potrebbe essere leggermente più veloce. I transient sono utili solo per operazioni costose

Se il tuo template di pagina si trova all'interno di una sottocartella, ad esempio theme-folder/page-templates/page-template.php, allora la seguente query funzionerà:
$page_details = get_pages( array(
'post_type' => 'page', // Tipo di post: pagina
'meta_key' => '_wp_page_template', // Chiave meta per il template della pagina
'hierarchical' => 0, // Non gerarchico
'meta_value' => 'page-templates/page-template.php' // Valore meta: percorso del template
));
Il codice sopra mostrerà anche le sotto-pagine.
Grazie

Ecco una funzione completa che funziona con WPML e Polylang. Crediti a https://github.com/cyrale/
/**
* Cerca una pagina con un template specifico.
*
* @param string $template Nome del file del template.
* @param array $args (Opzionale) Vedi anche get_posts() per esempio di utilizzo dei parametri.
* @param bool $single (Opzionale) Se restituire un singolo valore.
*
* @return Sarà un array di WP_Post se $single è false. Sarà un oggetto WP_Post se la pagina viene trovata, FALSE altrimenti
*/
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'];
}
}

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

function kavkaz_get_page($page_template_filename){
// Ottiene le pagine che utilizzano il template specificato
$pages = get_pages( array(
'meta_key' => '_wp_page_template',
'meta_value' => $page_template_filename
) );
$url = null;
// Se esiste almeno una pagina con quel template, ottiene il suo URL
if(isset($pages[0])) {
$url = $pages[0]->guid;
}
// Restituisce l'URL codificato per la sicurezza
return esc_url( $url );
}

Sembra più o meno lo stesso dei primi due risultati, una ricerca con get_pages() per il meta_key? Penso anche che ->guid sia sbagliato: potrebbe essere l'URL, ma non è garantito. Invece passerei l'oggetto pagina (o semplicemente l'ID) a get_permalink().

La tua risposta potrebbe essere migliorata con informazioni aggiuntive di supporto. Per favore [modifica] per aggiungere ulteriori dettagli, come citazioni o documentazione, in modo che altri possano confermare che la tua risposta è corretta. Puoi trovare maggiori informazioni su come scrivere buone risposte nel centro assistenza.
