Come posso ottenere il nome della pagina corrente in WordPress?


163

Quale codice PHP può essere utilizzato per recuperare il nome della pagina corrente in un tema WordPress?

Tutte le soluzioni che ho visto finora ( the_title(), get_page()->post_name, get_post()e così via) non funzionano per una pagina che contiene le voci postali. Restituiranno tutti il ​​nome dell'ultimo post di blog.

Detto in altro modo, supponi di avere una pagina creata in WordPress con il nome "Le mie notizie". Questa pagina è impostata come "pagina post". Aggiungi un paio di post alla pagina. Ora, quale API può essere utilizzata per recuperare la stringa "my-news" anziché il nome dell'ultimo post?


Ho trovato la seguente variabile che sembra funzionare.

$wp_query->queried_object->post_name

Questa è in realtà la versione URL friendly del nome della pagina (lumaca), che è anche quello che stavo cercando. Questo è stato testato con il modello predefinito ( Twenty Ten ). Non sono davvero sicuro del perché le due variabili indicate di seguito non funzionino sul mio sito. Grazie a keatch per la print_r()punta .

Ora, perché queste informazioni sono così nascoste?


per il nome usare: single_post_title ('', false); per lo slug usare: get_query_var ('nomepagina');
jtmielczarek,

Risposte:


183

La variabile globale di WordPress $pagenamedovrebbe essere disponibile per te. Ho appena provato con la stessa configurazione che hai specificato.

