Saya mencoba menggunakan WP Redis untuk me- cache seluruh objek $ wp_query dengan kuncinya adalah $ query_vars_hash .
Ini adalah bagaimana $wp_query
ditambahkan ke $wp_object_cache
:
add_action('wp', function($wp)
{
if ( is_admin() ) return;
global $wp_query;
if ( !wp_cache_get($wp_query->query_vars_hash, 'globals') )
{
wp_cache_add($wp_query->query_vars_hash, $wp_query, 'globals');
}
});
Lalu, saya perlu memeriksa apakah kueri telah di-cache sebelum WP_Query
dapat mengambil posting:
add_action('pre_get_posts', function($query)
{
if ( is_admin() ) return;
$cached_query = wp_cache_get($query->query_vars_hash, 'globals');
if ($cached_query)
{
$GLOBALS['wp_query'] = &$cached_query;
return; // Return immediately to prevent retrieving posts again.
}
});
Masalah :
return
atau exit
tidak berfungsi dalam kasus ini. Kemudian, WP_Query
masih akan mencapai database untuk mengambil posting lagi
Pertanyaan :
Terlepas dari plugin, apakah mungkin untuk sepenuhnya berhenti WP_Query
mengambil posting?
return
mungkin satu-satunya perintah yang bisa kita panggil dalam kasus ini.Jawaban:
Saat ini, itu tidak mungkin.
Saat
'pre_get_posts'
berjalan, sudah terlambat untuk berhentiWP_Query
melakukan kueri.WordPress sendiri, ketika Anda mencoba untuk query taksonomi yang tidak ada, menambahkan
AND (0 = 1)
keWHERE
klausul dari query SQL, untuk memastikan tidak mengembalikan hasil yang sangat cepat ...Ada tiket trac dengan patch yang mungkin akan mendarat di inti dengan WP 4.6, yang memperkenalkan filter baru:
'posts_pre_query'
. Mengembalikan array pada filter itu akan membuatWP_Query
berhenti memproses dan menggunakan array yang disediakan sebagai array postingnya.Ini bisa membantu Anda dalam mengimplementasikan apa yang Anda coba lakukan.
Menunggu ini, apa pun yang bisa Anda lakukan adalah entah bagaimana meretas , inti trik itu sendiri menggunakan juga cukup meretas.
Baru-baru ini, saya mulai menggunakan trik ketika saya ingin menghentikan WordPress untuk melakukan hal-hal yang saya tidak bisa berhenti dengan cara yang bersih: Saya melemparkan pengecualian dan menangkapnya untuk melanjutkan aliran aplikasi.
Saya akan tunjukkan contoh. Perhatikan bahwa semua kode di sini benar-benar belum teruji.
Pertama-tama, mari kita tulis pengecualian khusus:
Pengecualian dirancang untuk bertindak sebagai semacam DTO untuk mengangkut objek kueri, sehingga dalam
catch
blok Anda bisa mendapatkan dan menggunakannya.Lebih baik dijelaskan dengan kode:
Ini seharusnya lebih atau kurang berfungsi, namun, ada banyak kait yang tidak akan Anda aktifkan, misalnya
"the_posts"
dan banyak lagi ... jika Anda memiliki kode yang menggunakan salah satu kait untuk memicu, itu akan rusak.Anda dapat menggunakan
cached_query_set
fungsi ini untuk mengaktifkan beberapa kait yang mungkin diperlukan tema / plugin Anda.sumber
do_action
harus ditry
blok.Ini adalah pertanyaan PHP lebih dari pertanyaan WordPress.
Seperti yang dikomentari @Mark :
Itu benar. Menempatkan
return
fungsi berarti keluar dari fungsi dan menempatkan kembali dalam file PHP berarti keluar dari file. Jangan bingung dengan konstruk PHPexit()
: P (Anda mungkin menemukan jawaban yang lebih baik tentang SO tentang PHPreturn
).Dan untuk menjawab pertanyaan Anda
Anda dapat mengurangi beban kueri dengan mengambil satu kolom, bukan tabel lengkap. Seperti @birgire lakukan di sini Hapus Permintaan Beranda
Mungkin jawaban yang lebih baik belum datang. Saya baru saja membagikan apa yang saya tahu :)
sumber
posts_request
filter? Dengan itu + pendekatan satu kolom kita keluarWP_Query
lebih awal daripada menggunakanposts_pre_query
filter .. Juga hati-hati untuk posting lengket denganposts_pre_query
tetapi kita dapat menghapusnya dengan$q->set( 'ignore_sticky_posts', 1 );
misalnya dalam contoh di sini .posts_pre_query
tidak membantu. Solusi Anda adalah yang terbaik sejauh ini. :) Jika Anda tahu bagaimana kami dapat keluar dari kueri segerapre_get_posts
, itu bisa jadi hebat. Terima kasih!posts_pre_query
akan tersedia mulai 4,6;)WP_Query
kelas denganget_posts()
metode kustom , dengan kemungkinan awal yang ada dan yang memanggilparent::get_posts()
dan mencoba untuk menimpa kueri yang relevan dengannya. Tapi saya tidak tahu apakah itu akan berhasil atau masuk akal dengan kasus Anda di sini ;-)Ini akan dimungkinkan di 4.6 (dengan asumsi tidak ada perubahan sampai rilis) dengan
posts_pre_query
filter baru https://core.trac.wordpress.org/ticket/36687sumber
Yap itu mungkin tergantung pada apa yang ingin Anda cache. Saya telah melakukan hal yang sama untuk men-cache loop utama di beranda kami Pada dasarnya Anda dapat menggunakan
posts_request
danposts_results
untuk membajak kueri dan menekan cache, alih-alih juga digunakanfound_posts
untuk memperbaiki pagination.Contoh yang sangat kasar diambil dari kode kami (belum diuji) tetapi Anda harus membantu Anda mendapatkan ide:
Lebih lanjut di sini: https://www.reddit.com/r/Wordpress/comments/19crcn/best_practice_for_hijacking_main_loop_and_caching/
sumber