Saya memiliki beranda yang menampilkan home.php
templat, berisi 2 sidebars dengan widget di dalamnya.
Kueri utama masih menarik di posting 10 standar, tapi karena saya tidak menampilkan ini, saya ingin menghilangkan permintaan yang dibuat ke database sepenuhnya. Jika perlu, loop posting kosong akan dilakukan karena saya tidak menggunakan loop utama dalam home.php
template saya .
Bagaimana saya melakukan ini? Saya bisa menggunakan pre_get_posts
untuk meminimalkan dan mengurangi kueri, tapi itu masih membuat saya dengan kueri yang sangat cepat, bagaimana cara menghilangkannya sama sekali?
Jawaban:
The
posts_request
filterMemilah-milah bagian yang menurut
WP_Query
kami menarik:Kami mungkin mencoba menghilangkan permintaan rumah utama melalui
posts_request
filter. Ini sebuah contoh:tempat kami memaksa
'fields' => 'ids'
untuk keluar lebih awal.The
posts_pre_query
Filter (WP 4.6+)Kita juga bisa menggunakan
posts_pre_query
src filter baru yang tersedia di WordPress 4.6+Filter ini memungkinkan untuk melompati kueri basis data yang biasa untuk mengimplementasikan injeksi posting khusus sebagai gantinya.
Saya baru saja menguji ini dan memperhatikan bahwa ini tidak akan mencegah posting yang lengket, berlawanan dengan
posts_request
pendekatan.Lihatlah tiket # 36687 untuk info lebih lanjut dan contoh di sana oleh @boonebgorges.
sumber
WP_Query
lebih awal, misalnya melalui argumen seperti'skip_query' => true
atau bahkan melalui filter, tapi kemudian saya menyadari betapa mudahnya itu dapat mengacaukan situs-situs di internet, jadi banyak cara ;-) @ TomJNowellsplit_the_query
tepat di bawah garis, melakukan hal yang persis sama tetapi saya ingin tahu itu tidak mengurangi jumlah permintaan!'fields' => 'ids'
, dan saya sering menggunakannya ;-)Berikut adalah trik rapi yang saya pelajari dari @birgire, kita dapat menghentikan permintaan utama dengan menambahkan
AND where 0=1
keWHERE
klausa dari permintaan SQL. Ini mungkin masih menghasilkan satu permintaan db, tetapi pasti akan menghentikan permintaan utama dari posting permintaanAnda juga dapat mencoba mengganti
WHERE
klausa denganwhere 0 = 1
dari pada
Sayangnya, saya tidak punya waktu untuk menguji apa pun, tetapi ini harus menjadi titik awal yang bagus
sumber
$q->set( 'ignore_sticky_posts', true );
berjaga-jaga.Untuk referensi, sebelum: 45q, setelah: 42q
Kode ini sangat mirip dengan kode yang digunakan oleh @birgire
sumber