add_action (), add_filter () vor oder nach der Funktion

18

Wenn durch Wordpress Suche Schnipsel / tutorials / Plugins , die ich oft sehen add_action()und add_filter()platziert wird , bevor die Funktion deklariert ist:

add_action( 'publish_post', 'email_friends' );

function email_friends( $post_ID ) {
   $friends = '[email protected], [email protected]';
   mail( $friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com' );
   return $post_ID;
}

Aus logischer Sicht ergibt das für mich einfach keinen Sinn. Warum sollten Sie die Funktion platzieren, nachdem sie in Ihrem Code aufgerufen wurde? So gehe ich normalerweise mit der gleichen Situation um:

function email_friends( $post_ID )  {
   $friends = '[email protected], [email protected]';
   mail( $friends, "sally's blog updated" , 'I just put something on my blog: http://blog.example.com' );
   return $post_ID;
}

add_action( 'publish_post', 'email_friends' );

Ich weiß, dass beide Szenarien funktionieren, aber gibt es einen bestimmten Vorteil für das eine oder andere? In etwa 90% der Fälle sehe ich, dass das erste Szenario verwendet wird, was mich zu der Annahme veranlasst, dass dies in gewisser Weise von Vorteil ist.

voodooGQ
quelle

Antworten:

13

Es ist einfacher zu lesen: Wann heißt was ? Wenn Sie einen Hook debuggen, können Sie sofort sehen, ob Sie die Funktion lesen müssen oder nicht: Wenn es nicht Ihr Hook ist, können Sie den Code überspringen.

In meinen Themes und Plugins füge ich oben alle Registrierungen für Aktionen, Filter und Shortcodes zusammen und füge den Hook zum PHPDoc-Block hinzu:

add_action( 'wp_head',  'foo' );
add_action( 'shutdown', 'bar' );

/**
 * Foo you!
 *
 * @wp-hook wp_head
 * @return  void
 */
function foo()
{
    print '<!-- foo -->';
}
fuxia
quelle
2
Obwohl ich nicht einverstanden bin (nur aufgrund meiner persönlichen Präferenz und früherer Codierungspraktiken), dass es einfacher ist, dies zu lesen, macht es Sinn, warum es auf diese Weise gemacht wird.
VoodooGQ
6

Eigentlich gibt es keinen wirklichen Unterschied. Ich bevorzuge beispielsweise das erste Szenario, da es besser ist, Anrufe an einem Ort zu platzieren und darunter liegende Funktionen zu definieren. PHP analysiert das gesamte Dokument, bevor etwas ausgeführt wird, und wenn die Funktionen richtig definiert sind, funktioniert alles normal, kein Vorteil in beiden Szenarien.

Ich glaube das richtige Sprichwort hier ist: Was auch immer dein Boot schwimmt :)

OriginalEXE
quelle
Es funktioniert nicht, weil PHP das gesamte Dokument analysiert, sondern weil call_user_func_array()es (höchstwahrscheinlich) nach Ihrer Funktionsdefinition aufgerufen wird, wenn es ausgeführt wird do_action. So können Sie die Hook-Funktion bis zu diesem Punkt an einer beliebigen Stelle definieren.
Kovshenin
1

4 Jahre später, aber ich bin sicher, es wird den Leuten helfen, von der Suche hierher zu kommen.

Wie bereits erwähnt, gibt es keinen Unterschied, da PHP das gesamte Dokument analysiert und in der richtigen Reihenfolge ausführt. Also, was auch immer du magst.

Ich persönlich mag den ersten Stil:

add_action(hook, bar);
function bar(){
    //code here
}

Ich neige dazu, rückwärts zu denken. Wenn Sie so wollen, zielorientiert. Also lese ich gerne: "Wir machen die Funktionsleiste im Haken. Okay, cool, was macht die Funktion jetzt?"

Es stellt den Kontext für die Funktion besser ein. Dies ist natürlich nur meine persönliche Präferenz. Also mach was du willst.

John_911
quelle