Wie kann ich den aktuellen Seitennamen in WordPress erhalten?

162

Mit welchem ​​PHP-Code kann der aktuelle Seitenname in einem WordPress-Theme abgerufen werden?

Alle Lösungen , die ich bisher gesehen habe ( the_title(), get_page()->post_name, get_post(), etc.) funktionieren nicht für eine Seite , die Post Einträge enthält. Sie alle geben den Namen des neuesten Blogeintrags zurück.

Anders ausgedrückt: Angenommen, Sie haben eine in WordPress erstellte Seite mit dem Namen "Meine Nachrichten" erstellt. Diese Seite wird als "Post-Seite" festgelegt. Fügen Sie der Seite einige Beiträge hinzu. Welche API kann nun verwendet werden, um die Zeichenfolge "my-news" anstelle des Namens des letzten Beitrags abzurufen?


Ich habe die folgende Variable gefunden, die zu funktionieren scheint.

$wp_query->queried_object->post_name

Dies ist eigentlich die URL-freundliche Version des Seitennamens (Slug), nach der ich auch gesucht habe. Dies wurde mit der Standardvorlage ( Twenty Ten ) getestet . Ich bin mir wirklich nicht sicher, warum die beiden unten angegebenen Variablen auf meiner Website nicht funktionieren. Danke an keatch für den print_r()Tipp .

Warum sind diese Informationen so tief im Inneren verborgen?

Bernard
quelle
Verwenden Sie für den Namen: single_post_title ('', false); für die Schnecke verwenden: get_query_var ('Seitenname');
Jtmielczarek

Antworten:

182

Die globale WordPress-Variable $pagenamesollte für Sie verfügbar sein. Ich habe es gerade mit dem gleichen Setup versucht, das Sie angegeben haben.

