Por que o is_page não funciona quando eu o coloco no arquivo functions.php?


11

Eu tenho uma página chamada "Apple", o ID da página 2533.

No arquivo page.php, tenho a linha:

echo $bannerimg 

E esta função em 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';
}  

O ponto é que os $ bannerimg ecoam "home.jpg" em todas as páginas, incluindo Apple, testes e admissões.

Eu até chequei todos os IDs usando o_ID & $ page-> ID. Nada. Então, acho que há algo errado com o código acima?


Uma solução no segmento a seguir me ajudou a resolver um problema semelhante: wordpress.stackexchange.com/questions/225359/…
Lefan

Respostas:


16

functions.phpé processado antes de você saber qual página está sendo carregada. Em vez de atribuir valor à variável, coloque seu código em função e use essa função no page.phpmodelo.


Eu tentei com esse código dentro de uma função também, mas parece que ele não retorna nada. Eu sei que colocar tudo no page.php deve ajudar, mas não é tão elegante.
Wordpressor

Eu não uso id's para referência de página, mas o codex mostra que o id da página não tem aspas simples, você já tentou isso? 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.provavelmente não é o caso, mas vale a pena
tentar

11
@ Martin citações não são inteiramente correto, mas não vai quebrar nada também - é vagamente comparação por padrão (sem verificar se corresponde ao tipo)
Rarst

E se você quiser adicionar um filtro à consulta? Você não pode fazer isso no modelo. Mas você também não pode fazê-lo no arquivo functions.php!
Reggie

@ reggie por que não? Você provavelmente deveria fazer uma nova pergunta sobre isso. :)
Rarst 17/04/2015

5

get_header deve funcionar se você quiser deixá-lo emfunctions.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 o que o @Rarst postou e você comentou, uma solução mais elegante seria criar seu próprio filtro dentro do page.php e conectá-lo a partir de uma função dentro do functions.php, por exemplo:

em você page.php

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

e em suas funções.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

Adicione isso ao seu functions.php, altere o nome do script someCode e o nome da 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);
        }
    }

0

Você precisa chamar sua função em um ponto do processo do WordPress após a configuração da consulta .

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

Em seguida, no seu page.phparquivo de modelo, sempre que você precisar retornar / produzir $bannerimg:

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

Em seguida, você pode fazer o que precisar $bannerimg: coloque-o em uma <img>tag etc.


0

Você declarou corretamente wp_head();etc no seu tema?

Além disso, is_pageaceita um ID sem aspas.

O problema também pode ser o fato de você já estar no modelo de página, por isso é uma página, é melhor consultar $post->IDou configurarpage-apple.php


is_page()pode aceitar ID como inteiro bem
Bainternet

sim, mas um int não deve ser citado
Alex Older

Isso é estranho, porque vejo citações em todos os lugares: codex.wordpress.org/Conditional_Tags
Wordpressor

e é uma má prática.
Alex Older

Eu concordo, o número inteiro não deve ser citado. Mas o PHP não se importará de qualquer maneira.
Reggie
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.