Codex

Interested in functions, hooks, classes, or methods? Check out the new WordPress Code Reference!

it:Panoramica sulle query

Questo articolo è una panoramica, per gli sviluppatori, del modo usato da WordPress per costruire le pagine del tuo blog, e di come i plugin possano modificare questo processo. Esso è indirizzato agli sviluppatori di plugin che faranno query e permalink avanzati, e anche agli sviluppatori che vogliono migliorare la conoscenza di WordPress, al fine di aggiungere nuove caratteristiche al core oppure correggere bug.

Per maggiori dettagli, sarà necessario leggere i file php e le funzioni del core di WordPress menzionate.

Qui sono elencati i passaggi secondo cui WordPress decide quali post o pagine visualizzare in una pagina:

  1. Quando un visitatore clicca su una pagina o digita un URL associato alla pagina che appartiene al tuo blog, WordPress inizia col caricare alcuni file del core (wp-config.php, wp-settings.php, ecc. ) Se sei interessato all'ordine di caricamento dei file, parti da index.php e segui la catena di file richiamati tramite le istruzioni include/require(o leggi questo eccellente post at humanshell.net)
  2. WordPress carica e inizializza ogni plugin che hai attivato (chiama l'azione init del plugin)
  3. WordPress carica il "text domain" per l'internazionalizzazione, e il file functions.php dal tema attualmente attivo
  4. WordPress esegue la funzione wp() (in wp-includes/functions.php), che chiama $wp->main() ($wp è un oggetto della classe WP, che è definita in wp-includes/class-wp.php). Questa dice a WordPress di:
    1. Convertire l'URL in una specifica query usando WP->parse_request() -- approfondita in basso.
    2. Impostare tutte le variabili is_ che usate dai Conditional Tags tramite $wp_query->parse_query() ($wp_query è un oggetto della classe WP_Query, definita in wp-includes/query.php). Notare che a dispetto del nome della funzione, in questo caso WP_Query->parse_query al momento non esegue alcuna conversione, dato che è fatta prima da WP->parse_request()
    3. Convertire la specifica query in una query per il database MySQL, e di eseguire questa query per ottenere la lista dei post, nella funzione WP_Query->get_posts(). Salva i post nell'oggetto $wp_query da usare nel Loop di WordPress.
    4. Gestire gli errori 404
    5. Inviare i campi headers HTTP del blog
    6. Impostare alcune variabili per il Loop di WordPress
  5. WordPress carica il tuo template, capisce quale file del template usare in accordo alla Template Hierarchy, ed esegue quel file (essenzialmente facendo tutto ciò che dice il tuo template). Oppure, WordPress potrebbe richiamare uno dei file feed (come wp-rss2.php).
  6. Generalmente, il template o il file feed esegue il WordPress Loop per visualizzare i post del blog o una pagina statica.
  7. Il template o file feed probabilmente stamperà anche i permalink in alcuni archivi, categorie, o post usando funzioni built-in di WordPress.

Dettagli su WP->parse_request()

Come menzionato sopra, WP->parse_request() (appartenente alla classe WP in wp-includes/class-wp.php) convente un URL in una specifica query. Qui c'è un riassunto dei passaggi usati per far questo:

  1. Rimuove la sezione della variabile GET dell'URL (ossia tutto ciò che si trova dopo un "?" nell'URL). Inoltre rimuove l'URL dell'home del blog.
  2. Ottiene le regole di rewrite attualmente attive, chiamando $wp_rewrite->wp_rewrite_rules() ($wp_rewrite è un oggetto della classe WP_Rewrite, definita in wp-includes/rewrite.php). Le regole di rewrite sono essenzialmente un insieme di regole di abbinamento pattern per i permalink di WordPress, con una specifica su cosa fare se il pattern fosse abbinato. Per esempio, di default c'è una regola che abbinerebbe un permalink spoglio come category/abc, e la sua specifica dice che è stata richiesta la categoria "abc". C'è anche una regola di rewrite per la home page (niente dopo l'URL del blog).
  3. Cerca tra le regole di rewrite in ordine, finchè trova una corrispondenza tra regola e permalink. Se non trova niente, si verifica un errore 404. In caso contrario, WordPress estrae le informazioni a seconda delle specifiche della regola.
  4. Ottiene la lista delle variabili della query attiva al momento. Per ogni variabile della query, WordPress verifica se è stata impostata dalla conversione del permalink, dalla richiesta POST o dalla richiesta GET, e se così fosse, WordPress salva il valore della variabile nel vettore delle specifiche della query ($wp->query_vars, appartenente alla classe WP nel file wp-includes/class-wp.php)

Cosa possono modificare i plugin

Questa è una panoramica di ciò che può fare un plugin per modificare il comportamento di default di permalink e query descritti sopra. Molte di queste modifiche sono descritte (con esempi) nell'articolo Custom Queries.

  • Aggiungere, modificare o rimuovere regole di rewrite, riguardo al modo in cui vengono convertiti i permalink. Questo generalmente non è compiuto tramite azioni e filtri, ma chiamando le funzioni in wp-includes/rewrite.php, come addd_rewrite_rule

, addd_rewrite_endpoint, etc. Questo può essere un po' complicato, poiché WP_Rewrite->wp_rewrite_rules() di solito estrae solo l'insieme di regole di rewrite precedentemente salvato (esse sono salvate nel database di WordPress nell'opzione "rewrite_rules"). Quindi se vuoi modificare le regole di rewrite, hai bisogno di chiamare la funzione $wp_rewrite->flush_rules() per forzare il ricalcolo. E' necessario far questo nelle azioni activation/deactivation/uninstall del tuo plugin, in modo tale che avvenga con buon anticipo nel processo. E' estremamente importante che ciò non avvenga ad ogni richiesta. Fare questo solo durante l'attivazione del plugin o qualcosa di simile.

  • Aggiungere o rimuovere variabili della query, riguardo a quali variabili sono salvate nelle specifiche della query dalle richieste POST, GET e dei permalink (filtro query_vars).
  • Modificare le specifiche della query, dopo il salvataggio dei valori delle variabili (filtro request o l'azione parse_request; se vuoi usare i test dei tag condizionali, usa l'azione parse_query o pre_get_posts, poichè questi vengono eseguiti dopo aver impostato le variabili is_).
  • Modificare la query del database MySQL, dopo averla creata dalle specifiche della query usando i seguenti filtri:
    • posts_where
    • posts_join
    • posts_groupby
    • posts_orderby
    • posts_distinct
    • posts_fields
    • posts_limits
    • posts_where_paged
    • posts_join_paged
    • posts_request
  • Modificare i risultati della query del database (filtro the_posts)
  • Sostituire il file del template scelto di default (azione template_redirect)

Correlati

Articoli

Documentazione del codice

  • Classe: WP_Query - Panoramica dettagliata della classe WP_Query
  • Oggetto: $wpdb - Panoramica sull'uso dell'oggetto $wpdb
  • Funzione: get_query_var()
  • Funzione: query_posts() - Creare query personalizzate aggiuntive
  • Funzione: get_post() - Prende l'ID di un post e restituisce i record del database relativo a tale post
  • Funzione: get_posts() - Una funzione particolare che restituisce un vettore di elementi
  • Funzione: get_pages() - Una funzione particolare che restituisce un vettore di pagine
  • Funzione: have posts() - una condizione che determina se la query restituisce un articolo
  • Funzione: the_post() - Usata per configurare automaticamente il Loop dopo una query
  • Funzione: rewind posts() - Pulisce il loop corrente
  • Funzione: setup_postdata() - Configura i dati per un singolo risultato di una query all'interno di un loop
  • Funzione: wp_reset_postdata() - Ripristina la query precedente (di solito dopo un loop all'interno di un altro loop)
  • Funzione: wp_reset_query()
  • Function: is_main_query() - Assicura che la query che è stata cambiata sia solo la query principale
  • Hook per azione: pre_get_posts - Modifica le query di WordPress prima che siano eseguite
  • Hook per azione: the_post - Modifica l'oggetto post dopo la query
  • Hook per filtro: found_posts - Cambia il valore dell'oggetto found_posts WP_Query