I got this image from one E-book for WP plugin development. Could you please clarify me why the Plugins are loaded before Pluggables.
2 Answers
Directly from source for pluggable.php
:
<?php
/**
* These functions can be replaced via plugins. If plugins do not redefine these
* functions, then these will be used instead.
*
* @package WordPress
*/
?>
So, there's your answer, the functions in pluggable.php
are intended to be overridden by Plugins.
Re: load order:
See this post by Konstantin Kovshenin. The relevant points (10-15):
wp_get_active_and_valid_plugins()
retrieves the list of all active plugin files for loading and includes them. This is the point where your plugin code gets executed, functions, classes defined, etc.- Includes
wp-includes/wp-pluggable.php
andwp-includes/wp-pluggable-deprecated.php
which include functions (and deprecated functions) that can be redefined by plugins. Likewp_mail()
for more advanced mailing,wp_authenticate()
for alternative authentication methods, etc.wp_set_internal_encoding()
is called to set the internal encoding according to the blog_charset option.wp_cache_postload()
is called if object caching is enabled.- At this point a
plugins_loaded
action is fired. This is the very first action (after muplugins_loaded fired before loading the non-multi-site WordPress plugins) that you can hook into, it comes before the init because WordPress has not been initialized yet, at least not fully.
So, simplified:
- Plugins are loaded
pluggable.php
is loadedplugins_loaded
action is fired
Which is the expected order.
(Note: this all takes place in wp-settings.php
.)
-
The doubt is, as you said if the functions of pluggable.php is overridden by plugin means the pluggable.php should have been loaded prior to plugins. But the Diagram link shows in reverse order. Commented Jan 17, 2012 at 16:48
-
The order takes place as expected. See updated answer. Commented Jan 17, 2012 at 17:12
-
Each function definition in
pluggables
is preceded with anif(!function_exists('{function name}') {
check. WordPress checks to see if you've manually defined any of these functions in your own plugins before defining them on its own.– EAMannCommented Jan 17, 2012 at 17:32 -
@EAMann Thank you EAMann, Now I'm very clear about my question now that, example, if the plugin defines the function
wp_set_current_user
, then in pluggable.php,wp_set_current_user
won't be defined asif ( !function_exists('wp_set_current_user') ) :
, Am I right ? Commented Jan 17, 2012 at 17:48 -
You are right. If you define the function in your own plugin, WordPress will use your version instead of the one in
pluggables.php
.– EAMannCommented Jan 17, 2012 at 18:29
Don't use pluggable functions!
Please note that you can never be sure, that a later plugin doesn't override your pluggable! I wrote on wp-hackers mailing list about this some time ago.
There's also another thread on wp-hackers that talks about that there's no fallback implemented. Please also read the related trac ticket.