web-dev-qa-db-ja.com

フィルタリングされたquery_varsはグローバルになります。なぜこれが機能するのですか?

私がカスタムのquery_varsを追加すると、globalget_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?

なぜこれが機能するのですか?

4
Joel Stransky

WP::parse_request()メソッド( src )内で、query_varsフィルターを見つけます。

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

そしてWP::register_globals()の中に なぜ があるのか​​分かるでしょう(それはグローバルにアクセス可能になります( src ):

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

グローバル$Wp_queryには、グローバル$wpオブジェクトからのクエリ変数が供給されています。

5
birgire