Почему is_page не работает при размещении в файле functions.php?
У меня есть страница под названием "Apple" с ID 2533.
В файле page.php у меня есть строка:
echo $bannerimg
И эта функция в файле functions.php:
if ( is_page( '2533' ) ) {
// также тестировал с 'Apple'
$bannerimg = 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
$bannerimg = 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
$bannerimg = 'admissions.jpg';
} else {
$bannerimg = 'home.jpg';
}
Проблема в том, что $bannerimg выводит "home.jpg" на каждой странице, включая Apple, test и admissions.
Я даже проверил все ID используя the_ID и $page->ID. Безрезультатно. Похоже, что-то не так с кодом выше?

Я пробовал этот код внутри функции, но, кажется, он ничего не возвращает. Я знаю, что размещение всего в page.php должно помочь, но это не так элегантно.

Я не использую id для ссылок на страницы, но кодекс показывает, что id страницы не должен быть в кавычках, вы пробовали без них? `is_page(); // Когда отображается любая одиночная страница.
is_page(42); // Когда отображается страница с ID 42.
is_page('Contact'); // Когда отображается страница с post_title "Contact".
is_page('about-me'); // Когда отображается страница с post_name (слагом) 'about-me'.
is_page(array(42,'about-me','Contact')); // Возвращает true, когда отображаемая страница имеет ID 42.` Возможно, это не ваш случай, но стоит попробовать

@Martin Кавычки не совсем корректны, но и не сломают ничего - по умолчанию используется нестрогое сравнение (без проверки совпадения типов)

Что делать, если вы хотите добавить фильтр к запросу? Вы не можете сделать это в шаблоне. Но вы также не можете сделать это в файле functions.php!

get_header
должен работать, если вы хотите оставить его в functions.php
add_action('get_header', function() {
if ( is_page( '2533' ) ) {
// также проверено с 'Apple'
$bannerimg = 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
$bannerimg = 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
$bannerimg = 'admissions.jpg';
} else {
$bannerimg = 'home.jpg';
}
});

Расширяя то, что опубликовал @Rarst и на что вы прокомментировали, более элегантным решением будет создание собственного фильтра внутри page.php и подключение к нему из функции в functions.php, например:
В вашем page.php
$bannerimg = apply_filters('my_bannerimg','defualt_img.jpg');
И в вашем functions.php
add_filter('my_bannerimg','what_page_is_it');
function what_page_is_it($img){
if ( is_page( '2533' ) ) {
return 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
return 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
return 'admissions.jpg';
} else {
return 'home.jpg';
}
}

Добавьте это в ваш functions.php, измените название скрипта someCode и название страницы:
add_action('wp_enqueue_scripts', 'wpt_theme_js');
function wpt_theme_js() {
if ( is_page('somePage') ) {
wp_enqueue_script('someCode_js', get_template_directory_uri() . '/js/someCode.js', '', '', true);
}
}

Вы правильно объявили wp_head();
и другие необходимые функции в вашей теме?
Также учтите, что is_page
принимает ID без кавычек.
Проблема может быть также в том, что вы уже находитесь в шаблоне страницы, поэтому она определяется как страница. Возможно, вам лучше использовать запрос $post->ID
или создать отдельный шаблон page-apple.php
.

Это странно, потому что я везде вижу кавычки: http://codex.wordpress.org/Conditional_Tags

Вам необходимо вызвать вашу функцию в момент процесса WordPress после настройки запроса.
В файле functions.php
:
function mytheme_get_banner_img() {
if ( is_page( '2533' ) ) {
// также протестировано с 'Apple'
$bannerimg = 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
$bannerimg = 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
$bannerimg = 'admissions.jpg';
} else {
$bannerimg = 'home.jpg';
}
return $bannerimg;
}
Затем, в вашем файле шаблона page.php
, где вам нужно вернуть/вывести $bannerimg
:
<?php
$bannerimg = mytheme_get_banner_img();
?>
После этого вы можете делать с $bannerimg
всё, что вам нужно: поместить её в тег <img>
и т.д.

Вам необходимо подключить функцию wp
.
Важное примечание: Обратите внимание, что если вы подключитесь к функции init
, is_page не будет работать
add_filter('wp', 'pre_fix_function_is_page');
function pre_fix_function_is_page()
{
if ( is_page( '2533' ) ) {
// также протестировано с 'Apple'
$bannerimg = 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
$bannerimg = 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
$bannerimg = 'admissions.jpg';
} else {
$bannerimg = 'home.jpg';
}
}
