Perché is_page non funziona quando lo inserisco nel file Functions.php?


11

Ho una pagina chiamata "Apple", ID ID della pagina 2533.

Nel file page.php ho una riga:

echo $bannerimg 

E questa funzione in 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';
}  

Il punto è che $ bannerimg fa eco a "home.jpg" su ogni pagina, inclusi Apple, test e ammissioni.

Ho anche controllato tutti gli ID usando il_ID & $ page-> ID. Niente. Quindi immagino che ci sia qualcosa di sbagliato nel codice sopra?


Una soluzione nel seguente thread mi ha aiutato a risolvere un problema simile: wordpress.stackexchange.com/questions/225359/…
Lefan

Risposte:


16

functions.phpviene elaborato molto prima che tu possa sapere quale pagina viene caricata. Invece di assegnare valore alla variabile, metti in funzione il tuo codice e usa quella funzione nel page.phptemplate.


Ho provato con questo codice anche all'interno di una funzione, ma sembra che non restituisca nulla. So che mettere tutto in page.php dovrebbe aiutare, ma non è così elegante.
Wordpressor

Non uso gli ID per riferimento alla pagina ma il codice mostra che l'id della pagina non ha virgolette singole, l'hai provato? 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.probabilmente non è il caso, ma vale la pena
provare

1
Le virgolette di @Martin non sono del tutto esatte, ma non si romperanno nulla - sono vagamente confrontate per impostazione predefinita (senza verificare se il tipo corrisponde)
Rarst

Cosa succede se si desidera aggiungere un filtro alla query? Non puoi farlo nel modello. Ma non puoi nemmeno farlo nel file Functions.php!
Reggie,

@reggie perché no? Probabilmente dovresti fare una nuova domanda al riguardo. :)
Rarst

5

get_header dovrebbe funzionare se vuoi lasciarlo dentrofunctions.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';
    }  
});

4

Estendendo ciò che @Rarst ha pubblicato e commentato, una soluzione più elegante sarebbe quella di creare il proprio filtro all'interno di page.php e agganciarlo da una funzione all'interno di Functions.php, ad esempio:

in te page.php

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

e nelle tue funzioni.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';
    }  
}

1

Aggiungi questo al tuo function.php, cambia il nome dello script someCode e il nome della pagina:

   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);
        }
    }

0

È necessario chiamare la funzione in un punto del processo di WordPress dopo aver impostato la query .

In 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;
}

Quindi, nel tuo page.phpfile modello, ovunque sia necessario restituire / generare $bannerimg:

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

Quindi, puoi fare tutto ciò di cui hai bisogno $bannerimg: rilascialo in un <img>tag, ecc.


0

Hai dichiarato correttamente wp_head();ecc. Nel tuo tema?

Inoltre, is_pageaccetta un ID senza virgolette.

Il problema potrebbe anche essere il fatto che sei già nel modello di pagina, quindi è una pagina, potresti essere meglio di interrogare $post->IDo impostarepage-apple.php


is_page()può accettare anche ID come numero intero
Bainternet,

sì, ma un int non dovrebbe essere citato
Alex Older,

È strano, perché vedo citazioni ovunque: codex.wordpress.org/Conditional_Tags
Wordpressor

ed è una cattiva pratica.
Alex Older,

Sono d'accordo, l'intero non dovrebbe essere citato. Ma a PHP non dispiacerà in entrambi i modi.
Reggie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.