Ada dua query_posts()
fungsi yang berbicara secara teknis. Yang satu query_posts()
sebenarnya WP_Query::query_posts()
dan yang lain ada di ruang global.
Meminta dari kewarasan:
Jika global query_posts()
itu "jahat" mengapa tidak usang?
Atau mengapa tidak ditandai sebagai _doing_it_wong
.
query-posts
prosti
sumber
sumber
Jawaban:
Pertanyaan penting
Menggali Mari ke trio:
::query_posts
,::get_posts
danclass WP_Query
untuk memahami::query_posts
lebih baik.Landasan untuk mendapatkan data di WordPress adalah
WP_Query
kelasnya. Baik metode::query_posts
dan::get_posts
gunakan kelas itu.Memahami
WP_Query
Berikut adalah
WP_Query
strukturnya:WP_Query
adalah pisau tentara Swiss.Beberapa hal tentang
WP_Query
:pre_get_posts
kait bergunaSaya tidak bisa menjelaskan semua ini, tetapi beberapa di antaranya rumit, jadi mari kita berikan tips singkat.
WP_Query
adalah sesuatu yang dapat Anda kendalikan melalui argumen yang Anda berikanIni akan menjadi contoh minimal membuat
WP_Query
objek dari argumen:WP_Query
serakahDibuat atas gagasan,
get all you can
pengembang WordPress memutuskan untuk mendapatkan semua data yang memungkinkan sejak awal karena ini baik untuk kinerja . Inilah sebabnya mengapa secara default ketika kueri mengambil 10 posting dari database, ia juga akan mendapatkan istilah dan metadata untuk posting ini melalui kueri terpisah. Persyaratan dan metadata akan di-cache (prefetched).Anda dapat menonaktifkan caching jika Anda mengatur
update_post_meta_cache
danupdate_post_term_cache
untukfalse
saat mengaturWP_Query
argumen. Ketika caching dinonaktifkan, data akan diminta dari database hanya berdasarkan permintaan.Untuk sebagian besar caching blog WordPress berfungsi dengan baik, tetapi ada beberapa kesempatan ketika Anda menonaktifkan caching.
WP_Query
menggunakan kelas pembantuJika Anda memeriksa
WP_Query
bidang di sana Anda memiliki tiga ini:Anda bisa membayangkan menambahkan baru di masa depan.
WP_Query
memegang zat untuk pengulanganDalam kode ini:
Anda mungkin memperhatikan
WP_Query
memiliki substansi yang dapat Anda lakukan berulang kali. Metode pembantu ada di sana juga. Anda cukup mengaturwhile
loop.WP_Query
primer dan sekunderDi WordPress Anda memiliki satu kueri primer dan nol atau lebih kueri sekunder .
Permintaan primer dikenal sebagai permintaan utama atau permintaan biasa . Permintaan sekunder juga disebut permintaan khusus .
WordPress menggunakan
WP_Rewrite
kelas awal untuk membuat argumen kueri berdasarkan pada URL. Berdasarkan argumen ini, ia menyimpan dua objek identik di ruang global. Kedua hal ini akan menampung permintaan utama.Ketika kami mengatakan permintaan utama kami memikirkan variabel-variabel ini. Pertanyaan lain dapat disebut sekunder atau kustom.
WP_Query
memilikipre_get_posts
kait berguna .Ini adalah kait tindakan. Itu akan berlaku untuk contoh apa pun
WP_Query
. Anda menyebutnya seperti:Pengait ini bagus dan dapat mengubah argumen kueri apa pun.
Inilah yang dapat Anda baca :
Jadi kait ini adalah manajer argumen tetapi tidak dapat membuat
WP_Query
objek baru . Jika Anda memiliki satu permintaan primer dan satu permintaan sekunder,pre_get_posts
tidak dapat membuat yang ketiga. Atau jika Anda hanya memiliki satu primer, itu tidak dapat membuat sekunder.WP_Query
mendukung loop bersarangBerikut ini contoh showcase WordPress yang memiliki fungsi pembantu bahkan untuk loop bersarang:
Outputnya akan seperti ini sejak saya menginstal data uji unit tema :
Meskipun saya meminta 5 posting di custom $ query itu akan mengembalikan saya enam, karena posting lengket akan berjalan bersama. Jika tidak ada
wp_reset_postdata
dalam contoh sebelumnya output akan seperti ini, karena$GLOBALS['post']
akan tidak valid.WP_Query
memilikiwp_reset_query
fungsiIni seperti tombol reset.
$GLOBALS['wp_the_query']
harus dibekukan sepanjang waktu, dan plugin atau tema tidak boleh mengubahnya.Inilah yang
wp_reset_query
dilakukan:Keterangan aktif
get_posts
get_posts
sepertiItu hanya pembungkus di sekitar
WP_Query
yang mengembalikan posting objek permintaan.The
ignore_sticky_posts
set untuk sarana benar tulisan lengket mungkin muncul hanya dalam posisi alami. Tidak akan ada posting yang lengket di depan. Set lainnyano_found_rows
ke true berarti API database WordPress tidak akan digunakanSQL_CALC_FOUND_ROWS
untuk mengimplementasikan pagination, mengurangi beban pada database untuk mengeksekusi baris yang ditemukan .Ini berguna saat Anda tidak membutuhkan pagination. Kami mengerti sekarang kami dapat meniru fungsi ini dengan permintaan ini:
Berikut adalah permintaan SQL yang sesuai:
Bandingkan apa yang kita miliki sekarang dengan permintaan SQL sebelumnya di mana
SQL_CALC_FOUND_ROWS
ada.Permintaan tanpa
SQL_CALC_FOUND_ROWS
akan lebih cepat.Keterangan aktif
query_posts
query_posts()
adalahWP_Query
pembungkus. Ini mengembalikan referensi keWP_Query
objek utama , dan pada saat yang sama akan mengaturglobal $wp_query
.Dalam PHP4 semuanya, termasuk objek, diteruskan oleh nilai.
query_posts
seperti ini:Harap perhatikan dalam skenario umum dengan satu kueri primer dan satu kueri sekunder, kami memiliki tiga variabel berikut:
Katakanlah masing-masing dari ketiganya membutuhkan 1M memori. Total akan menjadi 3 M memori. Jika kita gunakan
query_posts
,$GLOBALS['wp_query']
akan tidak disetel dan dibuat lagi.PHP5 + harus pintar mengosongkan
$GLOBALS['wp_query']
objek, sama seperti di PHP4 kita melakukannya denganunset($GLOBALS['wp_query']);
Akibatnya
query_posts
menghabiskan 2M memori secara total, sementaraget_posts
mengkonsumsi 3 M memori.Catatan dalam
query_posts
kita tidak mengembalikan objek yang sebenarnya, tetapi referensi ke objek.Ini salah satu contohnya
Akan menghasilkan:
Coba setel ulang kueri:
Akan menghasilkan:
Anda dapat membuat masalah meskipun Anda menggunakannya
WP_Query
Tentu saja, solusinya adalah menggunakan
wp_reset_query
fungsi lagi.Inilah sebabnya saya pikir
query_posts
mungkin lebih baik dari sudut pandang memori. Tetapi Anda harus selalu melakukanwp_reset_query
trik.sumber
Saya baru saja membuat tiket trac baru, tiket # 36874 , untuk mengusulkan penghentian
query_posts()
. Apakah itu akan diterima atau tidak tetap menjadi pertanyaan yang bagus.Masalah besar sebenarnya
query_posts()
adalah, masih banyak digunakan oleh plugin dan tema, meskipun ada tulisan yang sangat bagus tentang masalah mengapa Anda TIDAK PERNAH PERNAH menggunakannya. Saya pikir posting paling epik di sini di WPSE adalah yang berikut:deprecation! == penghapusan , jadi penghentian
query_posts()
tidak akan menghentikan penggunaannya oleh pengembang berkualitas rendah dan orang-orang pada umumnya yang tidak mengenal WordPress dan yang menggunakan tutorial berkualitas buruk sebagai pedoman. Sama seperti beberapa bukti, berapa banyak pertanyaan yang kita masih mendapatkan di sini di mana orang menggunakancaller_get_posts
diWP_Query
? Sudah usang selama bertahun-tahun sekarang.Namun, fungsi dan argumen yang sudah usang dapat dihapus kapan saja para pengembang inti mau, tetapi ini kemungkinan besar tidak akan pernah terjadi
query_posts()
karena hal ini akan menghancurkan jutaan situs. Jadi ya, kita mungkin tidak akan pernah melihat penghapusan totalquery_posts()
- yang mungkin mengarah pada fakta bahwa kemungkinan besar itu tidak akan pernah ditinggalkan.Ini adalah titik awal, tetapi kita harus ingat, mencela sesuatu di WordPress tidak menghentikan penggunaannya.
PEMBARUAN 19 Mei 2016
Tiket yang saya naikkan sekarang ditutup dan ditandai sebagai duplikat untuk tiket berusia 4 tahun , yang ditutup sebagai tidak diperbaiki dan dibuka kembali dan masih tetap terbuka dan belum terselesaikan.
Tampaknya pengembang inti bergantung pada kejahatan kecil yang setia dan lama ini. Semua orang tertarik, inilah tiket lama duplikat 4 tahun
sumber
[agak kasar]
Ini adalah filosofi inti yang berdiri pada titik ini bahwa tidak ada yang benar-benar usang. Pemberitahuan penghentian, meskipun menyenangkan untuk dimiliki, hanya akan diabaikan jika fungsinya tidak akan benar-benar hilang di beberapa titik. Ada banyak orang yang tidak berkembang bersama
WP_DEBUG
dan tidak akan melihat pemberitahuan jika tidak ada kerusakan yang sebenarnya.OTOH tangan, fungsi ini seperti
goto
pernyataan. Secara pribadi saya tidak pernah (untuk definisi yang lebih kecil dari yang diharapkan) digunakangoto
tetapi saya dapat memahami argumen yang menunjuk ke beberapa situasi di mana itu tidak jahat secara default. Sama halnyaquery_posts
, ini adalah cara sederhana untuk mengatur semua global yang diperlukan untuk membuat loop sederhana, dan dapat berguna dalam konteks ajax atau rest-api. Saya tidak akan pernah menggunakannya dalam konteks itu juga, tetapi saya bisa melihat bahwa di sana, ini lebih merupakan masalah gaya pengkodean daripada fungsi yang jahat dengan sendirinya.Sedikit lebih dalam, masalah utama adalah bahwa global perlu ditetapkan sama sekali. Itu adalah masalah utama, bukan fungsi yang membantu mengaturnya.
sumber
query_posts
lebih lambat daripada kueri sekunder (baca: bukan kueri utama).query_posts
dirinya sendiri tetapi permintaan tidak berguna yang dilakukan ketika WP sedang memuat