is_front_page()の誤動作?


8

私はかなり基本的な問題を抱えていますが、WPにはネイティブソリューションがないことに驚いています(何かを見落としているのでない限り)。

static page読書設定でフロントページを設定したWPサイトを持っています。プラグインコードで、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-pagebodyもクラスを追加することwp-signup.phpです。

コードを調べると、そのis_front_page()呼び出しが明らかになり、WP_Query::is_front_page()本質的にはの結果が返されますWP_Query::is_page(get_option('page_on_front'))。問題の根本は、なるようにwp-signup.phpページ(ID)としての資格によって返さget_option('page_on_front')返す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... */  

これは、何らかの理由でワードプレスがフロントページにクエリを実行し、wp-signup.php次の質問を表示して提起することを示しています。

  • is_front_page()間違った結果が返されるのはなぜですか?
  • 私の知る限りは、wp-signup.phpWordPressのコードだけで確認することで救済されていない理由を、次に設定Wordpressの管理者を使用して、ホームページとして設定することはできませんPHP_SELFREQUEST_URI
  • $this->postこの時点でWP_Queryに現在のホームページがあるのはなぜですか?

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

この問題に関するヘルプは大歓迎です。

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

ありがとう。


間違いなく最新バージョンのWordPressを使用していますか?そして、これはマルチサイト設定ですか?
TheDeadMedic 2015

私はバージョン4.2.4を使用していますが、はい、マルチサイトセットアップです。質問に追加しました。
Ejaz

これは…奇妙です。私は今のところお勧めできるのは、以下の使用しているif状態を:( ! isset( $GLOBALS['pagenow'] ) || $GLOBALS['pagenow'] !== 'wp-signup.php' ) && ( is_front_page() || is_home() )
TheDeadMedic

@TheDeadMedicの提案に感謝します。では、問題はWPバグですか?
Ejaz

私は実際にこれがWPMUで起こったことを聞いたことがあります。テーマを非アクティブにして、再度アクティブにしてみてください。
Matt van Andel

回答:


1

憶測だけですが、匿名関数の問題が発生しているのではないでしょうか。匿名関数は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/)、または名前付きの2つとしてそれぞれを記述します別れも。

実は、少し長い2パートの方が、とにかく読みやすく、追跡し、調整しやすいと思います。


-4

WordPressはサイトのページに異なるテンプレートを使用します。テーマにpage.phpテンプレートがある場合、それはページの表示に使用されます。single.phpがある場合、それは単一の投稿を表示するために使用されます。index.phpまたはhome.phpは、ホームページを表示します。読み取りオプションを使用して特定のページをホームページとして選択した場合は、page.phpが表示されます。

だから、あなたの条件文:

<?php if (is_front_page()){ ?>
<p>Home Page</p>
<?php else { ?>
<p>Not Home Page</p>
<?php } ?>
?>

読み取りオプションで特定のページが選択されている場合にのみ、header.phpまたはfooter.phpファイル、またはpage.phpでのみ実際に役立ちます。


答えてくれてありがとう。でも、これが前述の関数から返される値にどのように影響するかはわかりません。
Ejaz

5
スパムをやめろ!!!! 。あなたのリンクはあなた自身のウェブサイトに戻ってジャンクです。次の投稿にはスパムのフラ​​グが付けられます。ありがとう
Pieter Goosen

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