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класс bodyдаже на 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... */  

Это показывает, что WordPress по какой-то причине запрашивает главную страницу для отображения wp-signup.phpи поднимает следующие вопросы.

  • Почему is_front_page()возвращает неправильные результаты?
  • AFAIK wp-signup.phpникогда не может быть установлен в качестве домашней страницы с помощью настроек администратора Wordpress, тогда почему код WordPress не выручает, просто проверяя PHP_SELFили REQUEST_URI?
  • Почему WP_Query имеет текущую домашнюю страницу в $this->postданный момент?

Я исключил проблему с плагином , удалив каталог plugins (и mu-plugins). Это все еще квалифицируется wp-signup.phpкак главная страница, где это не для любой другой страницы.

Любая помощь по этому вопросу будет принята с благодарностью.

Обновление
Я использую WP версии 4.2.4, и это многосайтовая установка.

Спасибо.

Ejaz
источник
Вы определенно используете последнюю версию WordPress? И это многосайтовая установка?
TheDeadMedic
Я использую версию 4.2.4 и да, это многосайтовая установка. Добавлено в вопрос.
Ejaz
Это ... странно. Все, что я могу предложить сейчас, это использовать следующее ifусловие:( ! isset( $GLOBALS['pagenow'] ) || $GLOBALS['pagenow'] !== 'wp-signup.php' ) && ( is_front_page() || is_home() )
TheDeadMedic
Спасибо за предложение @TheDeadMedic, которое сделает это. Итак, проблема в ошибке WP?
Ejaz
Я действительно слышал об этом раньше на WPMU. Попробуйте деактивировать свою тему и активировать ее.
Мэтт ван Андел

Ответы:

1

Просто предположение, но мне интересно, сталкиваешься ли ты с проблемой анонимной функции. Анонимные функции разрешены в WP и обычно работают нормально (при условии обновления PHP), но, если вы будете искать вокруг, вы найдете сообщения о подозрительных ошибках или, по крайней мере, о непредвиденном поведении.

В этом отношении, я не уверен, что когда-либо видел анонимную функцию, используемую в качестве примера в Кодексе WordPress, и я не могу вспомнить, чтобы когда-либо работали с ней ранее в коде темы и плагина. Конечно, я не обращал внимания на функции 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/ ), или напишите каждый из них как названный two- Партнеры тоже.

По правде говоря, я считаю, что чуть более длинный двухчастный способ легче читать, отслеживать и настраивать.

CK MacLeod
источник
-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, если в опциях чтения выбрана определенная страница.

jim.duck
источник
Спасибо за ответ, но я не вижу, как это влияет на значения, возвращаемые вышеупомянутыми функциями.
Ejaz
5
ОСТАНОВИТЬ СПАМИНГ !!!! , Ваши ссылки возвращаются на ваш собственный сайт. Ваши следующие сообщения будут помечены как спам. Спасибо
Питер Гусен
Это также даже не отвечает на поставленный вопрос
Питер Гусен