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?


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


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

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.


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.


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”.


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

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();
  }
}


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.



4

Posługiwać się:

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

echo $title;
echo $parent_title;

Wytłumaczenie byłoby w porządku.
Peter Mortensen

3

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

<?php single_post_title(); ?>

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


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.


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


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.


0

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

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

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.