WordPress'te geçerli sayfa adını nasıl alabilirim?


162

WordPress temasındaki geçerli sayfa adını almak için hangi PHP kodu kullanılabilir?

Şu ana kadar gördüğüm tüm çözümler ( the_title(), get_page()->post_name,get_post() vs.) sonrası girdileri içeren bir sayfa için çalışma yok. Hepsi en son blog girişinin adını döndürür.

Başka bir deyişle, WordPress'te "Haberlerim" adında bir sayfanız oluşturulduğunu varsayın. Bu sayfa "gönderi sayfası" olarak ayarlanmıştır. Sayfaya birkaç gönderi ekleyin. Şimdi, en son yayının adı yerine "haberlerim" dizesini almak için hangi API kullanılabilir?


İşe yarayan aşağıdaki değişkeni buldum.

$wp_query->queried_object->post_name

Bu aslında sayfa adının (slug) URL dostu sürümüdür, bu da aradığım şeydi. Bu, varsayılan şablon ( Yirmi On ) ile test edilmiştir . Aşağıda verilen iki değişkenin neden sitemde çalışmadığından emin değilim. Keatch için teşekkürlerprint_r() ucu .

Şimdi, bu bilgiler neden bu kadar derinlere gizlenmiş?


Ad kullanımı için: single_post_title ('', false); bilgi kullanımı için: get_query_var ('sayfa adı');
jtmielczarek

Yanıtlar:


182

WordPress genel değişkeni $pagenamesizin için kullanılabilir olmalıdır. Belirttiğiniz kurulumla yeni denedim.

