Pourquoi is_page ne fonctionne-t-il pas lorsque je le mets dans le fichier functions.php?

11

J'ai une page appelée "Apple", l'ID de la page 2533.

Dans le fichier page.php, j'ai une ligne:

echo $bannerimg 

Et cette fonction dans 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';
}  

Le point est le $ bannerimg fait écho "home.jpg" sur chaque page, y compris Apple, test et admissions.

J'ai même vérifié tous les identifiants à l'aide de the_ID & $ page-> ID. Rien. Donc je suppose qu'il y a quelque chose qui ne va pas avec le code ci-dessus?

Wordpressor
la source
Une solution dans le fil suivant m'a aidé à résoudre un problème similaire: wordpress.stackexchange.com/questions/225359/…
Lefan

Réponses:

16

functions.phpest traité bien avant de savoir quelle page est en cours de chargement. Au lieu d'attribuer une valeur à une variable, mettez votre code en fonction et utilisez cette fonction dans le page.phpmodèle.

Rarst
la source
J'ai également essayé avec ce code à l'intérieur d'une fonction, mais il semble qu'il ne retourne rien. Je sais que tout mettre dans page.php devrait aider, mais ce n'est pas si élégant.
Wordpressor
Je n'utilise pas les identifiants pour la référence de la page, mais le codex montre que l'identifiant de la page n'a pas de guillemets simples, avez-vous essayé cela? 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.probablement pas le cas mais ça vaut le coup
MartinJJ
1
Les citations @Martin ne sont pas entièrement correctes, mais ne cassent rien non plus - elles sont comparées de manière lâche par défaut (sans vérifier si le type correspond)
Rarst
Et si vous souhaitez ajouter un filtre à la requête? Vous ne pouvez pas faire cela dans le modèle. Mais vous ne pouvez pas non plus le faire dans le fichier functions.php!
reggie
@reggie pourquoi pas? Vous devriez probablement poser une nouvelle question à ce sujet. :)
Rarst
5

get_header devrait fonctionner si vous voulez le laisserfunctions.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
la source
4

En étendant ce que @Rarst a publié et que vous avez commenté, une solution plus élégante serait de créer votre propre filtre à l'intérieur de page.php et de le raccorder à partir d'une fonction à l'intérieur de functions.php, par exemple:

en vous page.php

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

et dans vos fonctions.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
la source
1

Ajoutez ceci à votre functions.php, changez le nom du script someCode et le nom de la page:

   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
la source
0

Vous devez appeler votre fonction à un moment du processus WordPress après la configuration de la requête .

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

Ensuite, dans votre page.phpfichier modèle, partout où vous devez retourner / sortir $bannerimg:

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

Ensuite, vous pouvez faire tout ce dont vous avez besoin $bannerimg: déposez-le dans une <img>balise, etc.

Chip Bennett
la source
0

Avez-vous correctement déclaré wp_head();etc dans votre thème?

De plus, is_pageaccepte une carte d' identité sans les guillemets.

Le problème peut également être le fait que vous êtes déjà sur le modèle de page, donc c'est une page, il vaut peut-être mieux interroger le $post->IDou configurerpage-apple.php

Alex Older
la source
is_page()peut également accepter l'ID comme entier
Bainternet
oui mais un int ne doit pas être cité
Alex Older
C'est étrange, car je vois des citations partout: codex.wordpress.org/Conditional_Tags
Wordpressor
et c'est une mauvaise pratique.
Alex Older
Je suis d'accord, l'entier ne doit pas être cité. Mais PHP ne s'en souciera pas de toute façon.
reggie