Saat ini, itu tidak mungkin.
Saat 'pre_get_posts'
berjalan, sudah terlambat untuk berhenti WP_Query
melakukan kueri.
WordPress sendiri, ketika Anda mencoba untuk query taksonomi yang tidak ada, menambahkan AND (0 = 1)
ke WHERE
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 membuat WP_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:
class My_StopWpQueryException extends Exception {
private $query;
public static forQuery(WP_Query $query) {
$instance = new static();
$instance->query = $query;
return $instance;
}
public function wpQuery() {
return $this->query;
}
}
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:
function maybe_cached_query(WP_Query $query) {
$cached_query = wp_cache_get($query->query_vars_hash, 'globals');
if ($cached_query instanceof WP_Query)
throw My_StopWpQueryException::forQuery($cached_query);
}
function cached_query_set(WP_Query $query) {
$GLOBALS['wp_query'] = $query;
$GLOBALS['wp_the_query'] = $query;
// maybe some more fine-tuning here...
}
add_action('pre_get_posts', function(WP_Query $query) {
if ($query->is_main_query() && ! is_admin()) {
try {
maybe_cached_query($query);
} catch(My_StopWpQueryException $e) {
cached_query_set($e->wpQuery());
}
}
});
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.