¿Por qué no funciona is_page cuando lo pongo en el archivo functions.php?

11

Tengo una página llamada "Apple", el ID de la página ID 2533.

En el archivo page.php tengo línea:

echo $bannerimg 

Y esta función en functions.php:

if ( is_page( '2533' ) ) {    
    // also tested with 'Apple'
    $bannerimg = 'apple.jpg';

} elseif ( is_page( 'test' ) ) {    
    $bannerimg = 'test.jpg';

} elseif ( is_page( 'admissions' ) ) { 
    $bannerimg = 'admissions.jpg';

} else { 
    $bannerimg = 'home.jpg';
}  

El punto es que $ bannerimg hace eco de "home.jpg" en cada página, incluyendo Apple, prueba y admisiones.

Incluso he comprobado todas las ID usando la_ID y $ page-> ID. Nada. ¿Entonces supongo que hay algo mal con el código anterior?

Wordpressor
fuente
Una solución en el siguiente hilo me ayudó a resolver un problema similar: wordpress.stackexchange.com/questions/225359/…
Lefan

Respuestas:

16

functions.phpse procesa antes de que pueda saber qué página se está cargando. En lugar de asignar un valor a la variable, ponga su código en función y use esa función en la page.phpplantilla.

Rarst
fuente
También probé con este código dentro de una función, pero parece que no devuelve nada. Sé que ponerlo todo en page.php debería ayudar, pero no es tan elegante.
Wordpressor
No uso ID's para referencia de página, pero el codex muestra que la identificación de la página no tiene comillas simples, ¿lo has intentado? is_page(); // When any single Page is being displayed. is_page(42); // When Page 42 (ID) is being displayed. is_page('Contact'); // When the Page with a post_title of "Contact" is being displayed. is_page('about-me'); // When the Page with a post_name (slug) of "about-me" is being displayed. is_page(array(42,'about-me','Contact')); // Returns true when the Pages displayed is either post ID 42.probablemente no sea el caso, pero vale la pena
intentarlo
1
Las citas de @Martin no son del todo correctas, pero tampoco romperán nada: se compara libremente de manera predeterminada (sin verificar si el tipo coincide)
Rarst
¿Qué sucede si desea agregar un filtro a la consulta? No puedes hacer eso en la plantilla. ¡Pero tampoco puedes hacerlo en el archivo functions.php!
reggie
@reggie ¿por qué no? Probablemente deberías hacer una nueva pregunta al respecto. :)
Rarst
5

get_header debería funcionar si quieres dejarlo enfunctions.php

add_action('get_header', function() {
    if ( is_page( '2533' ) ) {    
    // also tested with 'Apple'
        $bannerimg = 'apple.jpg';

    } elseif ( is_page( 'test' ) ) {    
        $bannerimg = 'test.jpg';

    } elseif ( is_page( 'admissions' ) ) { 
        $bannerimg = 'admissions.jpg';

    } else { 
        $bannerimg = 'home.jpg';
    }  
});
Bryan Willis
fuente
4

Extendiendo lo que @Rarst publicó y comentó, una solución más elegante sería crear su propio filtro dentro de page.php y conectarlo desde una función dentro de functions.php, por ejemplo:

en tu pagina.php

$bannerimg = apply_filters('my_bannerimg','defualt_img.jpg');

y en tus funciones.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';
    }  
}
Bainternet
fuente
1

Agregue esto a functions.php, cambie 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);
        }
    }
Vasyl Gutnyk
fuente
0

Debe llamar a su función en un punto del proceso de WordPress después de configurar la consulta .

En functions.php:

function mytheme_get_banner_img() {
    if ( is_page( '2533' ) ) {    
        // also tested with '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 su page.phparchivo de plantilla, donde sea que necesite devolver / generar $bannerimg:

<?php
$bannerimg = mytheme_get_banner_img();
?>

Luego, puede hacer lo que necesite $bannerimg: colocarlo en una <img>etiqueta, etc.

Chip Bennett
fuente
0

¿Has declarado correctamente wp_head();etc. en tu tema?

Además, is_pageacepta una identificación sin comillas.

El problema también puede ser el hecho de que ya está en la plantilla de la página, por lo que es una página, puede ser mejor consultar $post->IDo configurarpage-apple.php

Alex Older
fuente
is_page()puede aceptar ID como entero también
Bainternet
sí, pero no se debe citar un int
Alex Older
Eso es extraño, porque veo citas en todas partes: codex.wordpress.org/Conditional_Tags
Wordpressor
Y es una mala práctica.
Alex Older
Estoy de acuerdo, no se debe citar el número entero. Pero a PHP no le importará de ninguna manera.
reggie