The posts_requestfilter
Memilah-milah bagian yang menurut WP_Querykami menarik:
if ( !$q['suppress_filters'] ) {
/**
* Filter the completed SQL query before sending.
*
* @since 2.0.0
*
* @param array $request The complete SQL query.
* @param WP_Query &$this The WP_Query instance (passed by reference).
*/
$this->request = apply_filters_ref_array( 'posts_request',
array( $this->request, &$this ) );
}
if ( 'ids' == $q['fields'] ) {
$this->posts = $wpdb->get_col( $this->request );
$this->posts = array_map( 'intval', $this->posts );
$this->post_count = count( $this->posts );
$this->set_found_posts( $q, $limits );
return $this->posts;
}
Kami mungkin mencoba menghilangkan permintaan rumah utama melalui posts_requestfilter. Ini sebuah contoh:
add_filter( 'posts_request', function( $request, \WP_Query $q )
{
// Target main home query
if ( $q->is_home() && $q->is_main_query() )
{
// Our early exit
$q->set( 'fields', 'ids' );
// No request
$request = '';
}
return $request;
}, PHP_INT_MAX, 2 );
tempat kami memaksa 'fields' => 'ids'untuk keluar lebih awal.
The posts_pre_queryFilter (WP 4.6+)
Kita juga bisa menggunakan posts_pre_querysrc filter baru yang tersedia di WordPress 4.6+
add_filter( 'posts_pre_query', function( $posts, \WP_Query $q )
{
if( $q->is_home() && $q->is_main_query() )
{
$posts = [];
$q->found_posts = 0;
}
return $posts;
}, 10, 2 );
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_requestpendekatan.
Lihatlah tiket # 36687 untuk info lebih lanjut dan contoh di sana oleh @boonebgorges.