web-dev-qa-db-fra.com

Les query_vars filtrés deviennent globaux. Pourquoi ça marche?

Pour une raison quelconque, ce n'est pas tout à fait clair, lorsque j'ajoute des query_vars personnalisés, ils sont disponibles partout sans qu'il soit nécessaire de recourir à un accesseur tel que global ou get_query_var()

// if your url contains the var http://example.com?document_id=99
// and you add it to $query_vars...
<?php
function filter__query_vars( $query_vars ) {
  $query_vars[] = 'document_id';
  return $query_vars;
}
add_filter( 'query_vars', 'filter__query_vars' );

// you can reference it anywhere.
/* single.php */
<?php
echo $document_id; // outputs 99. wtf?

Pourquoi ça marche?

4
Joel Stransky

Dans la méthode WP::parse_request() ( src ), nous localisons le filtre query_vars:

$this->public_query_vars = apply_filters( 'query_vars', $this->public_query_vars );

et dans WP::register_globals() nous pouvons voir pourquoi il devient globalement accessible ( src ):

// Extract updated query vars back into global namespace.
foreach ( (array) $wp_query->query_vars as $key => $value ) {
    $GLOBALS[ $key ] = $value;
}

où le $Wp_query global a été alimenté avec les vars de requête de l’objet global $wp.

5
birgire