is_front_page()故障?


8

我有一个非常基本的问题,我很惊讶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类。 bodywp-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... */  

这表明由于某些原因,wordpress查询首页以显示wp-signup.php并提出以下问题。

  • 为什么is_front_page()返回错误结果?
  • wp-signup.php永远无法使用Wordpress管理员设置将AFAIK 设置为主页,那么为什么不仅仅通过选中PHP_SELF或来保存wordpress代码REQUEST_URI
  • 为什么此时WP_Query具有当前主页$this->post

我已经通过删除plugins(和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上听说过这种情况。尝试停用您的主题并重新激活它。
马特·范·安德尔

Answers:


1

只是猜测,但我想知道您是否遇到匿名函数问题。WP中允许使用匿名函数,并且通常可以正常工作(假定已更新PHP),但是,如果您四处搜索,则会发现有关可疑错误或至少是意外行为的报告。

为此,我不确定我是否曾经在WordPress Codex中看到过用作示例的匿名函数,而且我想不起来曾经在主题和插件代码中运行过一个匿名函数。当然,我还没有注意到anon函数,但是,我仍然认为上面的函数几乎总是以更熟悉的两部分格式的某些版本编写的,即:

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-”也是。

实际上,我发现略长一些的两部分方式更容易阅读,跟踪和调整。


-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 2015年

这甚至都无法回答当前的问题
Pieter Goosen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.