27

When looking through WordPress snippets/tutorials/plugins I often see add_action() and add_filter() being placed before the function is declared:

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

From a logic standpoint this just doesn't make sense to me. Why would you place the function after it is called in your code? This is usually how I would handle the same situation:

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

I know both scenarios work, but is there a specific advantage to one or the other? About 90% of the time I see the first scenario being used, so that leads me to believe there is a benefit to this in some way.

4 Answers 4

17

It is easier to read: When is what called? If you are debugging a hook you can immediately see if you have to read the function or not: If it is not your hook, you can skip the code.

In my themes and plugins I combine all registrations for actions, filters and shortcodes at the top and I add the hook to the PHPDoc block:

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

/**
 * Foo you!
 *
 * @wp-hook wp_head
 * @return  void
 */
function foo()
{
    print '<!-- foo -->';
}
1
  • 4
    Although I don't agree (Just because of my personal preference and past coding practices) that its easier to read this does make sense as to why it's done in this manner.
    – voodooGQ
    Commented Sep 26, 2012 at 18:19
10

There is no real difference actually, I for example prefer to follow first scenario, because it's neater to place calls in one place, and define functions below that. PHP parses the whole document prior to running anything, and if functions are properly defined, everything will work normally, no advantage in either scenario.

I believe the right saying here is: Whatever floats your boat :)

1
  • 1
    It works not because PHP parses the whole document, but because call_user_func_array() is (most likely) called after your function definition when running do_action. So you can define the hooked function anywhere up to that point.
    – kovshenin
    Commented May 4, 2015 at 10:39
3

4 years later, but I'm sure it'll help people getting here from search.

As others have stated, there isn't a difference as php parses the entire document and executes in the correct order. So whatever you like.

I personally like the first style:

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

I tend to think backwards. Goal oriented if you will. So I like to to read, "we're doing function bar, in hook. Okay cool, now, what does the function do?"

It sets up the context for the function better. Of course this is just my personal preference. So do what you like.

2

I feel like there should be some specific guidance to this in the WordPress coding standards, but it seems like there is not.

I would argue against the "whatever is fine" answers to say either:

A) consistently follow the examples available in the WP Codex and do function followed by add_action like this:

function wporg_custom()
{
    // do something
}
add_action('init', 'wporg_custom');

or

B) if you pick a different style, pick one and do it consistently in all of the themes and plugins you build - not just "whatever floats your boat" at the moment.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.