web-dev-qa-db-ja.com

is_front_page()の故障?

私は驚いたかなり基本的な問題を抱えています。WPにはネイティブソリューションがありません(見逃していない限り、うまくいけば)。

私はWPサイトで、static pageをリーディング設定のフロントページに設定しました。プラグインコードで、WPがフロントページを表示しているかどうかを判断し、そうであれば$classes配列にクラスを追加します。私はそれを達成するために次のコードを使っています

add_filter('body_class', function($classes){
    if(is_front_page() || is_home()){
        $classes[] = 'home-page';
    }
    return $classes;
});  

将来、フロントページの設定が静的ページからブログレイアウトに変更された場合に備えて、is_front_page()is_home()の両方を使用しています。

私が遭遇する問題は、このコードがhome-pageページでさえもwp-signup.phpクラスをbodyに追加することです。

コードを調べると、is_front_page()WP_Query::is_front_page()を呼び出していることがわかります。これは基本的にWP_Query::is_page(get_option('page_on_front'))の結果を返します。そのため、問題の根本は、wp-signup.phpが、get_option('page_on_front') settings> reading の先頭ページとして設定された静的ページのIDを返す)によって返されるページ(id)になることです。

WP_Query::is_page()は内部的にWP_Query::get_queried_object()を使用して、現在のページがメソッドの引数に含まれるページかどうかを判断します。 wp-signup.phpの場合、現在の照会オブジェクトを設定するコードは次のとおりです。

/*...other code... */
elseif ( $this->is_singular && ! empty( $this->post ) ) {
    $this->queried_object = $this->post;
    $this->queried_object_id = (int) $this->post->ID;
}
/*...other code... */  

これは、何らかの理由でwordpressがwp-signup.phpを表示するためにフロントページを照会し、次の質問をすることを示しています。

  • is_front_page()が間違った結果を返すのはなぜですか?
  • わざわざwp-signup.phpをWordpressの管理者設定を使ってホームページに設定することはできません。PHP_SELFREQUEST_URIをチェックするだけではWordpressのコードが無効にならない理由
  • 現時点でWP_Queryの現在のホームページが$this->postにあるのはなぜですか?

プラグインの問題 をプラグイン(およびmu-plugins)ディレクトリを削除することで除外しました。まだwp-signup.phpを他のページには適さないフロントページとして認めています。

この問題に関しての手助けは大歓迎です。

アップデート
私はWP verison 4.2.4を使用していますが、これはマルチサイト設定です。

ありがとう。

8
Ejaz

単なる推測ですが、無名関数の問題に遭遇しているのではないでしょうか。匿名関数はWPで許可されており、通常は正常に動作します(更新されたPHPを想定)が、周りを検索すると、疑わしいバグまたは少なくとも予期しない動作のレポートが見つかります。

その点、WordPress Codexで匿名関数が例として使用されているのを見たことがあるかどうかはわかりません。また、テーマやプラグインのコードで以前に実行されたことがあることを思い出せません。もちろん、私はanon関数に目を向けていませんでしたが、それでも、上記の関数はほとんどいつもよりよく知られている2部形式のいくつかのバージョンで書かれると思います。

add_filter('body_class', 'ejay_add_home_class');

function ejay_add_home_class($classes) {

    if (is_front_page() || is_home()) {

        $classes[] = 'home-page';
    }

    return $classes;
} 

したがって、実験として、上記の「従来の」形式を試してみて、10より高いまたは低い指定優先順位で試してみます。複数の無名関数を同じフィルターに付加する場合は、優先順位を変えます。または配列を使用するか(例: http://snippets.khromov.se/adding-multiple-actions-and-filters-using-anonymous-functions-in-wordpress/ )、またはそれらを1つずつ書く二部構成者としても。

実のところ、少し長い2部構成の方が、とにかく読みやすく、追跡し、調整しやすいと思います。

1
CK MacLeod