$pagenamewird in der Datei wp-includes / theme.php innerhalb der Funktion definiert get_page_template(), die natürlich aufgerufen wird, bevor Ihre Seitenthemendateien analysiert werden, sodass sie jederzeit in Ihren Vorlagen für Seiten verfügbar ist.

  • Obwohl es nicht dokumentiert zu sein scheint, wird die $pagenameVariable nur festgelegt, wenn Sie Permalinks verwenden. Ich denke, das liegt daran, dass WordPress, wenn Sie sie nicht verwenden, den Seiten-Slug nicht benötigt und ihn daher nicht einrichtet.

  • $pagename wird nicht festgelegt, wenn Sie die Seite als statische Startseite verwenden.

    • Dies ist der Code in /wp-includes/theme.php, der die Lösung verwendet, auf die Sie hingewiesen haben, wenn $pagenamesie nicht festgelegt werden kann:

      $ pagename = get_query_var ('Seitenname'); if (! $ pagename && $ id> 0) {// Wenn eine statische Seite als Startseite festgelegt ist, wird $ pagename nicht festgelegt. Rufen Sie es aus dem abgefragten Objekt ab. $ Post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }}

AJJ
quelle
4
$ pagename ist leer, wenn es in header.php verwendet wird. Ich habe versucht, die Standardvorlage (zwanzig) zu verwenden und sie unmittelbar nach dem <body> -Tag zu verwenden, aber sie ist nicht festgelegt. Übrigens scheint zu diesem Zeitpunkt keine der Variablen query_vars festgelegt zu sein.
Bernard
1
Ich kann keinen Grund für das Fehlen dieser Variablen erkennen. Vielleicht habe ich Ihr Setup falsch verstanden? Ich habe verstanden, dass Sie versuchen, dies in einer Seitenvorlage zu tun. Selbst wenn Sie "echo $ pagename" in die erste Zeile von header.php schreiben, sollte es Ihnen den Wert geben. Mit welcher Version von WP beschäftigen Sie sich?
AJJ
1
Sie können einen etwas anderen Ansatz mit get_query_var ('Seitenname') ausprobieren.
AJJ
@AJweb: Ja, es handelt sich um eine Vorlage, die ich erstelle, aber ich verwende die Standardvorlage zum Testen in header.php. Ich habe den Eindruck, dass Sie Ihre Lösung nicht getestet haben. Sehen Sie den Seitennamen, wenn Sie ein <h1> <? Php echo $ pagename?> </ H1> direkt nach dem <body> -Tag in header.php einfügen?
Bernard
1
Dies hat den Trick für mich: $pagename = $wp_query->queried_object->post_name;, nur nicht vergessen , zu setzen , global $wp_query;bevor!
Saran
38

Mein Ansatz, um den Slug-Namen der Seite zu erhalten:

$slug = basename(get_permalink());
goksel
quelle
Dies funktioniert nur, wenn sie eine hübsche URL verwenden, nicht wahr?
Betty
24

Ok, Sie müssen den Seitentitel vor der Schleife abrufen.

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

Überprüfen Sie die Referenz: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

Mach a

print_r($wp_query)

vor der Schleife, um alle Werte des $wp_queryObjekts zu sehen.

Keatch
quelle
1
Das funktioniert auch nicht. Wenn ich das $ wp_query-Objekt direkt nach dem <body> -Tag drucke, sehe ich, dass das erste Post-Objekt der Blogeintrag ist, nicht die Seite selbst. Vielen Dank jedoch für den print_r () -Tipp. Ich konnte die Variable herausfinden, die die gesuchten Informationen enthält (diese Informationen in die Frage stellen).
Bernard
Echo, dass $ page_title var für mich im Header funktioniert hat, danke.
Claire
22
<?php wp_title(''); ?>

Das hat bei mir funktioniert.

Wenn ich das richtig verstehe, möchten Sie den Seitennamen auf einer Seite mit Post-Einträgen abrufen.

GregB
quelle
10

Sie können den aktuellen Seitentyp, Beitrag oder benutzerdefinierten Beitragstyp mit der globalen Variablen abrufen $post:

echo $post->post_title

Hinweis: In einer Funktion oder Klasse müssen Sie angeben, global $post;bevor Sie versuchen, sie zu verwenden $post.

Wenn Sie Schleifen auf Ihrer Seite haben, stellen Sie sicher , dass Sie jede Schleife am Ende mit wp_reset_postdata();auf Set $postzurück zum Standardelement Sein angezeigt (die Seite).

Beachten Sie, dass die Variable 'post_title' auch für jede benutzerdefinierte Schleife / Abfrage verfügbar ist ... einschließlich Menüelementen und Medienanhängen ... alles in WordPress ist ein 'Post'.

James
quelle
Diese Antwort stammt aus dem Jahr 2012. Gibt es Kenntnisse darüber, ob diese Methode noch mit neueren WP funktioniert?
Martin
1
Ja, das wird es - WP's Kernbehandlung von Post-Typen hat sich nicht geändert
James
8

Wenn Sie aus Ihrer Datei functions.php heraus auf die aktuelle Seite zugreifen möchten (also bevor die Schleife, bevor sie $postgefüllt wird, bevor sie $wp_queryinitialisiert wird usw.), haben Sie wirklich keine andere Wahl, als auf die Servervariablen selbst und zuzugreifen Extrahieren Sie die angeforderte Seite aus der Abfragezeichenfolge.

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

Beachten Sie, dass dies eine "dumme" Lösung ist. Es weiß zum Beispiel nicht, dass die Seite mit dem Slug "Coming-Soon" auch ist p=6. Und es wird davon ausgegangen, dass Ihre Permalink-Einstellungen auf eingestellt sind pagename(was sie sowieso sein sollten!).

Kann dennoch ein nützlicher kleiner Trick sein, wenn Sie ein kontrolliertes Szenario haben. Ich verwende dies in einer Situation, in der ich nicht angemeldete Besucher auf eine Seite "In Kürze" umleiten möchte. aber ich muss sicherstellen, dass ich sie nicht in die gefürchtete "Weiterleitungsschleife" wirf, also muss ich die Seite "in Kürze" von dieser Regel ausschließen:

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

Ich glaube, dass das Roots-Starter-Thema eine fantastische Funktion hat, um den aktuellen Seitentitel zu erhalten. Es ist sehr hackbar, deckt alle Basen ab und kann leicht mit dem wp_titleHaken verwendet werden.

/**
 * 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();
  }
}
Sy Holloway
quelle
5

Versuche dies:

$pagename = get_query_var('pagename');
Mohammad Sabbagh
quelle
Eine Erklärung wäre angebracht (antworten Sie, indem Sie Ihre Antwort bearbeiten , nicht hier in den Kommentaren).
Peter Mortensen
5

Ich habe eine einfachere Lösung gefunden.

Ruft den zurückgegebenen Wert des Seitennamens von wp_title () ab. Wenn leer, drucken Sie den Namen der Startseite, andernfalls geben Sie den Wert wp_title () wieder.

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

Denken Sie daran, die Trennung mit dem ersten Argument zu entfernen und dann die Anzeige auf false zu setzen, um sie als Eingabe für die Variable zu verwenden. Dann stecken Sie einfach den Code zwischen Ihre Überschriften usw. Tags.

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

Es hat mir sehr gut gefallen und sichergestellt, dass das erste in dem Abschnitt deklariert wird, in dem Sie das extrahieren möchten $title. Dies kann so eingestellt werden, dass verschiedene Variablen zurückgegeben werden.

Tech1337
quelle
5

Wir müssen nur die globale Variable "post" verwenden:

global $post;
echo $post->post_title;

Dadurch wird der aktuelle Titel der Seite / des Beitrags wiedergegeben.

Rahul Balakrishna
quelle
Was ist mit HTML GET ?
Peter Mortensen
4

Verwenden:

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

echo $title;
echo $parent_title;
Jerad Rutnam
quelle
Eine Erklärung wäre angebracht.
Peter Mortensen
3

Dies scheint am einfachsten zu bedienen zu sein:

<?php single_post_title(); ?>
Bowenac
quelle
1
Dieser Aufruf gibt den letzten Beitragsnamen zurück, nicht den Seitennamen, der die Beiträge enthält. Zumindest verstehe ich das aus dem Online-Dokument, ohne es zu testen.
Bernard
Genau das habe ich gesucht. Ich habe einen neuen Header für meine Seite erstellt und dadurch den Namen der Seite wie erwartet abgerufen. Vielen Dank!
AJ Hernandez
3

Zeigen Sie den Titel an, bevor die Schleife beginnt:

$page_title = $wp_query->post->post_title;
Ajay Malhotra
quelle
2

Eine Option, wenn Sie nach der tatsächlich abgefragten Seite anstelle der Seiten-ID oder des Slugs suchen, besteht darin, die Abfrage abzufangen:

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

Innerhalb Ihrer Funktion haben Sie Zugriff auf das $ wp-Objekt und können entweder den Seitennamen oder den Postnamen abrufen mit:

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'];
     }
}

Wenn Sie andererseits die Post-Daten wirklich benötigen, ist der erste Ort, an dem Sie sie erhalten (und in diesem Zusammenhang wohl der beste):

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

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

Schließlich ist mir klar, dass dies wahrscheinlich nicht die Frage des OP war, aber wenn Sie nach dem Namen der Admin- Seite suchen , verwenden Sie die globale $pagenow.

Tom Auger
quelle
2

Innerhalb der WordPress- Schleife :

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

Dies zeigt Ihnen den aktuellen Seitentitel.

Als Referenz: get_the_title ()

Umair Hamid
quelle
1

Hier ist meine Version:

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

get_query_var ('Seitenname') gab mir nur die Seitenschnecke. Das obige ersetzt also alle Bindestriche und macht den ersten Buchstaben jedes Wortes in Großbuchstaben - so kann es tatsächlich als Titel verwendet werden.

grau
quelle
0

Folgendes habe ich ab 2018 verwendet:

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">
Gewähren
quelle
0

Ich habe diese Funktion jetzt im WordPress-Codec gefunden .

abgefragt werden

Das ist ein Wrapper für $wp_query->get_queried_object.

Dieser Beitrag hat mich in die richtige Richtung gebracht, aber es scheint, dass er dieses Update benötigt.

Sandra
quelle
0

Dies funktioniert auch, wenn Sie sich in der Datei functions.php befinden. Dies ist nicht der beste Ansatz, da Sie das globale Array verwenden müssen, aber es funktioniert.

  1. Zuerst müssen wir einen Filter hinzufügen. Es muss einen besseren Filter geben als template_include, aber ich kenne nicht alle. Bitte zeigen Sie mir den richtigen.

    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. Vermeiden Sie es, die Variable direkt zu verwenden

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. Jetzt können Sie die Funktion get_current_page()in jedem anderen Teil der Datei functions.php verwenden.

toto_tico
quelle