The posts_request
filter
Memilah-milah bagian yang menurut WP_Query
kami 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_request
filter. 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_query
Filter (WP 4.6+)
Kita juga bisa menggunakan posts_pre_query
src 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_request
pendekatan.
Lihatlah tiket # 36687 untuk info lebih lanjut dan contoh di sana oleh @boonebgorges.