Obține ID-ul paginii după șablon
Când o pagină este creată, șablonul atribuit acesteia este salvat ca meta-informație personalizată a postării, în același mod ca și câmpurile personalizate. Cheia meta meta_key
este _wp_page_template
, iar valoarea meta meta_value
va fi șablonul paginii.
Puteți folosi simplu funcția get_pages
pentru a prelua toate paginile care au o valoare meta meta_value
corespunzătoare șablonului specificat
$pages = get_pages(array(
'meta_key' => '_wp_page_template',
'meta_value' => 'page-special.php'
));
foreach($pages as $page){
echo $page->ID.'<br />';
}
EDITARE 23-07-2015
Dacă aveți nevoie doar de ID-urile paginilor, atunci puteți folosi funcția get_posts
și să specificați page
ca post_type
și ids
ca valoare pentru fields
. Acest lucru va asigura o interogare mult mai rapidă și optimizată, deoarece vom returna doar coloana cu ID-urile postărilor din baza de date și nu toate câmpurile pentru paginile respective
(Necesită 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>';

Hei, mulțumesc. Nu este puțin prea "greu"? (să parcurgi toate paginile)

Depinde de câte pagini ai. De fapt, nu cunosc nicio metodă mai rapidă nativă pentru a obține aceste date. Dacă ai multe pagini, aș sugera să folosești transienți pentru a stoca acele date și să ștergi/golești transientul doar când este publicată o pagină nouă

@user3800799 Am actualizat postarea dacă ești interesat doar de obținerea ID-urilor, nimic altceva

Ai putea folosi și set_transient
(https://codex.wordpress.org/Transients_API) dacă nu vrei să interoghezi baza de date prea mult.

@ChrisAndersson Dacă nu ai sute de pagini, setarea unui transient va fi destul de inutilă aici. Codul meu efectuează doar o singură interogare rapidă în baza de date, deoarece interogăm doar ID-urile postărilor, ceea ce crește dramatic performanța. Transienții efectuează două apeluri către baza de date la fiecare încărcare de pagină, deși ar putea fi puțin mai rapizi. Transienții sunt utili doar pentru operațiuni costisitoare

Dacă șablonul tău de pagină se află într-un subfolder, de exemplu theme-folder/page-templates/page-template.php, atunci următoarea interogare va funcționa:
$page_details = get_pages( array(
'post_type' => 'page',
'meta_key' => '_wp_page_template',
'hierarchical' => 0,
'meta_value' => 'page-templates/page-template.php'
));
Codul de mai sus va afișa și subpaginile.
Mulțumim

Iată o funcție completă care funcționează cu WPML și Polylang. Credit către https://github.com/cyrale/
/**
* Caută o pagină cu un anumit template.
*
* @param string $template Numele fișierului template.
* @param array $args (Opțional) Vezi și get_posts() pentru exemplu de utilizare a parametrilor.
* @param bool $single (Opțional) Dacă să returneze o singură valoare.
*
* @return Va fi un array de WP_Post dacă $single este false. Va fi un obiect WP_Post dacă pagina este găsită, FALSE în caz contrar
*/
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'];
}
}

Următorul script este puțin mai detaliat și ține cont de o limbă, dacă este necesar. NOTĂ: acesta presupune utilizarea Polylang, nu 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

Asta pare cam la fel ca primele două răspunsuri, o căutare get_pages() pentru meta_key? De asemenea, cred că ->guid este greșit: poate fi URL-ul, dar nu este garantat. În schimb, aș trece obiectul paginii (sau doar ID-ul) la get_permalink().

Răspunsul tău ar putea fi îmbunătățit cu informații suplimentare de susținere. Te rugăm să [editezi] pentru a adăuga detalii suplimentare, cum ar fi citate sau documentație, astfel încât alții să poată confirma că răspunsul tău este corect. Poți găsi mai multe informații despre cum să scrii răspunsuri bune în centrul de ajutor.
