Jak mogę uzyskać aktualną nazwę strony w WordPress?

162

Jakiego kodu PHP można użyć do pobrania bieżącej nazwy strony w motywie WordPress?

Wszystkie rozwiązania, które widziałem do tej pory ( the_title(), get_page()->post_name, get_post(), itd.) Nie działają dla strony, która zawiera wpisy pocztowych. Wszystkie zwrócą nazwę ostatniego wpisu na blogu.

Mówiąc inaczej, załóżmy, że masz stronę utworzoną w WordPress o nazwie „Moje wiadomości”. Ta strona jest ustawiona jako „strona postu”. Dodaj kilka postów do strony. Teraz, jakiego interfejsu API można użyć do pobrania ciągu „my-news” zamiast nazwy najnowszego postu?


Znalazłem następującą zmienną, która wydaje się działać.

$wp_query->queried_object->post_name

W rzeczywistości jest to przyjazna dla adresu URL wersja nazwy strony (slug), której też szukałem. Zostało to przetestowane z domyślnym szablonem ( dwadzieścia dziesięć ). Naprawdę nie jestem pewien, dlaczego dwie podane poniżej zmienne nie działają w mojej witrynie. Dzięki zatrzaskowi za print_r()końcówkę .

Dlaczego ta informacja jest tak głęboko ukryta?

Bernarda
źródło
do użycia nazwy: single_post_title ('', false); dla slugu użyj: get_query_var ('nazwa strony');
jtmielczarek

Odpowiedzi:

182

Globalna zmienna WordPress $pagenamepowinna być dla Ciebie dostępna. Właśnie wypróbowałem tę samą konfigurację, którą określiłeś.

