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?


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.


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

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

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

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.


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.