$pagenamewp-include / theme.php dosyasında get_page_template(), elbette sayfa teması dosyalarınız ayrıştırılmadan önce çağrılan işlevin içinde tanımlanır , bu nedenle sayfalar için şablonlarınızın içindeki herhangi bir noktada kullanılabilir.

  • Belgelenmemiş gibi görünse de, $pagenamevar yalnızca kalıcı bağlantılar kullanıyorsanız ayarlanır. Sanırım bu, onları kullanmazsanız, WordPress'in sayfa slug'ına ihtiyacı olmadığı için ayarlanmamıştır.

  • $pagename Sayfayı statik bir ön sayfa olarak kullanırsanız ayarlanmaz.

    • Bu $pagenameayarlanamadığı zaman belirttiğiniz çözümü kullanan /wp-includes/theme.php içindeki koddur :

      $ pagename = get_query_var ('sayfa adı'); if (! $ sayfa adı && $ id> 0) {// Statik sayfa ön sayfa olarak ayarlanmışsa, $ sayfa adı ayarlanmaz. Sorgulanan nesneden alın $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }


4
$ pagename header.php içinde kullanıldığında boştur. Ben varsayılan şablonu (yirmi) kullanarak ve hemen <body> etiketinden sonra kullanarak denedim ama ayarlanmadı. Bu arada, query_vars değişkenlerinin hiçbiri bu aşamada ayarlanmış gibi görünmüyor.
Bernard

1
Bu değişkenin yokluğunun bir sebebini göremiyorum, belki de kurulumunuzu yanlış anladım? Bunu bir sayfa şablonunda yapmaya çalıştığınızı anladım. Header.php dosyasının ilk satırına "echo $ pagename" yazsanız bile size değer vermelidir. Hangi WP sürümü ile uğraşıyorsunuz?
AJJ

1
Get_query_var ('sayfa adı') kullanarak biraz farklı bir yaklaşım deneyebilirsiniz.
AJJ

@AJweb: Evet, oluşturduğum bir şablon için ama header.php içinde test için varsayılan şablonu kullanıyorum. Çözümünüzü test etmediğiniz izlenimi ediniyorum. Header.php dosyasındaki <body> etiketinin hemen altına bir <h1> <? Php echo $ pagename?> </h1> eklediğinizde sayfa adını görüyor musunuz?
Bernard

1
Bu benim için hile yaptı:, $pagename = $wp_query->queried_object->post_name;sadece önceden ayarlamayı unutmayınglobal $wp_query; !
Saran

39

Sayfanın bilgi adını almak için yaklaşımım:

$slug = basename(get_permalink());

Bu sadece güzel url kullanıyorsa işe yarıyor, değil mi?
Betty

24

Tamam, döngüden önce sayfa başlığını almalısınız .

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

Referansı kontrol edin: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

Yapın

print_r($wp_query)

$wp_querynesnenin tüm değerlerini görmek için döngüden önce .


1
Bu da işe yaramıyor. <body> etiketinin hemen ardından $ wp_query nesnesini yazdırırsam, ilk yazı nesnesinin sayfanın kendisi değil blog girişi olduğunu görürüm. Ancak, print_r () ipucu için teşekkürler. Aradığım bilgiyi içeren değişkeni bulabilirim (bu bilgiyi soruya koyarak).
Bernard

$ page_title var başlıkta benim için çalıştı yankılanan, teşekkürler.
Claire

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

Bu benim için çalıştı.

Doğru anlarsam, sayfa adını yazı girişleri olan bir sayfaya almak istersiniz.


10

Geçerli sayfayı, postayı veya özel yazı türünü genel değişkenle alabilirsiniz $post:

echo $post->post_title

Not: Bir işlevde veya sınıfta global $post;, kullanmaya çalışmadan önce belirtmeniz gerekir$post .

Sayfanızda döngüler varsa, wp_reset_postdata();ayarlamak için her döngüyü sonlandırdığınızdan emin olun.$post varsayılan öğe varlığa geri (sayfa) görüntülenir.

Not: 'post_title' değişkeni, menü öğeleri ve medya ekleri de dahil olmak üzere herhangi bir özel döngü / sorgu ... için kullanılabilir ... WordPress'teki her şey bir 'gönderi'dir.


Bu cevap 2012'den beri, bu yöntemin daha yakın zamanda yürütülen WP ile çalışıp çalışmayacağı hakkında herhangi bir bilgi var mı?
Martin

1
Evet, WP'nin posta türlerinin temel işleyişi değişmedi
James

8

Eğer functions.php dosyası içinden akım sayfasına erişmek için arıyorsanız (yani önce döngü, daha önce $postönce doldurulur $wp_querygerçekten başka seçeneğimiz yok ancak sunucu değişkenler kendilerini erişmek için ... vb başlatılır) ve istenen sayfayı sorgu dizesinden çıkarın.

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

Bunun "aptal" bir çözüm olduğunu unutmayın. Mesela slug 'yakında' olan sayfanın da olduğunu bilmiyor p=6. Ve kalıcı bağlantı ayarlarınızınpagename (yine de olması gerekir!) Olarak .

Kontrollü bir senaryo varsa yine de yararlı bir numara olabilir. Bunu, giriş yapmamış ziyaretçileri bir "yakında" sayfasına yönlendirmek istediğim bir durumda kullanıyorum; ama onları korkunç "yönlendirme döngüsüne" atmamaya dikkat etmeliyim, bu yüzden "yakında" sayfasını bu kuralın dışında tutmalıyım:

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

Roots starter temasının geçerli sayfa başlığını almak için harika bir işleve sahip olduğuna inanıyorum . Çok hacklenebilir, tüm üsleri kapsar ve wp_titlekanca ile kolayca kullanılabilir .

/**
 * 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

Daha basit bir çözüm buldum.

Sayfa adının döndürülen değerini wp_title () 'den alın. Boşsa, ana sayfa adını yazdırın, aksi takdirde wp_title () değerini yankılayın.

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

İlk bağımsız değişkeni olan ayırmayı kaldırmayı ve sonra değişkeni girdi olarak kullanmak için display'i false olarak ayarlamayı unutmayın. Ardından, başlık vb. Etiketler arasındaki kodu tıklamanız yeterlidir.

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

Benim için bir tedavi çalıştı ve ilkinin ayıklamak istediğiniz bölümde bildirildiğinden emin olun $title, bu farklı değişkenleri döndürmek için ayarlanabilir.


5

Sadece "post" global değişkenini kullanmamız gerekiyor:

global $post;
echo $post->post_title;

Bu işlem geçerli sayfa / yayın başlığını yansıtacaktır.


HTML GET ne olacak ?
Peter Mortensen

4

kullanın:

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

echo $title;
echo $parent_title;

Bir açıklama yapılabilir.
Peter Mortensen

3

Bu kullanımı en kolay gibi görünüyor:

<?php single_post_title(); ?>

1
Bu çağrı, gönderileri içeren sayfa adını değil, son gönderi adını döndürür, en azından çevrimiçi dokümandan test etmeden anladığım şey budur.
Bernard

Tam da aradığım şey buydu. Sayfam için yeni bir başlık oluşturdum ve bu, sayfanın adını beklendiği gibi çekti. Teşekkürler!
AJ Hernandez

3

Döngü başlamadan önce başlığı göster:

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

2

Seçeneklerden biri, sayfa kimliği veya bilgi dosyası yerine gerçek sorgulanan sayfayı arıyorsanız sorguyu durdurmaktır:

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

İşlevi içinde, $ wp nesnesine erişiminiz olur ve pagename veya posta adını şu şekilde alabilirsiniz:

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

Öte yandan, gönderi verilerine gerçekten ihtiyacınız varsa, onu almak için ilk yer (ve muhtemelen bu bağlamda, en iyisi):

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

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

Son olarak, bunun muhtemelen OP'nin sorusu olmadığını anlıyorum, ancak Yönetici arıyorsanız sayfa adını global olanı kullanın $pagenow.


2

İçinde WordPress döngü :

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

Bu size geçerli sayfa başlığını gösterir.

Referans için: get_the_title ()


1

İşte benim sürümüm:

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

get_query_var ('sayfa adı') bana sadece sayfa bilgisini veriyordu. Böylece yukarıdakiler tüm çizgilerin yerini alır ve her kelimenin ilk harfini büyük harf yapar - böylece aslında bir başlık olarak kullanılabilir.


0

2018'den itibaren bunu kullandım:

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

0

Şimdi bu işlevi WordPress Codec'te buldum ,

sorgulanmak

hangi bir sarıcıdır $wp_query->get_queried_object.

Bu gönderi beni doğru yöne koydu, ancak bu güncellemeye ihtiyacı var gibi görünüyor.


0

Bu, function.php içinde iseniz da çalışır. Global diziyi kullanmak zorunda olduğunuz için en iyi yaklaşım değil, ama işe yarıyor.

  1. İlk olarak, bir filtre eklememiz gerekiyor. Kullanmak için template_include'dan daha iyi bir filtre olmalı, ama hepsini bilmiyorum. Lütfen beni doğru olana yönlendirin.

    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. Değişkeni doğrudan kullanmaktan kaçının

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. Şimdi işlevi function.php get_current_page()dosyasının başka herhangi bir bölümünde kullanabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.