Bộ posts_request
lọc
Lướt qua WP_Query
chúng tôi thấy phần quan tâm này:
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;
}
Chúng tôi có thể cố gắng loại bỏ yêu cầu nhà chính thông qua posts_request
bộ lọc. Đây là một ví dụ:
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 );
nơi chúng tôi buộc phải 'fields' => 'ids'
thoát ra sớm.
Bộ posts_pre_query
lọc (WP 4.6+)
Chúng tôi cũng có thể sử dụng bộ lọc posts_pre_query
src mới có sẵn trong 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 );
Bộ lọc này làm cho nó có thể bỏ qua các truy vấn cơ sở dữ liệu thông thường để thực hiện tiêm bài tùy chỉnh thay thế.
Tôi chỉ thử nghiệm điều này và nhận thấy rằng điều này sẽ không ngăn chặn các bài viết dính, ngược lại với posts_request
cách tiếp cận.
Kiểm tra vé # 36687 để biết thêm thông tin và ví dụ ở đó bởi @boonebgorges.