$pagenamejest zdefiniowana w pliku wp-obejmuje / theme.php, wewnątrz funkcji get_page_template(), która jest oczywiście wywoływana przed analizowaniem plików motywów strony, więc jest dostępna w dowolnym miejscu w szablonach stron.

  • Chociaż wydaje się, że nie jest to udokumentowane, $pagenamezmienna jest ustawiana tylko wtedy, gdy używasz bezpośrednich linków. Wydaje mi się, że dzieje się tak dlatego, że jeśli ich nie używasz, WordPress nie potrzebuje informacji o stronie, więc go nie konfiguruje.

  • $pagename nie jest ustawiona, jeśli używasz tej strony jako statycznej strony tytułowej.

    • To jest kod wewnątrz /wp-includes/theme.php, który używa rozwiązania, które wskazałeś, gdy $pagenamenie można go ustawić:

      $ nazwa strony = get_query_var ('nazwa strony'); if (! $ pagename && $ id> 0) {// Jeśli statyczna strona jest ustawiona jako strona główna, $ pagename nie zostanie ustawiona. Pobierz go z odpytywanego obiektu $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }

AJJ
źródło
4
$ pagename jest puste, gdy jest używane wewnątrz header.php. Próbowałem użyć domyślnego szablonu (dwudziestu tysięcy) i użyć go bezpośrednio po tagu <body>, ale nie jest on ustawiony. Nawiasem mówiąc, żadna ze zmiennych query_vars nie wydaje się być ustawiona na tym etapie.
Bernard
1
Nie widzę żadnego powodu braku tej zmiennej, może źle zrozumiałem twoją konfigurację? Zrozumiałem, że próbujesz to zrobić wewnątrz szablonu strony. Nawet jeśli napiszesz "echo $ pagename" w pierwszym wierszu header.php, powinno to dać ci wartość. Z jaką wersją WP masz do czynienia?
AJJ
1
Możesz wypróbować nieco inne podejście, używając get_query_var ('nazwa strony').
AJJ
@AJweb: Tak, to dla szablonu, który tworzę, ale używam domyślnego szablonu do testowania, wewnątrz header.php. Mam wrażenie, że nie przetestowałeś swojego rozwiązania. Czy widzisz nazwę strony po umieszczeniu <h1> <? Php echo $ pagename?> </h1> bezpośrednio po tagu <body> w pliku header.php?
Bernard
1
To załatwiło sprawę: $pagename = $wp_query->queried_object->post_name;po prostu nie zapomnij ustawić global $wp_query;wcześniej!
Saran
38

Moje podejście do uzyskania nazwy ślimaka strony:

$slug = basename(get_permalink());
goksel
źródło
Działa to tylko wtedy, gdy używają ładnego adresu URL, prawda?
Betty
24

Ok, musisz pobrać tytuł strony przed pętlą.

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

Sprawdź odniesienie: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

Zrób

print_r($wp_query)

przed pętlą, aby zobaczyć wszystkie wartości $wp_queryobiektu.

keatch
źródło
1
To też nie działa. Jeśli drukuję obiekt $ wp_query zaraz po tagu <body>, widzę, że pierwszy obiekt wiadomości to wpis blogu, a nie sama strona. Jednak dzięki za wskazówkę print_r (). Mogłem znaleźć zmienną, która zawiera informacje, których szukam (umieszczając te informacje w pytaniu).
Bernard
powtarzając, że zmienna $ page_title zadziałała dla mnie w nagłówku, dzięki.
Claire
22
<?php wp_title(''); ?>

To zadziałało dla mnie.

Jeśli dobrze rozumiem, chcesz uzyskać nazwę strony na stronie zawierającej wpisy postów.

GregB
źródło
10

Możesz uzyskać bieżącą stronę, post lub niestandardowy typ posta za pomocą zmiennej globalnej $post:

echo $post->post_title

Uwaga: w funkcji lub klasie musisz określić global $post;przed próbą użycia $post.

Jeśli masz pętle na swojej stronie, upewnij się, że kończysz każdą pętlę, wp_reset_postdata();aby $postprzywrócić domyślny wyświetlany element (stronę).

Uwaga, zmienna „post_title” jest również dostępna dla dowolnej niestandardowej pętli / zapytania ... w tym elementów menu i załączników multimedialnych ... wszystko w WordPress jest „postem”.

James
źródło
Ta odpowiedź pochodzi z 2012 r., Czy jest jakaś wiedza, czy ta metoda będzie nadal działać z nowszym WP?
Martin
1
Tak, będzie - podstawowa obsługa typów postów przez WP nie uległa zmianie
James
8

Jeśli chcesz uzyskać dostęp do bieżącej strony z pliku functions.php (więc przed zapełnieniem pętli, przed $post, przed $wp_queryzainicjowaniem itp.), Naprawdę nie masz innego wyboru, jak tylko uzyskać dostęp do samych zmiennych serwera i wyodrębnij żądaną stronę z ciągu zapytania.

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

Zauważ, że jest to „głupie” rozwiązanie. Nie wie, na przykład, że strona ze slugiem „wkrótce” też jest p=6. Zakłada się, że ustawienia permalinku są ustawione na pagename(które i tak powinny być!).

Mimo to może być użyteczną małą sztuczką, jeśli masz kontrolowany scenariusz. Używam tego w sytuacji, gdy chcę przekierować niezalogowanych odwiedzających do strony „wkrótce”; ale muszę się upewnić, że nie wrzucam ich do przerażającej „pętli przekierowań”, więc muszę wykluczyć stronę „wkrótce” z tej reguły:

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
źródło
7

Uważam, że motyw startowy Roots ma fantastyczną funkcję, aby uzyskać bieżący tytuł strony. Jest bardzo łatwy do hakowania, zakrywa wszystkie podstawy i można go łatwo używać z wp_titlehaczykiem.

/**
 * 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
źródło
5

Spróbuj tego:

$pagename = get_query_var('pagename');
Mohammad Sabbagh
źródło
Wyjaśnienie byłoby w porządku (odpowiedz, edytując swoją odpowiedź , a nie tutaj w komentarzach).
Peter Mortensen
5

Mam prostsze rozwiązanie.

Pobierz zwróconą wartość nazwy strony z wp_title (). Jeśli jest pusta, wydrukuj nazwę strony domowej, w przeciwnym razie powtórz wartość wp_title ().

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

Pamiętaj, aby usunąć separację z pierwszym argumentem, a następnie ustawić display na false, aby użyć go jako danych wejściowych dla zmiennej. Następnie po prostu umieść kod między tagami nagłówka itp.

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

Działało to dla mnie nie lada gratką i upewniając się, że pierwsza jest zadeklarowana w sekcji, w której chcesz wyodrębnić $title, można to dostosować, aby zwracały różne zmienne.

Tech1337
źródło
5

Musimy tylko użyć zmiennej globalnej „post”:

global $post;
echo $post->post_title;

Spowoduje to powtórzenie tytułu bieżącej strony / posta.

Rahul Balakrishna
źródło
A co z HTML GET ?
Peter Mortensen
4

Posługiwać się:

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

echo $title;
echo $parent_title;
Jerad Rutnam
źródło
Wytłumaczenie byłoby w porządku.
Peter Mortensen
3

Wydaje się, że jest to najłatwiejsze w użyciu:

<?php single_post_title(); ?>
Bowenac
źródło
1
To wywołanie zwraca nazwę ostatniego posta, a nie nazwę strony zawierającej posty, przynajmniej to rozumiem z dokumentu online bez testowania go.
Bernard
To jest dokładnie to, czego szukałem. Zrobiłem nowy nagłówek dla mojej strony i to ściągnęło nazwę strony zgodnie z oczekiwaniami. Dzięki!
AJ Hernandez
3

Pokaż tytuł przed rozpoczęciem pętli:

$page_title = $wp_query->post->post_title;
Ajay Malhotra
źródło
2

Jedną z opcji, jeśli szukasz rzeczywistej strony, której dotyczyło zapytanie, a nie identyfikatora strony lub informacji o pracy, jest przechwycenie zapytania:

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

W ramach swojej funkcji masz dostęp do obiektu $ wp i możesz pobrać nazwę strony lub nazwę postu za pomocą:

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

Z drugiej strony, jeśli naprawdę potrzebujesz danych postu, pierwszym miejscem, w którym możesz je zdobyć (i prawdopodobnie w tym kontekście, najlepszym) jest:

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

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

Wreszcie zdaję sobie sprawę, że prawdopodobnie nie było to pytanie OP, ale jeśli szukasz nazwy strony administratora , użyj globalnej $pagenow.

Tom Auger
źródło
2

W pętli WordPress :

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

Spowoduje to wyświetlenie aktualnego tytułu strony.

Dla porównania: get_the_title ()

Umair Hamid
źródło
1

Oto moja wersja:

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

get_query_var ('nazwa strony') właśnie podał mi informacje o stronie. Tak więc powyższe zastępuje wszystkie myślniki i sprawia, że ​​pierwsza litera każdego słowa jest wielka - dzięki czemu można go faktycznie użyć jako tytułu.

szary
źródło
0

Oto, czego ostatecznie używałem, od 2018:

<section id="top-<?=(is_front_page() ? 'home' : basename(get_permalink()));?>">
Dotacja
źródło
0

Znalazłem tę funkcję w kodeku WordPress ,

zostać zapytanym

który jest opakowaniem dla $wp_query->get_queried_object .

Ten post skierował mnie we właściwym kierunku, ale wydaje się, że potrzebuje tej aktualizacji.

Sandra
źródło
0

Działa to również, jeśli jesteś w pliku functions.php. Nie jest to najlepsze podejście, ponieważ musisz używać tablicy globalnej, ale działa.

  1. Najpierw musimy dodać filtr. Musi istnieć lepszy filtr niż template_include, ale nie znam ich wszystkich. Wskaż mi właściwy.

    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. Unikaj bezpośredniego używania zmiennej

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. Teraz możesz skorzystać z funkcji get_current_page() w dowolnej innej części pliku functions.php.

toto_tico
źródło