Aktionen, Funktionen und Bedingungen

7

Bei der Entwicklung von Themen und Plugins ist es manchmal erforderlich, einem Hook mithilfe von bedingten Anweisungen einige Funktionen hinzuzufügen.

Beispiel:

function my_custom_function() {
    if( is_home()) {
       <---what should the function do--->
    }
}

 add_action( 'some_hook', 'my_custom_function' );

Nach meinem Verständnis wird is_homeder Inhalt der Funktion nicht ausgeführt , wenn eine andere Bedingung vorliegt ( return false), die Funktion wird jedoch ausgeführt, obwohl sie "leer" ist. Dies bedeutet, dass eine leere Funktion an den Hook übergeben wird. Auf diese Weise werden alle Beispiele im Codex mit bedingten Tags angezeigt.

Ich verstehe, dass dies sicher ist und keine signifikanten Auswirkungen auf die Ladezeiten haben sollte (wenn es überhaupt Auswirkungen auf die Ladezeiten gibt).

Ich habe gedacht, dass derselbe Code wie im Beispiel wie folgt geschrieben werden kann

if( is_home()) {
   function my_custom_function() {
     <---what the function should do--->
   }

  add_action( 'some_hook', 'my_custom_funtion' );

}

Dies überspringt alles vollständig, wenn is_homefalse zurückgegeben wird.

Es macht mir nichts aus, eine dieser beiden Methoden anzuwenden. Aber was ich wissen möchte, weil das erste Beispiel ausgiebig verwendet wurde, gibt es einen Codierungsstandard, der besagt, dass dies die richtige Methode ist, oder ist dies nach Ansicht von WordPress-Entwicklern eher die bevorzugte Methode oder nur eine persönliche Präferenz.

Pieter Goosen
quelle

Antworten:

8

Die WordPress-Codierungsstandards für PHP geben nichts darüber an, und es gibt keinen anderen Standard. Daher liegt es an den Entwicklern, die eine oder andere Art zu wählen.

Ich muss sagen, dass die beiden Methoden unterschiedliche Ansätze haben; Während die erste bedingte Logik enthält, ist die zweite eine bedingte Funktionsdeklaration. Wenn Sie also versuchen, die Funktion aufzurufen, erhalten Sie einen schwerwiegenden Fehler.

Auch wenn die erste Methode verwendet wird , in dem die Funktion läuft (mit einem sehr geringen Einfluss auf die Leistung , die nicht relevant und ist verloren in der Anwendungslast), ist es ein besserer Ansatz ist es, es zu benutzen, weil , wenn die zweite Methode verwenden, die Geschäftslogik Ihre Anwendung wird von den Funktionen in die Dateianalyse verschoben.

Darüber hinaus sollten Sie berücksichtigen, dass es einen dritten Weg gibt, den Sie nicht erwähnt haben:

function my_custom_function() {
    // what the function should do
}

if ( is_home() ) {
    add_action( 'some_hook', 'my_custom_function' );
}

Der Vorteil dieses Ansatzes ist bei Verwendung der OOP-Programmierung deutlicher erkennbar: In diesem Fall ist eine klassenbedingte Deklaration nicht sinnvoll (und eine methodenbedingte Deklaration ist überhaupt nicht möglich), aber es ist sehr sinnvoll, Aufgaben nur unter bestimmten Bedingungen auszuführen ( Haken feuern).

gmazzap
quelle
Es war schwer, sich zwischen Ihnen und @toscho zu entscheiden, aber ich muss es Ihnen geben, um auf die WordPress-Standards zu verlinken. Vielen Dank für eine tolle Antwort
Pieter Goosen
7

Erstellen Sie keine Funktionen im laufenden Betrieb. Dies ist schwer zu lesen und zu debuggen. Implementieren Sie stattdessen die Trennung von Bedenken und trennen Sie die Registrierung von Rückrufen von ihrer Ausführung (Geschäftslogik). Das logische Festlegen der bedingten Prüfungen vor der Rückrufregistrierung ist jetzt ganz einfach.
Warten Sie, bis die Aktion template_redirectdiesen Registrierungshandler instanziiert, da Sie dann wissen, ob is_home()sie überprüft werden kann.

Beispiel

class Theme_Hooks
{ 
    public function setup()
    {
        if ( ! is_404() ) {
            add_action(
                get_stylesheet() . '_breadcrumb',
                [ new Breadcrumb, 'render' ]
            );
        }

        if ( is_home() ) {
            add_action(
                get_stylesheet() . '_home_widget',
                [ new Home_Widget, 'render' ]
            );
        }
    }
}

add_action( 'template_redirect', [ new Theme_Hooks, 'setup' ] );
Fuxia
quelle
Macht perfekt Sinn. +1
Pieter Goosen
Es wäre gut zu erwähnen gewesen, dass Sie is_home()sowieso nicht so früh anrufen sollten, sonst erhalten Sie Folgendes : PHP Notice: is_home was called <strong>incorrectly</strong>. Conditional query tags do not work before the query is run. Before then, they always return false. Please see <a href="http://codex.wordpress.org/Debugging_in_WordPress">Debugging in WordPress</a> for more information. (This message was added in version 3.1.).
JD
4

Ich möchte nur hinzufügen, dass man im Allgemeinen vorsichtig sein sollte, wenn man bedingte Tags verwendet wie:

if( is_*() )
{
    // stuff
}

im globalen Bereich von functions.php, da es ausgeführt wird, bevor ein Filter oder eine Aktion mit do_action()oder ausgelöst wird apply_filters().

Birgire
quelle
0

Ich würde persönliche Präferenz sagen.

Außerdem ist es sauberer, den Funktionsaufruf außerhalb der if-Anweisung und die darin enthaltene Aktion auszuführen. Auf diese Weise wird die Funktion von der Aktion immer noch nur aufgerufen, wenn die if-Anweisung true zurückgibt.

Wenn Sie Funktionsdefinitionen immer außerhalb der if-Anweisung halten, wird sichergestellt, dass Sie niemals eine Funktion aufrufen, die zufällig abgefangen und nicht abrufbar ist.

Berend
quelle
0

Ich möchte nur eine weitere Option hinzufügen. Das Hybrid Core Framework hat eine Methode namens "Smarter Hooks" implementiert, die den Kontext erkennt.

Die vollständige Quelle finden Sie hier:

https://github.com/justintadlock/hybrid-core/blob/master/functions/core.php

Idealerweise kann es folgendermaßen verwendet werden:

Ein Beispiel für einen einfachen Hook wäre 'hybrid_header'. Die Funktion do_atomic () erweitert diese um zusätzliche Hooks wie 'hybrid_singular_header', 'hybrid_singular-post_header' und 'hybrid_singular-post-ID_header'.

Anh Tran
quelle