Al momento non è possibile.
Quando 'pre_get_posts'
viene eseguito, è troppo tardi per interrompere WP_Query
l'esecuzione di una query.
Lo stesso WordPress, quando si tenta di interrogare una tassonomia che non esiste, si aggiunge AND (0 = 1)
alla WHERE
clausola della query SQL, per assicurarsi che non restituisca risultati molto rapidamente ...
C'è un biglietto di trac con una patch che probabilmente terre nel core con WP 4.6, che introduce un nuovo filtro: 'posts_pre_query'
. La restituzione di un array su quel filtro WP_Query
interromperà l'elaborazione e utilizzerà l'array fornito come array di post.
Questo potrebbe in qualche modo aiutarti a implementare ciò che stai cercando di fare.
In attesa di ciò, tutto ciò che potresti fare è in qualche modo hacker , il trucco stesso stesso è anche abbastanza hacker.
Di recente, sto iniziando a usare un trucco quando voglio fermare WordPress per fare cose che non riesco a fermare in modo pulito: lancio un'eccezione e la prendo per continuare il flusso dell'applicazione.
Ti faccio un esempio. Nota tutto il codice qui è completamente non testato.
Prima di tutto, scriviamo un'eccezione personalizzata:
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;
}
}
L'eccezione è progettata per agire come una sorta di DTO per trasportare un oggetto query, in modo che in un catch
blocco sia possibile ottenerlo e utilizzarlo.
Meglio spiegato con il codice:
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());
}
}
});
Questo dovrebbe funzionare più o meno, tuttavia, ci sono molti hook che non si "the_posts"
desidera attivare , ad esempio e molto altro ... se si dispone di codice che utilizza uno di questi hook per attivarsi, si romperà.
È possibile utilizzare la cached_query_set
funzione per attivare alcuni degli hook che potrebbero essere richiesti dal proprio tema / plugin.