web-dev-qa-db-ja.com

グローバル$ postや他のグローバル変数を使う時は?

グローバルな$ post変数をいつ、なぜ使うべきかを理解しようとしています。私は、ループの外で、投稿ページで次のことをやろうとしました、そして予想通りそれは働きます。

    <?php 
        global $post;
        echo $post->ID;
    ?>

以前の投稿ページから上記のコードを削除したとしても、アーカイブページで同じことをした場合(どうなったのかを確認したいだけです)、何らかの理由で前の投稿のIDを取得することもできます。これはある種のキャッシュのようなものですか?これはどのように正確に機能しますか?

Functions.phpの機能に取り組んでいる場合、グローバル$ postが役に立つことを理解しています。これは唯一のユースケースですか?

どうもありがとう

5
alemur

これはおそらく広すぎる質問なので、うまく答えることはできません。 $postグローバルは、あらゆる種類の方法で使用できますshouldを使用すべきかどうかは、それぞれの状況に依存します。

ただし、私が理解しているように、$post globalの主な目的は、テーマテンプレートファイルでの使用です。

the_title()またはthe_content()またはthe_author()または非常に多くのテンプレート関数のいずれかを使用すると、WordPressは$postグローバルでこの情報を探します。一般的なルールとして、テンプレートファイルで作業するときは、$post->IDに直接アクセスする代わりに、get_the_ID()などのこれらのテンプレート関数を常に使用する必要があります。

したがって、$postグローバルをよりよく理解したい場合は、WordPress、特にテンプレートファイル内で The Loop がどのように機能するかを読んでください。ループがthe_post()を実行すると、現在のアイテムでグローバルが設定されます。

テンプレートファイルでは、通常、自動的に実行されるクエリのループを反復処理します。たとえば、単一のページにアクセスすると、WordPressはそのページのクエリを実行し、page.phpテンプレートをロードすることを認識します。

メインループの外側、たとえばfunctions.phpなどの追加の投稿を取得する場合は、独自の WP_Query を実行し、ループを開始してからテンプレート関数を使用します。既存の関数を介して必要な情報にアクセスできない場合にのみ、$postグローバルに直接アクセスします。

独自のWP_Queryのループが完了したら、$postグローバルがカスタムクエリにスタックしていることがわかります。そのため、たとえば、単一ページテンプレートでは、カスタムループの後、$postに現在のページが設定されていない可能性があります。 wp_reset_query を使用すると、$postグローバルを以前の状態に復元できます。これは絶対に重要です、そうでなければ元の$postグローバルを期待する他のプラグインやテーマを壊すことができます。

8
NateWr

この質問が他のいくつかの問題に取り組むとき、私はこれに関していくつかの情報を欠いていたかもしれない投稿を1〜2回行いました。私はまたあなたが ここ をチェックできる質問を@ G.Mからのすばらしい答えと共に尋ねました。

基本的に、$postグローバルは$wp_query->the_post()によって設定され、ループ内だけでなくテンプレート全体を通してアクセス可能です。これがグローバルと呼ばれる理由です。

これは 現在のソースです

3681        public function the_post() {
3682                global $post;
3683                $this->in_the_loop = true;
3684
3685                if ( $this->current_post == -1 ) // loop has just started
3686                        /**
3687                         * Fires once the loop is started.
3688                         *
3689                         * @since 2.0.0
3690                         *
3691                         * @param WP_Query &$this The WP_Query instance (passed by reference).
3692                         */
3693                        do_action_ref_array( 'loop_start', array( &$this ) );
3694
3695                $post = $this->next_post();
3696                setup_postdata($post);
3697        }
3698

これから、アーカイブページの最後の投稿を$postとして取得する理由についての質問への回答も得られます(それに関しては任意のページ)。 $postは常に$wp_query->next_post()を介して返される$posts配列の最後の投稿に効果的に設定されます

あなたはこのグローバルな outside ループをカスタムクエリとして使うことに非常に慎重にならなければならず、いくつかの関数はそれにアクセスしてリンクされた記事で説明されるようにその値を変えることができます。これが、ポストデータをWP_Queryの新しいインスタンスから常にリセットする必要がある理由の1つです。 query_postsもメインのクエリを壊すのでこのグローバルを壊します、なぜならquery_postsは絶対に避けなければならない理由の一つです

これは現在のテンプレートの外側にあるので、基本的には関数内でグローバル$postを定義する必要があるだけですが、望むならループの外側にグローバルを定義することができます。

結論として、$postグローバルは関数によって非常に簡単に修正されることができる最も信頼できないグローバルの1つであるので、私は@ G.Mによる勧告を使うことを提案するでしょう。リンク先の質問

4
Pieter Goosen