Obține ID-ul paginii după șablon

2 nov. 2014, 10:01:58
Vizualizări: 53.6K
Voturi: 26

Vreau să știu dacă este posibil să obțin ID-ul unei pagini cu un șablon specific. Este posibil să obțin ID-ul unei pagini care este atribuită șablonului "page-special.php"?

0
Toate răspunsurile la întrebare 6
7
54

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>';
2 nov. 2014 10:20:40
Comentarii

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

user3800799 user3800799
2 nov. 2014 10:29:57

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ă

Pieter Goosen Pieter Goosen
2 nov. 2014 10:35:38

Cu plăcere, mă bucur că am putut ajuta. Distrează-te :-)

Pieter Goosen Pieter Goosen
2 nov. 2014 10:44:35

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

Pieter Goosen Pieter Goosen
23 iul. 2015 13:47:58

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

Chris Andersson Chris Andersson
19 mai 2016 15:09:38

@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

Pieter Goosen Pieter Goosen
19 mai 2016 15:30:36

Mulțumesc, exact la asta mă refeream :). Am un șablon de blog pe care îl includ în tema mea... este foarte util să obții ID-ul paginii asignate șablonului de blog, în loc să-l introduci manual de fiecare dată!

Jordan Carter Jordan Carter
15 iul. 2019 22:49:15
Arată celelalte 2 comentarii
0

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

7 feb. 2018 00:51:18
0

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'];
    }
}
12 nov. 2019 13:24:08
0

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
20 aug. 2018 15:52:49
2
function kavkaz_get_page($page_template_filename){
    
    $pages = get_pages( array(
        'meta_key' => '_wp_page_template',
        'meta_value' => $page_template_filename
    ) );

    $url = null;
    
    if(isset($pages[0])) {
        $url = $pages[0]->guid;
    }
    
    return esc_url( $url );
}
25 mar. 2022 16:05:17
Comentarii

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().

Rup Rup
25 mar. 2022 18:23:12

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.

User User
2 apr. 2022 19:41:27
0

Puteți interoga direct tabelul postmeta:

global $wpdb;
$template = 'page-special';
$sql = "select post_id from {$wpdb->postmeta} where meta_key = '{$template}.php'";
$pages = $wpdb->get_col($sql);
var_dump($pages);
10 iun. 2022 16:27:50