WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am having trouble wrapping my head around these two functions. I understand do_action() but I don't see clearly when do_action_ref_array() would be useful. Couldn't we pass an array to do_action() as well?

share|improve this question
up vote 9 down vote accepted
  • If you pass an array to do_action_ref_array(), each element’s value of that array will be passed as a separate parameter to the callback. The keys are lost.

  • If you pass an array to do_action(), the complete array will be passed as one single parameter to the callback. The keys stay intact.

Let’s look at the differences between do_action() and do_action_ref_array() in a simple plugin:

add_action( 'wp_footer',             'action_diff_test' );
add_action( 'diff_action',           'diff_test_callback', 10, 999 );
add_action( 'diff_action_ref_array', 'diff_test_callback', 10, 999 );

 * call test actions
function action_diff_test()
    $args = array (
        'foo'   => 'bar',
        'hello' => 'world',
        0       => 123

    do_action(           'diff_action',           $args );
    do_action_ref_array( 'diff_action_ref_array', $args );
 * callback for test actions
function diff_test_callback()
    $args = func_get_args();
    print current_filter() . ', ' . func_num_args() . ' arguments';
    print htmlspecialchars(
        print_r( $args, TRUE ),


diff_action, 1 arguments 
    [0] => Array
            [foo] => bar
            [hello] => world
            [0] => 123


diff_action_ref_array, 3 arguments 
    [0] => bar
    [1] => world
    [2] => 123

do_action_ref_array() was introduced 2006 to handle parameters passed by reference better in PHP 4. A review of the function 2011 was closed as wontfix. But the conclusion was not to use for new functions in WordPress anymore, because in PHP 5 you can do that with do_action() too. The problem from 2006 is not a problem nowadays.

Do not use do_action_ref_array() in your custom hooks, but learn how to read it.

share|improve this answer
Excellent explanation, thanks! – drtanz Mar 13 '13 at 13:22

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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