it-swarm.com.de

Was ist eine gute Möglichkeit, eine Variable von add_action an ein Theme zu übergeben?

Innerhalb von functions.php:

add_action('init','my_action');

function my_action() {
    if($dontknow) {
        $passme = "yes";
    } else {
        $passme = "no";
    }
}

Innerhalb index.php des aktuellen Themas:

echo $passme;

Gibt es eine globale zu diesem Zweck zu verwenden? Soll ich add_option verwenden (dies ist keine gute Idee für jede Anfrage, die ich vermute)? Soll ich eine benutzerdefinierte globale Variable verwenden?

Gibt es eine bessere/übliche/Standardmethode, um dies zu tun?

3
Blackbam

Verwenden Sie ein Objekt, um den Wert der Variablen beizubehalten, und eine benutzerdefinierte Aktion, um sie auszudrucken.

Erstellen Sie im functions.php Ihres Themas eine Klasse oder besser: Verschieben Sie die Klasse in eine separate Datei.

class PassCheck
{
    private $passed = 'no';

    public function check()
    {
        if ( is_user_logged_in() )
            $this->passed = 'yes';
    }

    public function print_pass()
    {
        echo $this->passed;
    }
}

Dann registriere die Rückrufe:

$passcheck = new PassCheck;
add_action( 'init',       [ $passcheck, 'check' ] );
add_action( 'print_pass', [ $passcheck, 'print_pass' ] );

Und rufen Sie in Ihrer Vorlage einfach die richtige Aktion auf:

do_action( 'print_pass' );

Auf diese Weise hat die Vorlage keine statische Abhängigkeit von der Klasse: Wenn Sie jemals die Klasse entfernen oder einen völlig anderen Rückruf für diese Aktion registrieren, wird das Thema nicht unterbrochen.

Sie können den check()-Rückruf auch auf eine andere Aktion (z. B. wp_loaded) verschieben oder später in eine andere Klasse aufteilen.

Als Faustregel gilt: Vorlagen (Views) sollten so weit wie möglich von der Geschäftslogik entkoppelt werden. Sie sollten keine Klassen- oder Funktionsnamen kennen. Dies ist in der WordPress-Architektur nicht vollständig möglich, aber dennoch eine gute regulative Idee.

10
fuxia

Das hängt wirklich vom Anwendungsfall ab. Alles, was in die DB schreibt, ist wahrscheinlich übertrieben. Globals sind chaotisch. Sie könnten eine Konstante setzen. Sie können die Funktion in eine Klassenmethode umwandeln und eine zusätzliche Methode erstellen, um die Variable zurückzugeben. Sie können $passme nur prüfen, wenn es benötigt wird, anstatt init.

2
vancoder

Ohne weitere Details ist es schwer zu beurteilen, aber es fühlt sich an, als hätten Sie my_action falsch geschrieben, und es wird versucht, zu viele Dinge zu tun.

Der Hook init sollte nur zum Initialisieren von allem verwendet werden, was Sie benötigen. Sie sollten keine Werte darin vorberechnen. Dies sollte nur bei Bedarf erfolgen.

Sie sollten nur eine Funktion namens print_pass haben und sie an jedem Ort aufrufen, an dem Sie sie benötigen.

Zu viel am Hook init zu tun, verstößt gegen das Prinzip, die Codeausführung so weit wie möglich zu verzögern. In diesem Fall führt der Hook init Ihre passme-Logik aus, auch wenn admin behandelt wird, in dem dieser Wert nicht benötigt wird.

Was die Antwort von @ toshco betrifft: Ja, wenn Sie eine Logik haben, die mit Objekten besser beschrieben werden könnte, sollte print_pass wahrscheinlich eine Methode in der Klasse sein, aber das WordPress-Hook-System ist funktional und es ist nicht erforderlich, OOP wenn funktionaler Ansatz gut genug sein wird. Funktional ist nur lesbarer in der Art, wie das WordPress-Hook-System funktioniert.

1
Mark Kaplun