add_action (), add_filter () до или после функции

18

Просматривая фрагменты / учебники / плагины WordPress, которые я часто вижу add_action()и add_filter()помещаю перед объявлением функции:

add_action( 'publish_post', 'email_friends' );

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

С логической точки зрения это просто не имеет смысла для меня. Зачем вам помещать функцию после ее вызова в вашем коде? Это обычно, как я бы справился с той же ситуацией:

function email_friends( $post_ID )  {
   $friends = 'bob@example.org, susie@example.org';
   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' );

Я знаю, что оба сценария работают, но есть ли конкретное преимущество для одного или другого? Примерно в 90% случаев я вижу, как используется первый сценарий, и это наводит меня на мысль, что в этом есть какая-то польза.

voodooGQ
источник

Ответы:

13

Это легче читать: Когда это то , что называется? Если вы отлаживаете ловушку, вы можете сразу увидеть, нужно ли вам читать функцию или нет: если это не ваша ловушка, вы можете пропустить код.

В моих темах и плагинах я объединяю все регистрации для действий, фильтров и шорткодов в верхней части и добавляю хук к блоку PHPDoc:

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

/**
 * Foo you!
 *
 * @wp-hook wp_head
 * @return  void
 */
function foo()
{
    print '<!-- foo -->';
}
Фуксия
источник
2
Хотя я не согласен (только из-за моих личных предпочтений и прошлых практик кодирования), что легче читать, но имеет смысл понять, почему это сделано таким образом.
voodooGQ
6

На самом деле нет никакой разницы, я, например, предпочитаю следовать первому сценарию, потому что удобнее размещать вызовы в одном месте и определять функции ниже этого. PHP анализирует весь документ перед выполнением чего-либо, и если функции определены должным образом, все будет работать нормально, в любом случае это не дает никаких преимуществ.

Я считаю, что правильное высказывание здесь: все, что плавает на вашей лодке :)

OriginalEXE
источник
Это работает не потому, что PHP анализирует весь документ, а потому, что call_user_func_array()(скорее всего) вызывается после определения вашей функции при запуске do_action. Таким образом, вы можете определить подключенную функцию в любом месте до этой точки.
Ковшенин
1

4 года спустя, но я уверен, что это поможет людям попасть сюда из поиска.

Как уже говорили другие, нет никакой разницы, так как php анализирует весь документ и выполняет в правильном порядке. Так что как хочешь.

Мне лично нравится первый стиль:

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

Я склонен думать задом наперед. Ориентирован на цель, если хотите. Так что мне нравится читать: «Мы делаем функциональную панель, в ловушке. Хорошо, круто, теперь, что делает функция?»

Это устанавливает контекст для функции лучше. Конечно, это всего лишь мое личное предпочтение. Так что делай что хочешь.

John_911
источник