На данный момент это невозможно.
Когда 'pre_get_posts'
запускается, уже слишком поздно останавливаться WP_Query
для выполнения запроса.
Сам WordPress, когда вы пытаетесь запросить таксономию, которая не существует, добавляет AND (0 = 1)
к WHERE
предложению SQL-запроса, чтобы убедиться, что он очень быстро не возвращает результатов ...
Там есть билет ПРОФ с патчем , который, вероятно , приземляется в ядре с WP 4.6, который вводит новый фильтр 'posts_pre_query'
. Возвращение массива в этом фильтре приведет к WP_Query
остановке обработки и использованию предоставленного массива в качестве массива сообщений.
Это может как-то помочь вам в реализации того, что вы пытаетесь сделать.
Ожидание фота это все, что вы могли бы сделать , это как - то хак , то трюк ядро сам по себе использует довольно хак , а также.
Недавно я начал использовать трюк, когда я хочу остановить WordPress, чтобы делать вещи, которые я не могу остановить чистым способом: я выбрасываю исключение и ловлю его, чтобы продолжить выполнение приложения.
Я покажу вам пример. Обратите внимание, что весь код здесь полностью не проверен.
Прежде всего, давайте напишем пользовательское исключение:
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;
}
}
Исключение предназначено для работы в качестве своего рода DTO для транспортировки объекта запроса, так что в catch
блоке вы можете получить и использовать его.
Лучше объяснить с помощью кода:
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());
}
}
});
Это должно более или менее работать, однако, есть много хуков, которые вы не собираетесь использовать, например, "the_posts"
и многое другое ... если у вас есть код, который использует один из этих хуков для запуска, он сломается.
Вы можете использовать эту cached_query_set
функцию для запуска некоторых хуков, которые могут потребоваться вашей теме / плагинам.