$pagenameè definito nel file wp-Includes / theme.php, all'interno della funzione get_page_template(), che viene ovviamente chiamato prima che i file del tema della pagina vengano analizzati, quindi è disponibile in qualsiasi punto all'interno dei modelli per le pagine.

  • Anche se non sembra essere documentato, $pagenamevar è impostato solo se si utilizzano permalink. Immagino che ciò sia dovuto al fatto che, se non li usi, WordPress non ha bisogno della lumaca di pagina, quindi non lo imposta.

  • $pagename non è impostato se si utilizza la pagina come prima pagina statica.

    • Questo è il codice all'interno di /wp-includes/theme.php, che utilizza la soluzione che hai indicato quando $pagenamenon può essere impostato:

      $ pagename = get_query_var ('pagename'); if (! $ pagename && $ id> 0) {// Se una pagina statica è impostata come prima pagina, $ pagename non verrà impostato. Richiamalo dall'oggetto interrogato $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }


4
$ pagename è vuoto quando usato all'interno di header.php. Ho provato a utilizzare il modello predefinito (venti) e ad usarlo immediatamente dopo il tag <body> ma non è impostato. Per inciso, nessuna delle variabili query_vars sembra essere impostata in quella fase.
Bernard,

1
Non riesco a vedere alcun motivo per l'assenza di quella variabile, forse ho frainteso la tua configurazione? Ho capito che stai cercando di farlo all'interno di un modello di pagina. Anche se scrivi "echo $ pagename" nella prima riga di header.php dovrebbe darti il ​​valore. Con quale versione di WP hai a che fare?
AJJ,

1
Potresti provare un approccio leggermente diverso usando get_query_var ('pagename').
AJJ,

@AJweb: Sì, è per un modello che sto costruendo ma sto usando il modello predefinito per i test, all'interno di header.php. Ho l'impressione che non hai testato la tua soluzione. Vedi il nome della pagina quando metti un <h1> <? Php echo $ pagename?> </h1> subito dopo il tag <body> in header.php?
Bernard,

1
Questo ha fatto il trucco per me: $pagename = $wp_query->queried_object->post_name;, basta non dimenticare di impostare global $wp_query;prima!
Saran,

39

Il mio approccio per ottenere il nome della lumaca della pagina:

$slug = basename(get_permalink());

Funziona solo se usano abbastanza URL, non è vero?
Betty

24

Ok, devi prendere il titolo della pagina prima del ciclo.

$page_title = $wp_query->post->post_title;

Controlla il riferimento: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

Fare un

print_r($wp_query)

prima del ciclo per vedere tutti i valori $wp_querydell'oggetto.


1
Neanche questo funziona. Se stampo l'oggetto $ wp_query subito dopo il tag <body> vedo che il primo oggetto post è la voce del blog, non la pagina stessa. Tuttavia, grazie per il suggerimento print_r (). Potrei scoprire la variabile che ha le informazioni che sto cercando (inserendo queste informazioni nella domanda).
Bernard,

facendo eco che $ page_title var ha funzionato per me nell'intestazione, grazie.
Claire

22
<?php wp_title(''); ?>

Questo ha funzionato per me.

Se ho capito bene, vuoi ottenere il nome della pagina su una pagina che ha voci di post.


10

Puoi ottenere la pagina corrente, il post o il tipo di post personalizzato con la variabile globale $post:

echo $post->post_title

Nota: in una funzione o classe è necessario specificare global $post;prima di provare a utilizzare $post.

Se hai dei loop sulla tua pagina, assicurati di terminare ogni loop wp_reset_postdata();per $posttornare alla voce predefinita visualizzata (la pagina).

Nota, la variabile 'post_title' è disponibile anche per qualsiasi loop / query personalizzato ... inclusi voci di menu e allegati multimediali ... tutto in WordPress è un 'post'.


Questa risposta è del 2012, c'è qualche conoscenza sul fatto che questo metodo continuerà a funzionare con il WP più recente?
Martin,

1
Sì, la gestione di base dei tipi di posta di WP non è cambiata
James,

8

Se stai cercando di accedere alla pagina corrente dal tuo file Functions.php (quindi, prima che il ciclo, prima $postsia popolato, prima che $wp_querysia inizializzato, ecc ...) non hai davvero altra scelta che accedere alle variabili del server stesse e estrarre la pagina richiesta dalla stringa di query.

$page_slug = trim( $_SERVER["REQUEST_URI"] , '/' )

Si noti che questa è una soluzione "stupida". Non sa, per esempio che lo è anche la pagina con la lumaca 'coming-soon' p=6. E si presume che le impostazioni del permalink siano impostate su pagename(che dovrebbero essere comunque!).

Tuttavia, può essere un piccolo trucco utile se hai uno scenario controllato. Lo sto usando in una situazione in cui desidero reindirizzare i visitatori non registrati a una pagina "coming soon"; ma devo assicurarmi che non li stia gettando nel temuto "loop di reindirizzamento", quindi devo escludere la pagina "coming soon" da questa regola:

global $pagenow;
if (
        ! is_admin() &&
        'wp-login.php' != $pagenow &&
        'coming-soon' != trim( $_SERVER["REQUEST_URI"] , '/' ) &&
        ! is_user_logged_in()
){
   wp_safe_redirect( 'coming-soon' );
}

7

Credo che il tema iniziale di Roots abbia una funzione fantastica per ottenere l'attuale titolo della pagina. È molto hackerabile, copre tutte le basi e può essere facilmente utilizzato con il wp_titlegancio.

/**
 * Page titles
 */
function roots_title() {
  if (is_home()) {
    if (get_option('page_for_posts', true)) {
      echo get_the_title(get_option('page_for_posts', true));
    } else {
      _e('Latest Posts', 'roots');
    }
  } elseif (is_archive()) {
    $term = get_term_by('slug', get_query_var('term'), get_query_var('taxonomy'));
    if ($term) {
      echo $term->name;
    } elseif (is_post_type_archive()) {
      echo get_queried_object()->labels->name;
    } elseif (is_day()) {
      printf(__('Daily Archives: %s', 'roots'), get_the_date());
    } elseif (is_month()) {
      printf(__('Monthly Archives: %s', 'roots'), get_the_date('F Y'));
    } elseif (is_year()) {
      printf(__('Yearly Archives: %s', 'roots'), get_the_date('Y'));
    } elseif (is_author()) {
      $author = get_queried_object();
      printf(__('Author Archives: %s', 'roots'), $author->display_name);
    } else {
      single_cat_title();
    }
  } elseif (is_search()) {
    printf(__('Search Results for %s', 'roots'), get_search_query());
  } elseif (is_404()) {
    _e('Not Found', 'roots');
  } else {
    the_title();
  }
}


5

Ho trovato una soluzione più semplice.

Ottieni il valore restituito del nome della pagina da wp_title (). Se vuoto, stampa il nome della homepage, altrimenti fai eco al valore di wp_title ().

<?php $title = wp_title('', false); ?>

Ricordarsi di rimuovere la separazione con il primo argomento e quindi impostare display su false da utilizzare come input per la variabile. Quindi inserisci il codice tra i tag di intestazione, ecc.

<?php if ( $title == "" ) : echo "Home"; else : echo $title; endif; ?>

Per me ha funzionato a meraviglia e assicurando che il primo sia dichiarato nella sezione in cui si desidera estrarre il $title, questo può essere regolato per restituire diverse variabili.



4

Uso:

$title = get_the_title($post);
$parent_title = get_the_title($post->post_parent);

echo $title;
echo $parent_title;

Una spiegazione sarebbe in ordine.
Peter Mortensen,

3

Questo sembra essere il più semplice da usare:

<?php single_post_title(); ?>

1
Questa chiamata restituisce il nome dell'ultimo post, non il nome della pagina che contiene i post, almeno questo è quello che ho capito dal documento online senza testarlo.
Bernard,

Questo e 'esattamente quello che stavo cercando. Ho creato una nuova intestazione per la mia pagina e questo ha tirato il nome della pagina come previsto. Grazie!
AJ Hernandez,

3

Mostra il titolo prima dell'inizio del ciclo:

$page_title = $wp_query->post->post_title;

2

Un'opzione, se stai cercando la pagina richiesta effettiva, anziché l'ID pagina o la lumaca è quella di intercettare la query:

add_action('parse_request', 'show_query', 10, 1);

All'interno della tua funzione, hai accesso all'oggetto $ wp e puoi ottenere il nome pagina o il nome post con:

function show_query($wp){
     if ( ! is_admin() ){ // heck we don't need the admin pages
         echo $wp->query_vars['pagename'];
         echo $wp->query_vars['name'];
     }
}

Se, d'altra parte, hai davvero bisogno dei dati dei post, il primo posto per ottenerli (e probabilmente in questo contesto, il migliore) è:

add_action('wp', 'show_page_name', 10, 1);

function show_page_name($wp){
     if ( ! is_admin() ){
        global $post;
        echo $post->ID, " : ", $post->post_name;
     }
}

Infine, mi rendo conto che probabilmente questa non era la domanda del PO, ma se stai cercando il nome della pagina di amministrazione , usa il globale $pagenow.


2

All'interno del ciclo di WordPress :

if ( have_posts() ) : while ( have_posts() ) : the_post();
/******************************************/
echo get_the_title();
/******************************************/
endwhile; endif;

Questo ti mostrerà il titolo della pagina corrente.

Per riferimento: get_the_title ()


1

Ecco la mia versione:

$title = ucwords(str_replace('-', ' ', get_query_var('pagename')));

get_query_var ('nomepagina') mi stava solo dando la lumaca di pagina. Quindi quanto sopra sostituisce tutti i trattini e rende la prima lettera di ogni parola maiuscola, quindi può effettivamente essere utilizzata come titolo.


0

Questo è quello che ho finito per usare, a partire dal 2018:

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">

0

Ora ho trovato questa funzione su WordPress Codec ,

essere interrogato

che è un wrapper per $wp_query->get_queried_object.

Questo post mi ha messo nella giusta direzione, ma sembra che abbia bisogno di questo aggiornamento.


0

Questo funziona anche se ti trovi in ​​Functions.php. Non è l'approccio migliore poiché è necessario utilizzare l'array globale, ma funziona.

  1. Innanzitutto, dobbiamo aggiungere un filtro. Deve esistere un filtro migliore da utilizzare rispetto a template_include, ma non li conosco tutti. Per favore, indicami quello giusto.

    add_filter( 'template_include', 'var_template_include', 1000 );
    function var_template_include( $template ){
        global $wp_query;
        $GLOBALS['current_page'] = $wp_query->get_queried_object()->post_name;
        return $template;
    }
  2. Evitare di utilizzare direttamente la variabile

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. Ora puoi usare la funzione get_current_page()in qualsiasi altra parte di Functions.php.

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.