Warum funktioniert is_page nicht, wenn ich es in die Datei functions.php einfüge?

11

Ich habe eine Seite namens "Apple", die ID-ID 2533 der Seite.

In der Datei page.php habe ich folgende Zeile:

echo $bannerimg 

Und diese Funktion 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';
}  

Der Punkt ist, dass das $ bannerimg "home.jpg" auf jeder Seite wiedergibt, einschließlich Apple, Test und Zulassungen.

Ich habe sogar alle IDs mit der_ID & $ page-> ID überprüft. Nichts. Also denke ich, dass etwas mit dem obigen Code nicht stimmt?

Wordpressor
quelle
Eine Lösung im folgenden Thread half mir bei der Lösung eines ähnlichen Problems: wordpress.stackexchange.com/questions/225359/…
Lefan

Antworten:

15

functions.phpwird verarbeitet, bevor Sie wissen, welche Seite geladen wird. Anstatt der Variablen einen Wert zuzuweisen, setzen Sie Ihren Code in die Funktion und verwenden Sie diese Funktion in der page.phpVorlage.

Selten
quelle
Ich habe versucht, diesen Code auch innerhalb einer Funktion zu verwenden, aber es scheint, als würde er nichts zurückgeben. Ich weiß, dass es helfen sollte, alles in page.php zu setzen, aber es ist nicht so elegant.
Wordpressor
Ich verwende keine IDs als Seitenreferenz, aber der Codex zeigt, dass die ID der Seite keine einfachen Anführungszeichen enthält. Haben Sie das versucht? 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.wahrscheinlich nicht der Fall, aber einen
Versuch
1
@ Martin Anführungszeichen sind nicht ganz korrekt, aber sie werden auch nichts kaputt machen - es wird standardmäßig lose verglichen (ohne zu prüfen, ob der Typ übereinstimmt)
Rarst
Was ist, wenn Sie der Abfrage einen Filter hinzufügen möchten? Das können Sie in der Vorlage nicht tun. Aber Sie können es auch nicht in der Datei functions.php tun!
Reggie
@reggie warum nicht? Sie sollten wahrscheinlich neue Fragen dazu stellen. :)
Rarst
5

get_header sollte funktionieren, wenn Sie es in lassen möchtenfunctions.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
quelle
4

Wenn Sie das, was @Rarst gepostet und Sie kommentiert haben, erweitern, besteht eine elegantere Lösung darin, einen eigenen Filter in page.php zu erstellen und ihn von einer Funktion in der functions.php aus zu verknüpfen, zum Beispiel:

in dir page.php

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

und in Ihrer functions.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
quelle
1

Fügen Sie dies Ihrer functions.php hinzu, ändern Sie den Namen des Skripts someCode und den Namen der Seite:

   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
quelle
0

Sie müssen Ihre Funktion an einem Punkt im WordPress-Prozess aufrufen, nachdem die Abfrage eingerichtet wurde .

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

Dann in Ihrer page.phpVorlagendatei, wo immer Sie zurückgeben / ausgeben müssen $bannerimg:

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

Dann können Sie alles tun, was Sie brauchen $bannerimg: Legen Sie es in einem <img>Tag ab usw.

Chip Bennett
quelle
0

Haben Sie wp_head();etc in Ihrem Thema richtig deklariert ?

Auch is_pageakzeptiert eine ID ohne Anführungszeichen.

Das Problem kann auch die Tatsache sein, dass Sie sich bereits in der Seitenvorlage befinden, sodass es sich um eine Seite handelt. Möglicherweise sollten Sie die Seite besser abfragen $post->IDoder einrichtenpage-apple.php

Alex Older
quelle
is_page()kann ID auch als Ganzzahl akzeptieren
Bainternet
Ja, aber ein Int sollte nicht zitiert werden
Alex Older
Das ist seltsam, weil ich überall Zitate sehe: codex.wordpress.org/Conditional_Tags
Wordpressor
und es ist eine schlechte Praxis.
Alex Older
Ich stimme zu, die ganze Zahl sollte nicht zitiert werden. Aber PHP wird es auch nicht stören.
Reggie