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?

Wordpressor
fonte
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.

Rarst
fonte
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';
    }  
});
Bryan Willis
fonte
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';
    }  
}
Bainternet
fonte
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);
        }
    }
Vasyl Gutnyk
fonte
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.

Chip Bennett
fonte
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

Alex Mais velho
fonte
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