Haruskah kita mempercayai pos global?

21

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

$postmisalnya 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 $postitu tidak dapat diandalkan. Sepotong kode yang ditulis dengan buruk yang menggunakan kueri khusus dapat mengubah $postglobal, 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 $postsangat tidak dapat diandalkan? Haruskah kita menggunakan global $postsama 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_querydan kemudian menggunakan metode-metodenya, seperti $wp_query->post.

Setiap pemikiran tentang ini akan dihargai.

Pieter Goosen
sumber
Menyetel ulang posting hanya menyalin var ke var lain, Anda dapat memanggilnya jutaan kali dalam kode Anda dan tidak melihat kinerja yang memukau, jadi saya tidak tahu apa yang tidak baik tentang itu.
Milo

Jawaban:

16

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 $postadalah 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 $postini adalah WP_Postcontoh yang valid :

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

Saya melakukan pengecekan juga dalam kasus yang jarang saya akses $postlangsung.

Pertimbangkan untuk get_queried_object()mengembalikan nilai yang tidak terduga jika beberapa kode menggunakan query_posts, tapi hei, jika seseorang menggunakan kode yang diandalkan query_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:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

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 menelepon wp_reset_postdata()setelah permintaan khusus, dan saya melakukan itu, tentu saja :)

gmazzap
sumber