Bagaimana saya bisa mendapatkan nama halaman saat ini di WordPress?

162

Kode PHP apa yang dapat digunakan untuk mengambil nama halaman saat ini dalam tema WordPress?

Semua solusi yang saya telah melihat begitu jauh ( the_title(), get_page()->post_name, get_post(), dll) tidak bekerja untuk sebuah halaman yang berisi entri posting. Mereka semua akan mengembalikan nama entri blog terbaru.

Dengan kata lain, anggaplah Anda memiliki halaman yang dibuat di WordPress dengan nama "Berita Saya". Halaman ini ditetapkan sebagai "halaman posting". Tambahkan beberapa posting ke halaman. Sekarang, API apa yang dapat digunakan untuk mengambil string "my-news" dan bukan nama posting terbaru?


Saya telah menemukan variabel berikut yang tampaknya berfungsi.

$wp_query->queried_object->post_name

Ini sebenarnya versi versi URL dari nama halaman (siput), yang juga saya cari. Ini diuji dengan templat default ( Dua Puluh Sepuluh ). Saya benar-benar tidak yakin mengapa dua variabel yang diberikan di bawah ini tidak berfungsi di situs saya. Berkat keatch untuk print_r()ujung .

Sekarang, mengapa informasi ini tersembunyi begitu dalam?

Bernard
sumber
untuk Nama gunakan: single_post_title ('', false); untuk penggunaan siput: get_query_var ('pagename');
jtmielczarek

Jawaban:

182

Variabel global WordPress $pagenameharus tersedia untuk Anda. Saya baru saja mencoba dengan pengaturan yang sama yang Anda tentukan.

