Ottenere l'ID della pagina dal template

2 nov 2014, 10:01:58
Visualizzazioni: 53.6K
Voti: 26

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

0
Tutte le risposte alla domanda 6
7
54

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

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

user3800799 user3800799
2 nov 2014 10:29:57

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

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

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

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

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

Pieter Goosen Pieter Goosen
23 lug 2015 13:47:58

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

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

@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

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

Grazie, era esattamente quello che stavo cercando :). Ho un template per il blog che includo nel mio tema... è molto utile ottenere l'ID della pagina assegnata al template del blog, piuttosto che doverlo inserire manualmente ogni volta!

Jordan Carter Jordan Carter
15 lug 2019 22:49:15
Mostra i restanti 2 commenti
0

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

7 feb 2018 00:51:18
0

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

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
20 ago 2018 15:52:49
2
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 );
}
25 mar 2022 16:05:17
Commenti

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

Rup Rup
25 mar 2022 18:23:12

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.

User User
2 apr 2022 19:41:27
0

Puoi interrogare direttamente la tabella 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 giu 2022 16:27:50