¿Por qué is_page no funciona cuando lo pongo en el archivo functions.php?
Tengo una página llamada "Apple", cuyo ID es 2533.
En el archivo page.php tengo la línea:
echo $bannerimg
Y esta función en functions.php:
if ( is_page( '2533' ) ) {
// también probado con 'Apple'
$bannerimg = 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
$bannerimg = 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
$bannerimg = 'admissions.jpg';
} else {
$bannerimg = 'home.jpg';
}
El problema es que $bannerimg muestra "home.jpg" en todas las páginas, incluyendo Apple, test y admissions.
Incluso he verificado todos los IDs usando the_ID y $page->ID. Nada. Así que supongo que hay algo mal con el código anterior?

También he probado con este código dentro de una función, pero parece que no devuelve nada. Sé que poner todo en page.php podría ayudar, pero no es muy elegante.

No uso IDs para referenciar páginas, pero el codex muestra que el ID de la página no lleva comillas simples, ¿lo has probado así? `is_page(); // Cuando se muestra cualquier página individual.
is_page(42); // Cuando se muestra la página con ID 42.
is_page('Contacto'); // Cuando se muestra la página con post_title "Contacto".
is_page('sobre-mi'); // Cuando se muestra la página con post_name (slug) "sobre-mi".
is_page(array(42,'sobre-mi','Contacto')); // Devuelve true cuando la página mostrada es el ID 42.` probablemente no sea el caso, pero vale la pena intentarlo

@Martin las comillas no son del todo correctas, pero tampoco romperán nada - por defecto se compara de forma flexible (sin comprobar si coinciden los tipos)

¿Qué pasa si quieres agregar un filtro a la consulta? No puedes hacerlo en la plantilla. ¡Pero tampoco puedes hacerlo en el archivo functions.php!

get_header
debería funcionar si deseas dejarlo en functions.php
add_action('get_header', function() {
if ( is_page( '2533' ) ) {
// también probado con 'Apple'
$bannerimg = 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
$bannerimg = 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
$bannerimg = 'admissions.jpg';
} else {
$bannerimg = 'home.jpg';
}
});

Extendiendo lo que publicó @Rarst y comentaste, una solución más elegante sería crear tu propio filtro dentro de page.php y engancharlo desde una función en functions.php, por ejemplo:
en tu page.php
$bannerimg = apply_filters('my_bannerimg','defualt_img.jpg');
y en tu 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';
}
}

Añade esto a tu functions.php, cambia el nombre del script someCode y el nombre de la página:
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);
}
}

¿Has declarado correctamente wp_head();
, etc. en tu tema?
Además, is_page
acepta un ID sin comillas.
El problema también puede ser el hecho de que ya estás en la plantilla de página, por lo que es una página, quizás sería mejor consultar el $post->ID
o configurar page-apple.php

Eso es extraño, porque veo comillas en todas partes: http://codex.wordpress.org/Conditional_Tags

Necesitas llamar a tu función en un punto del proceso de WordPress después de que se establezca la Consulta.
En functions.php
:
function mytheme_get_banner_img() {
if ( is_page( '2533' ) ) {
// también probado con 'Apple'
$bannerimg = 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
$bannerimg = 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
$bannerimg = 'admissions.jpg';
} else {
$bannerimg = 'home.jpg';
}
return $bannerimg;
}
Luego, en tu archivo de plantilla page.php
, donde necesites devolver/mostrar $bannerimg
:
<?php
$bannerimg = mytheme_get_banner_img();
?>
Después, puedes hacer lo que necesites con $bannerimg
: colocarlo en una etiqueta <img>
, etc.

Necesitas enlazar la función wp
.
Nota importante: Ten en cuenta que si enlazas a la función init
, is_page no funcionará
add_filter('wp', 'pre_fix_function_is_page');
function pre_fix_function_is_page()
{
if ( is_page( '2533' ) ) {
// también probado con 'Apple'
$bannerimg = 'apple.jpg';
} elseif ( is_page( 'test' ) ) {
$bannerimg = 'test.jpg';
} elseif ( is_page( 'admissions' ) ) {
$bannerimg = 'admissions.jpg';
} else {
$bannerimg = 'home.jpg';
}
}
