kerusakan is_front_page ()?

8

Saya punya masalah mendasar yang membuat saya terkejut WP tidak memiliki solusi asli untuk (kecuali saya mengabaikan sesuatu, semoga).

Saya memiliki situs WP dengan static pageditetapkan sebagai halaman depan dalam pengaturan membaca. Dalam kode plugin, saya mencoba menentukan apakah WP menampilkan halaman depan dan menambahkan kelas ke $classesarray jika benar. Saya menggunakan kode berikut untuk mencapainya

add_filter('body_class', function($classes){
    if(is_front_page() || is_home()){
        $classes[] = 'home-page';
    }
    return $classes;
});  

Saya menggunakan keduanya is_front_page()dan is_home()jika pengaturan halaman depan berubah dari halaman statis ke tata letak blog di masa depan.

Masalah yang saya temui adalah bahwa kode ini menambah home-pagekelas bodybahkan pada wp-signup.phphalaman.

Memeriksa kode mengungkapkan is_front_page()panggilan itu WP_Query::is_front_page(), yang pada dasarnya mengembalikan hasil WP_Query::is_page(get_option('page_on_front')). Jadi akar masalahnya adalah yang wp-signup.phpmemenuhi syarat sebagai halaman (id) dikembalikan oleh get_option('page_on_front')( yang mengembalikan IDhalaman statis ditetapkan sebagai halaman depan dalam pengaturan> membaca ).

WP_Query::is_page()menggunakan secara WP_Query::get_queried_object()internal untuk memutuskan apakah halaman saat ini adalah halaman yang ada dalam argumen metode. Dalam wp-signup.phpkasus ini, kode yang menetapkan objek yang ditanyakan saat ini adalah sebagai berikut

/*...other code... */
elseif ( $this->is_singular && ! empty( $this->post ) ) {
    $this->queried_object = $this->post;
    $this->queried_object_id = (int) $this->post->ID;
}
/*...other code... */  

Ini menunjukkan bahwa wordpress, untuk beberapa alasan, menanyakan halaman depan untuk menampilkan wp-signup.phpdan memunculkan pertanyaan-pertanyaan berikut.

  • Mengapa is_front_page()mengembalikan hasil yang salah?
  • AFAIK wp-signup.phptidak pernah dapat ditetapkan sebagai beranda menggunakan pengaturan administrator Wordpress lalu mengapa kode wordpress tidak dibatalkan hanya dengan memeriksa PHP_SELFatau REQUEST_URI?
  • Mengapa WP_Query memiliki beranda saat ini pada $this->postsaat ini?

Saya telah mengesampingkan masalah plugin dengan menghapus direktori plugins (and mu-plugins). Itu masih memenuhi syarat wp-signup.phpsebagai halaman depan di mana tidak untuk halaman lain.

Setiap bantuan mengenai masalah ini akan sangat dihargai.

Perbarui
Saya menggunakan WP verison 4.2.4 dan ini merupakan pengaturan multisite.

Terima kasih.

Ejaz
sumber
Apakah Anda benar-benar menggunakan WordPress versi terbaru? Dan apakah ini pengaturan multisite?
TheDeadMedic
Saya menggunakan versi 4.2.4 dan ya itu adalah pengaturan multisite. Ditambahkan ke pertanyaan.
Ejaz
Ini ... aneh. Yang bisa saya sarankan untuk saat ini adalah menggunakan ifkondisi berikut :( ! isset( $GLOBALS['pagenow'] ) || $GLOBALS['pagenow'] !== 'wp-signup.php' ) && ( is_front_page() || is_home() )
TheDeadMedic
Terima kasih atas saran @TheDeadMedic, itu akan berhasil. Jadi masalahnya adalah bug WP?
Ejaz
Saya sebenarnya pernah mendengar ini terjadi sebelumnya di WPMU. Coba nonaktifkan tema Anda dan aktifkan kembali.
Matt van Andel

Jawaban:

1

Hanya spekulasi, tapi saya ingin tahu apakah Anda mengalami masalah fungsi anonim. Fungsi anonim diizinkan dalam WP, dan biasanya berfungsi dengan baik (menganggap PHP diperbarui), tetapi, jika Anda mencari di sekitar Anda akan menemukan laporan bug yang diduga atau setidaknya perilaku yang tidak terduga.

Dalam hal ini, saya tidak yakin bahwa saya pernah melihat fungsi anonim yang digunakan sebagai contoh di WordPress Codex, dan saya tidak ingat pernah menjalankannya sebelumnya dalam tema dan kode plug-in. Tentu saja, saya tidak punya mata untuk fungsi-fungsi anon, tetapi, tetap saja, saya pikir fungsi di atas hampir selalu ditulis dalam beberapa versi format dua bagian yang lebih akrab - yaitu:

add_filter('body_class', 'ejay_add_home_class');

function ejay_add_home_class($classes) {

    if (is_front_page() || is_home()) {

        $classes[] = 'home-page';
    }

    return $classes;
} 

Jadi, sebagai percobaan, saya akan mencoba format di atas yang lebih "konvensional", dan juga mencobanya dengan prioritas yang ditunjuk lebih tinggi atau lebih rendah dari 10. Jika melampirkan beberapa fungsi anonim ke filter yang sama, saya akan memberi mereka prioritas yang berbeda, atau gunakan array (contoh di sini: http://snippets.khromov.se/adding-multiple-actions-and-filters-using-anonymous-functions-in-wordpress/ ), atau tulis masing-masing dari keduanya dengan nama dua- berpisah juga.

Sebenarnya, saya menemukan cara 2 bagian yang sedikit lebih panjang lebih mudah untuk dibaca, dilacak, dan disesuaikan.

CK MacLeod
sumber
-4

WordPress menggunakan templat yang berbeda untuk halaman di situs Anda. Jika Anda memiliki template page.php di tema Anda, itu akan digunakan untuk menampilkan halaman Anda. Jika Anda memiliki single.php, itu akan digunakan untuk menampilkan posting tunggal Anda. index.php atau home.php akan menampilkan halaman rumah Anda, atau page.php jika Anda memiliki halaman tertentu yang dipilih sebagai halaman rumah melalui opsi membaca.

Jadi, pernyataan kondisional Anda:

<?php if (is_front_page()){ ?>
<p>Home Page</p>
<?php else { ?>
<p>Not Home Page</p>
<?php } ?>
?>

Akan sangat berguna di header.php atau file footer.php- atau di page.php jika Anda memiliki halaman tertentu yang dipilih dalam opsi membaca.

jim. sial
sumber
Terima kasih atas jawabannya, tetapi saya gagal melihat bagaimana ini memengaruhi nilai yang dikembalikan oleh fungsi yang disebutkan sebelumnya.
Ejaz
5
BERHENTI SPAMMING !!!! . Tautan Anda adalah sampah kembali ke situs web Anda sendiri. Posting Anda berikutnya akan ditandai sebagai spam. Terima kasih
Pieter Goosen
Ini bahkan tidak menjawab pertanyaan yang ada
Pieter Goosen