ポストグローバルを信頼する必要がありますか?


21

@toschoはこの答えにコメントを残しました。グローバルスコープ、特にポストグローバルについてはどの程度信頼する必要があり$postますか?

だから何?グローバル変数は、チェックを実行する前に全員から上書きできます。それがグローバル変数のポイントです:グローバルアクセス。

$postたとえば、テーマ自体またはプラグインによって大部分が変更されるグローバルの1つです。それでも、たとえば関連する投稿を設定するために、特定のテンプレート内の他のアプリケーションで最も一般的に使用されるグローバルです。

カスタムクエリの使用に起因する特定の問題のいくつかの投稿への回答(およびコメント)から、ほとんどの問題はカスタムクエリがリセットされていないことが原因であることが際立っています(カスタムクエリはメインクエリによって設定されたグローバルを変更します)。

これから、$post信頼できないことが明らかです。カスタムクエリを使用するコードの不完全な記述は、$postグローバルを変更する可能性があり、その結果、何か(関連する投稿など)が破損します。

実際にはコアの内部動作について十分な知識があり、避けるべきものとそうでないものを知っているWordPress開発者はほんの一握りです。ユーザーの人口が多いため、WordPressコアがどのように動作するかはわかりません。

テーマをダウンロードしてプラグインをインストールするだけで、必要なことを実行したり、チュートリアルからコードをコピーしたりできます。彼らは、単一の投稿で関連する投稿を中断する、よく書かれていないプラグインをインストールするとします。どうして、それが原因で何がわかるのでしょうか?彼らはそれを自分で整理することができますか、それとも彼らはこの問題についてテーマ作者にメールを書いたり、このサイトに質問を投稿したりする100人目になるでしょうか?

私の質問:グローバルのようなもの$postがそれほど信頼できないときに、他のインポートされたコードによって引き起こされるそのような問題からどのように保護できますか?$postまったく同じようなグローバルを使用する必要がありますか?代替手段は何ですか?

結論を出す前にここで私の心を共有するために:を使用wp_reset_postdata()するwp_reset_query()前または使用する前に(および一部のテーマとプラグインでも見た)$post、グローバルがメインクエリにリセットされることを確認しました$post。しかし、他の誰かが自分のプラグインを適切にコーディングしなかったので、なぜ私のテーマでコードを膨らませなければならないのですか?また、誰かがカスタムクエリを適切にリセットした場合、この操作は不要な2回目に実行されますが、これは良くありません。

私が考えた2番目の方法は、$wp_queryなどを使用してからそのメソッドを使用することです$wp_query->post

これに関するご意見をいただければ幸いです。


投稿をリセットすると、varが別のvarにコピーされるだけで、コード内でそれを何百回も呼び出すことができ、パフォーマンスが低下することはありません。
ミロ14年

回答:


16

あなたがいることを確認することはできません:悲しい真実があり、一部のコードが中断されませんあなたのコードを、そして存在しない、何もあなたがそれを防ぐために行うことができますが。特にWordPressでは、すべてがグローバルです。

そうは言っても、グローバル$postは最もよく使用されるグローバル変数の1つであるため、特別な注意払うことをお勧めします。

私のコードでは、グローバルに直接アクセスすることはほとんどありません$post

ときに特異コンテスト、私が使用しget_queried_object()ているかどうかを確認通常と$post有効であるWP_Post場合:

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

$post直接アクセスするまれなケースでもこのチェックを行います。

get_queried_object()一部のコードがを使用している場合は予期しない値を返しますが、query_posts誰かが依存するコードを使用してquery_postsいる場合は、サイトが壊れた場合に値を返します:)

さらに、特定の投稿タイプや特定のステータスなど、いくつかの条件が予想される場合はチェックします。

さらに多くの場所でより多くのチェックが必要な場合は、それらを実行する関数を作成します。

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

ループ中にカスタムクエリ内で呼び出すとthe_post()、postオブジェクトがリセットされるため、問題ありません。それwp_reset_postdata()から、カスタムクエリの後に呼び出すのは私の責任であり、もちろんそれを行います:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.