posts_request
фильтр
Пролистывая, WP_Query
мы находим эту часть интереса:
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;
}
Мы можем попытаться устранить основной домашний запрос через posts_request
фильтр. Вот пример:
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 );
где мы форсируем 'fields' => 'ids'
ранний выход.
posts_pre_query
Фильтр (РГ 4.6+)
Мы также могли бы использовать новый фильтр posts_pre_query
src, доступный в 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 );
Этот фильтр позволяет пропустить обычные запросы к базе данных, чтобы вместо этого внедрить пользовательское внедрение сообщений.
Я только что проверил это и заметил, что это не предотвратит липкие сообщения, в противоположность posts_request
подходу.
Проверьте билет # 36687 для получения дополнительной информации и примера там @boonebgorges.