[buddypress-trac] [BuddyPress] #2325: Changing hooked-to action functions to make new BP hooks work for 3rd-party components
buddypress-trac at lists.automattic.com
buddypress-trac at lists.automattic.com
Tue Apr 20 22:32:51 UTC 2010
#2325: Changing hooked-to action functions to make new BP hooks work for 3rd-party
components
-----------------------+----------------------------------------------------
Reporter: jeffsayre | Owner:
Type: defect | Status: new
Priority: critical | Milestone: 1.2.4
Component: Core | Keywords:
-----------------------+----------------------------------------------------
This is an important fix with a long explanation.
Currently, there are five new action hooks in BuddyPress 1.2.x that are
intended to be used by 3rd-party components but in reality they do not
work. Here's why.
NOTE: Although this explanation focuses on the bp_setup_nav action event
(hook), the following logic also applies to these BuddyPress action hooks
as well: bp_setup_globals, bp_setup_root_components_action,
bp_register_widgets, bp_register_activity_actions.
Suggested patches to all of these hooks are provided in the attached
file(s).
-------
Here’s the array of all action functions associated with the
plugins_loaded action event. The element keys represent the priority set
for each added action function. If a given action function does not have a
priority set, it automatically is set to a default of “10”.
[plugins_loaded] => Array (
[0] => Array ( [wp_maybe_load_widgets] => Array ( [function] =>
wp_maybe_load_widgets [accepted_args] => 1 ) [wp_maybe_load_embeds] =>
Array ( [function] => wp_maybe_load_embeds [accepted_args] => 1 ) )
[2] => Array ( [bp_core_setup_root_uris] => Array ( [function] =>
bp_core_setup_root_uris [accepted_args] => 1 ) [bp_setup_root_components]
=> Array ( [function] => bp_setup_root_components [accepted_args] => 1 ) )
[3] => Array ( [bp_core_set_uri_globals] => Array ( [function] =>
bp_core_set_uri_globals [accepted_args] => 1 ) )
[5] => Array ( [bp_core_load_buddypress_textdomain] => Array ( [function]
=> bp_core_load_buddypress_textdomain [accepted_args] => 1 )
[bp_setup_globals] => Array ( [function] => bp_setup_globals
[accepted_args] => 1 ) )
[10] => Array ( [bp_setup_nav] => Array ( [function] => bp_setup_nav
[accepted_args] => 1 ) [bp_setup_widgets] => Array ( [function] =>
bp_setup_widgets [accepted_args] => 1 ) [bp_register_activity_actions] =>
Array ( [function] => bp_register_activity_actions [accepted_args] => 1 )
[bp_loaded] => Array ( [function] => bp_loaded [accepted_args] => 1 ) ) )
[shutdown] => Array ( [1] => Array ( [wp_ob_end_flush_all] => Array (
[function] => wp_ob_end_flush_all [accepted_args] => 1 ) )
)
When the do_action function is processing a call from a given action event
[ in this case do_action( ‘plugins_loaded’, ‘...’ ) ], it will
sequentially loop through this array, firing the first action function in
the first array element then proceeding to the next. A given array element
can have more than one added action function. This happens when the same
priority is set in the add_action call. In fact, you can see that the
third array element is the only one that does not have more than one
action function.
The reason that the bp_setup_nav hook does not work for any BP-dependent
plugins can be discovered by looking at the fifth element in the
plugins_loaded array (the one with a key of “10”).
All BuddyPress plugins now have a means of activating only if and when
BuddyPress is active by hooking into the bp_init action event. The
function that contains that hook is bp_loaded found on line 65 of the
trunk version bp-loader.php. This function is hooked to the plugins_loaded
event.
Once again, look at the fifth element in the plugins_loaded array. You
will find the reference to the added action function bp_loaded. Now, look
at where the reference to the added action function bp_setup_nav is
located. It is the very first subarray element in the fifth element in the
plugins_loaded array.
What does this mean? It means that the bp_setup_nav action function will
fire before the bp_loaded action function fires. Since the bp_setup_nav
action function contains the bp_setup_nav hook, it means that that hook
will be finished firing before the bp_init hook is fired. Which means it
gets fired before any BP-dependent plugins have been initialized.
In this case, it is useless for BP-dependent plugins to attempt to hook
into the bp_setup_nav action event. By the time they are active, it is
already too late.
Possible Fixes:
* Change the priority to 11 or higher
* Hook the bp_setup_nav function to the bp_init action event instead
* Create a separate, new action event exclusively for hooking these five
action functions
Although it is possible to fix each of the five BuddyPress action hooks by
simply adding a priority lower than 10 to the plugins_loaded action event,
I suggest hooking these action functions to the bp_init action event
instead. It makes more sense to base the triggering of theses five action
events on the bp-load action event. This is what has been done in the
patch file(s). However, even with that change, the priority for each added
action function will still need to be set to lower than 10 to allow for
all dependent plugins to load before the action events are triggered.
--
Ticket URL: <http://trac.buddypress.org/ticket/2325>
BuddyPress <http://buddypress.org/>
BuddyPress
More information about the buddypress-trac
mailing list