Difference between do_action_ref_array() and do_action()

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?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

  • 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';
    ?>
    <pre><?php
    print htmlspecialchars(
        print_r( $args, TRUE ),
        ENT_QUOTES,
        'utf-8',
        FALSE
    );
    ?></pre>
    <?php
}

Result:

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

)

diff_action_ref_array, 3 arguments 
Array
(
    [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.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x