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 к 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 статической страницы, заданной как get_option('page_on_front') страница в настройках> чтение ).

WP_Query::is_page() WP_Query::get_queried_object() использует 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 на этом этапе?

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

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

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

Благодарю.

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

В этом отношении я не уверен, что когда-либо видел анонимную функцию, используемую в качестве примера в CodePress WordPress, и я не могу вспомнить, что когда-либо работал над одним из них в теме и подключаемом коде. Конечно, я не смотрел на анонные функции, но, тем не менее, я думаю, что вышеупомянутая функция почти всегда будет написана в некоторой версии более знакомого формата из двух частей – то есть:

 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-компонентный способ легче читать, отслеживать и настраивать в любом случае.

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