$pagenamedidefinisikan dalam file wp-include / theme.php, di dalam fungsi get_page_template(), yang tentu saja dipanggil sebelum file tema halaman Anda diuraikan, sehingga tersedia kapan saja di dalam template Anda untuk halaman.

  • Meskipun tampaknya tidak didokumentasikan, $pagenamevar hanya disetel jika Anda menggunakan permalinks. Saya kira ini karena jika Anda tidak menggunakannya, WordPress tidak perlu halaman slug, jadi tidak mengaturnya.

  • $pagename tidak disetel jika Anda menggunakan halaman sebagai halaman depan statis.

    • Ini adalah kode di dalam /wp-includes/theme.php, yang menggunakan solusi yang Anda tunjukkan ketika $pagenametidak dapat diatur:

      $ pagename = get_query_var ('pagename'); if (! $ pagename && $ id> 0) {// Jika halaman statis ditetapkan sebagai halaman depan, $ pagename tidak akan disetel. Ambil itu dari objek kueri $ post = $ wp_query-> get_queried_object (); $ pagename = $ post-> post_name; }

AJJ
sumber
4
$ pagename kosong ketika digunakan di dalam header.php. Saya sudah mencoba menggunakan templat default (dua puluh) dan menggunakannya segera setelah tag <body> tetapi tidak disetel. Secara kebetulan, tidak satu pun dari variabel query_vars tampaknya ditetapkan pada tahap itu.
Bernard
1
Saya tidak dapat melihat alasan tidak adanya variabel itu, mungkin saya salah mengerti pengaturan Anda? Saya mengerti Anda mencoba melakukan ini di dalam templat halaman. Bahkan jika Anda menulis "echo $ pagename" di baris pertama header.php itu akan memberi Anda nilai. Apa versi WP yang Anda hadapi?
AJJ
1
Anda bisa mencoba pendekatan yang sedikit berbeda menggunakan get_query_var ('pagename').
AJJ
@ AJweb: Ya, ini untuk templat yang saya buat tapi saya menggunakan templat default untuk pengujian, di dalam header.php. Saya mendapat kesan bahwa Anda belum menguji solusi Anda. Apakah Anda melihat nama halaman saat Anda meletakkan <h1> <? Php echo $ pagename?> </h1> tepat setelah tag <body> di header.php?
Bernard
1
Ini melakukan trik untuk saya $pagename = $wp_query->queried_object->post_name;:, jangan lupa untuk mengatur global $wp_query;sebelumnya!
Saran
38

Pendekatan saya untuk mendapatkan nama siput halaman:

$slug = basename(get_permalink());
Goksel
sumber
Ini hanya berfungsi jika mereka menggunakan url cantik, bukan?
Betty
24

Ok, Anda harus meraih judul halaman sebelum loop.

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

Periksa rujukannya: http://codex.wordpress.org/Function_Reference/WP_Query#Properties .

Lakukan a

print_r($wp_query)

sebelum loop untuk melihat semua nilai $wp_queryobjek.

keatch
sumber
1
Ini juga tidak berhasil. Jika saya mencetak objek $ wp_query tepat setelah tag <body> saya melihat bahwa objek posting pertama adalah entri blog, bukan halaman itu sendiri. Namun, terima kasih atas tip print_r (). Saya bisa mengetahui variabel yang memiliki info yang saya cari (memasukkan info ini ke pertanyaan).
Bernard
menggemakan bahwa $ page_title var bekerja untuk saya di header, terima kasih.
Claire
22
<?php wp_title(''); ?>

Ini berhasil untuk saya.

Jika saya mengerti dengan benar, Anda ingin mendapatkan nama halaman pada halaman yang memiliki entri posting.

GregB
sumber
10

Anda bisa mendapatkan halaman saat ini, posting, atau jenis posting khusus dengan variabel global $post:

echo $post->post_title

Catatan: Dalam suatu fungsi atau kelas Anda harus menentukan global $post;sebelum mencoba menggunakan $post.

Jika Anda memiliki loop pada halaman Anda, pastikan Anda mengakhiri setiap loop dengan wp_reset_postdata();untuk mengatur $postkembali ke item default yang ditampilkan (halaman).

Catatan, variabel 'post_title' juga tersedia untuk setiap loop / kueri khusus ... termasuk item menu dan lampiran media ... semua yang ada di WordPress adalah 'pos'.

James
sumber
Jawaban ini berasal dari 2012, apakah ada pengetahuan tentang apakah metode ini masih akan bekerja dengan WP yang lebih baru?
Martin
1
Ya, itu akan — penanganan inti WP terhadap tipe posting tidak berubah
James
8

Jika Anda ingin mengakses halaman saat ini dari dalam file functions.php Anda (jadi, sebelum loop, sebelum $postdiisi, sebelum $wp_querydiinisialisasi, dll ...) Anda benar-benar tidak punya pilihan selain mengakses variabel server sendiri dan ekstrak halaman yang diminta dari string kueri.

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

Perhatikan bahwa ini adalah solusi "bodoh". Tidak tahu, misalnya bahwa halaman dengan siput 'segera hadir' jugap=6 . Dan itu mengasumsikan bahwa pengaturan permalink Anda diatur ke pagename(yang seharusnya!).

Meski begitu, bisa menjadi trik kecil yang bermanfaat jika Anda memiliki skenario terkontrol. Saya menggunakan ini dalam situasi di mana saya ingin mengarahkan pengunjung yang belum masuk ke halaman "segera hadir"; tapi saya harus memastikan bahwa saya tidak membuang mereka ke "redirect loop" yang ditakuti, jadi saya harus mengecualikan halaman "segera hadir" dari aturan ini:

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
sumber
7

Saya percaya bahwa tema starter Roots memiliki fungsi yang fantastis untuk mendapatkan judul halaman saat ini. Ini sangat bisa diretas, mencakup semua pangkalan, dan dapat dengan mudah digunakan dengan wp_titlehook.

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

Coba ini:

$pagename = get_query_var('pagename');
Mohammad Sabbagh
sumber
Penjelasan akan dilakukan secara berurutan (merespons dengan mengedit jawaban Anda , bukan di sini dalam komentar).
Peter Mortensen
5

Saya telah menemukan solusi yang lebih sederhana.

Dapatkan nilai yang dikembalikan dari nama halaman dari wp_title (). Jika kosong, cetak nama beranda, jika tidak gema nilai wp_title ().

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

Ingatlah untuk menghapus pemisahan dengan argumen pertama dan kemudian atur display ke false untuk digunakan sebagai input ke variabel. Kemudian cukup sembunyikan kode di antara heading Anda, dll. Tag.

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

Itu berhasil memperlakukan saya dan memastikan bahwa yang pertama dideklarasikan di bagian di mana Anda ingin mengekstrak $title, ini dapat disetel untuk mengembalikan variabel yang berbeda.

Tech1337
sumber
5

Kita hanya perlu menggunakan variabel global "post":

global $post;
echo $post->post_title;

Ini akan menggemakan judul halaman / posting saat ini.

Rahul Balakrishna
sumber
Bagaimana dengan HTML GET ?
Peter Mortensen
4

Menggunakan:

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

echo $title;
echo $parent_title;
Jerad Rutnam
sumber
Penjelasan akan diurutkan.
Peter Mortensen
3

Ini tampaknya yang paling mudah digunakan:

<?php single_post_title(); ?>
Bowenac
sumber
1
Panggilan ini mengembalikan nama posting terakhir, bukan nama halaman yang berisi posting, setidaknya itu yang saya mengerti dari dokumen online tanpa mengujinya.
Bernard
Ini persis apa yang saya cari. Saya membuat header baru untuk halaman saya dan ini menarik nama halaman seperti yang diharapkan. Terima kasih!
AJ Hernandez
3

Tampilkan judul sebelum loop dimulai:

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

Salah satu opsi, jika Anda mencari halaman yang ditanyakan sebenarnya, daripada halaman ID atau siput adalah untuk mencegat kueri:

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

Dalam fungsi Anda, Anda memiliki akses ke objek $ wp dan Anda bisa mendapatkan pagename atau nama pos dengan:

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

Jika, di sisi lain, Anda benar-benar membutuhkan data posting, tempat pertama untuk mendapatkannya (dan bisa dibilang dalam konteks ini, yang terbaik) adalah:

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

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

Akhirnya, saya menyadari ini mungkin bukan pertanyaan OP, tetapi jika Anda mencari nama halaman Admin , gunakan global$pagenow .

Tom Auger
sumber
2

Di dalam Lingkaran WordPress :

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

Ini akan menunjukkan kepada Anda judul halaman saat ini.

Untuk referensi: get_the_title ()

Umair Hamid
sumber
1

Ini versi saya:

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

get_query_var ('pagename') baru saja memberi saya halaman slug. Jadi di atas menggantikan semua tanda hubung, dan membuat huruf pertama dari setiap huruf besar - sehingga benar-benar dapat digunakan sebagai judul.

Abu-abu
sumber
0

Inilah yang akhirnya saya gunakan, pada 2018:

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

Saya sekarang menemukan fungsi ini di WordPress Codec ,

dipertanyakan

yang merupakan pembungkus untuk $wp_query->get_queried_object .

Posting ini menempatkan saya ke arah yang benar, tetapi tampaknya perlu pembaruan ini.

Sandra
sumber
0

Ini juga berfungsi jika Anda berada di functions.php. Ini bukan pendekatan terbaik karena Anda harus menggunakan array global, tetapi berhasil.

  1. Pertama, kita perlu menambahkan filter. Harus ada filter yang lebih baik untuk digunakan daripada template_include, tapi saya tidak tahu semuanya. Tolong tunjukkan saya ke yang benar.

    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. Hindari menggunakan variabel secara langsung

    function get_current_page( $echo =  false ) {
        if( !isset( $GLOBALS['current_page'] ) )
            return false;
        return $GLOBALS['current_page'];
    }
  3. Sekarang Anda dapat menggunakan fungsi get_current_page()di bagian lain dari functions.php.

toto_tico
sumber