@toscho meninggalkan komentar untuk jawaban ini yang membuat saya berpikir lagi. Seberapa besar kepercayaan yang harus kita miliki dalam lingkup global, khususnya mengenai post global seperti $post
?
Terus? Variabel global dapat ditimpa dari semua orang sebelum cek Anda berjalan. Itulah poin dari variabel global: akses global.
$post
misalnya tentunya adalah salah satu dari global yang sebagian besar dimodifikasi baik di dalam tema itu sendiri atau oleh plugin. Namun itu juga global yang paling umum digunakan dalam aplikasi lain dalam template yang diberikan, misalnya, untuk mengatur posting terkait.
Dari menjawab (dan mengomentari) beberapa posting dengan masalah khusus yang disebabkan oleh penggunaan permintaan khusus , sangat menonjol bahwa sebagian besar masalah disebabkan oleh permintaan kustom yang tidak diatur ulang (permintaan kustom mengubah global yang ditetapkan oleh permintaan utama).
Dari sini, jelas bahwa $post
itu tidak dapat diandalkan. Sepotong kode yang ditulis dengan buruk yang menggunakan kueri khusus dapat mengubah $post
global, yang pada gilirannya akan merusak sesuatu (seperti posting terkait).
Hanya segelintir pengembang WordPress yang benar-benar berpengetahuan luas dalam inti pekerjaan inti dan tahu apa yang harus dihindari dan apa yang tidak. Populasi pengguna yang lebih besar tidak tahu bagaimana inti WordPress beroperasi.
Mereka hanya mengunduh tema dan menginstal plugin untuk melakukan apa yang diperlukan atau bahkan hanya menyalin kode dari tutorial. Katakanlah mereka memasang plugin yang ditulis dengan buruk yang memecah posting terkait pada posting tunggal mereka, bagaimana mereka tahu apa yang menyebabkannya? Apakah mereka dapat mengatasinya sendiri atau akan menjadi orang keseratus yang menulis email kepada penulis tema tentang masalah ini, atau memposting pertanyaan di situs ini?
Pertanyaan saya: Bagaimana Anda melindungi dari masalah-masalah yang disebabkan oleh kode impor lainnya ketika global like $post
sangat tidak dapat diandalkan? Haruskah kita menggunakan global $post
sama sekali? Apa saja alternatifnya?
Hanya untuk berbagi pikiran saya di sini sebelum saya menyimpulkan: Saya telah memikirkan (dan melihat dalam beberapa tema dan plugin juga) baik menggunakan wp_reset_postdata()
atau wp_reset_query()
sebelum memanfaatkan $post
, untuk memastikan bahwa global sedang diatur ulang ke kueri utama $post
. Tetapi mengapa saya harus mengembang kode saya di tema saya karena orang lain tidak benar kode plugin-nya? Dan jika seseorang benar mengatur ulang kueri khusus mereka, operasi ini dijalankan untuk kedua kalinya, yang tidak baik.
Metode kedua yang saya pikirkan adalah memanfaatkan $wp_query
dan kemudian menggunakan metode-metodenya, seperti $wp_query->post
.
Setiap pemikiran tentang ini akan dihargai.
Jawaban:
Ada kebenaran yang menyedihkan: Anda tidak pernah bisa yakin bahwa beberapa kode tidak akan merusak kode Anda , dan tidak ada yang dapat Anda lakukan untuk mencegahnya. Terutama di WordPress, di mana semuanya bersifat global.
Yang mengatakan, ya, global
$post
adalah salah satu var global yang paling banyak digunakan, jadi menggunakan perawatan khusus untuk itu bisa menjadi ide yang bagus.Dalam kode saya, saya jarang langsung mengakses global
$post
.Ketika dalam kontes tunggal , saya menggunakan
get_queried_object()
dan biasanya memeriksa apakah$post
ini adalahWP_Post
contoh yang valid :Saya melakukan pengecekan juga dalam kasus yang jarang saya akses
$post
langsung.Pertimbangkan untuk
get_queried_object()
mengembalikan nilai yang tidak terduga jika beberapa kode menggunakanquery_posts
, tapi hei, jika seseorang menggunakan kode yang diandalkanquery_posts
, mereka layak mendapatkannya jika situs mereka rusak :)Selain itu, jika saya mengharapkan beberapa kondisi, saya memeriksanya, misalnya jenis posting tertentu atau status tertentu.
Jika saya perlu lebih banyak pemeriksaan dan di lebih banyak tempat, saya membuat fungsi untuk melakukannya:
Saat berada di dalam kueri khusus, saat berulang, panggilan
the_post()
mengatur ulang objek posting, jadi itu harus baik-baik saja. Maka itu adalah tanggung jawab saya untuk meneleponwp_reset_postdata()
setelah permintaan khusus, dan saya melakukan itu, tentu saja :)sumber