WordPress.org

Ready to get started?Download WordPress

Forums

[resolved] How to change plugins load order? (11 posts)

  1. gesman
    Member
    Posted 4 years ago #

    Anyone knows whether it is possible to manage plugins load order?

    My plugin protects digital content but then another RSS plugin attaches plain link after my the_content() filter defeating the purpose.

    I'd love to have RSS plugin to get loaded first and mine last.

    Gleb

  2. kperrone
    Member
    Posted 4 years ago #

    Looked around and I don't think there is a way to do this. If it defeats the purpose then why have both of them anyway? Do you absolutely need the protection plugins?

  3. neojoda
    Member
    Posted 4 years ago #

    Change the name of plugin to zzz_myplugin.php

    XD

  4. jsdalton
    Member
    Posted 4 years ago #

    I looked into this issue a few months ago, and at the time I recall believing it was not possible. Something might have changed in a recent WP version, because it's now quite possible.

    The order that plugins are loaded (as of WP 2.9.1 at least) is determined by the order of an array stored as "active_plugins" in the WP options table. Whenever a plugin is activated, it is added to this array, the array is sorted alphabetically by plugin name, and the array is saved to the DB.

    Fortunately, there is a convenient action hook, "activated_plugins", that is called after the active plugins array is saved to the DB. This allows you to manipulate the order of the plugins stored in this array after the array is initially saved.

    Here for example, is a function I wrote that ensures a given plugin is loaded first:

    function this_plugin_first() {
    	// ensure path to this file is via main wp plugin path
    	$wp_path_to_this_file = preg_replace('/(.*)plugins\/(.*)$/', WP_PLUGIN_DIR."/$2", __FILE__);
    	$this_plugin = plugin_basename(trim($wp_path_to_this_file));
    	$active_plugins = get_option('active_plugins');
    	$this_plugin_key = array_search($this_plugin, $active_plugins);
    	if ($this_plugin_key) { // if it's 0 it's the first plugin already, no need to continue
    		array_splice($active_plugins, $this_plugin_key, 1);
    		array_unshift($active_plugins, $this_plugin);
    		update_option('active_plugins', $active_plugins);
    	}
    }
    add_action("activated_plugin", "this_plugin_first");

    Place this in the main file for your plugin, and it will load first. Note that you have to activate a plugin (any plugin) for this function to execute.

    You can manipulate the active plugin array anyway you like (e.g. if you wished to load a different plugin first as the original poster does) provided you save your changes at the end via update_plugin().

  5. Byron
    Member
    Posted 3 years ago #

    Hi JSDalton,

    Very helpful, thanks!!!

    BB

  6. architela
    Member
    Posted 3 years ago #

    Hi there. Is there a way to alter this code to make a plugin load last? I have one that hangs the site before the sidebar loads. I don't want to delete it -- just de-prioritize it. Thanks.

  7. Mark / t31os
    Moderator
    Posted 3 years ago #

    If two plugins run a filter/action on any given hook, that given filter or action will be given a priority, default is 10 if i remember correctly, if one filter needs to run first, the only modification you need do is set a higher priority for the filter or action that should run last, and a lower value to run first..

    0 - highest priority
    10 - default
    n - Any numeric value

    http://codex.wordpress.org/Function_Reference/add_action
    http://codex.wordpress.org/Function_Reference/add_filter

    Third argument sets the priority of the filter or action.

    To clarify, each plugin will have various or maybe just one action or filter hook, they look a little something like this..

    add_action( 'hook_name', 'callback_name' ); // Default third value of 10
    ..or..
    add_action( 'hook_name', 'callback_name', 100 );
    ..or..
    add_filter( 'hook_name', 'callback_name' ); // Default third value of 10
    ..or..
    add_filter( 'hook_name', 'callback_name', 100 );

    Hook name represents the WordPress action or filter hook name, and the callback name represents the name of a function being hooked onto the given hook.

    Some actions/filters will not declare a priority (the third parameter - a numeric value), in which case it is given a default value of 10.

    If one plugin needs to run on a given hook before another it must have a higher priority then the other.. (example data follows)

    Imagine these two lines were taken from files of two different plugins.

    add_action( 'the_content', 'example_function' );
    add_action( 'the_content', 'another_function' );

    Without setting a priority WordPress will simply give them both a priority of 10.

    If we wanted to ensure that another_function runs first we'd modify those two lines to something like..

    add_action( 'the_content', 'another_function', 100 );

    and

    add_action( 'the_content', 'example_function', 300 );

    This way the plugin that contains the another_function would run first, and the plugin with example_function would run later ..

    Hope that helps clarify..

  8. architela
    Member
    Posted 3 years ago #

    OK. Thanks.

  9. christonphero
    Member
    Posted 3 years ago #

    Hey! This seems to be the only post on the internet on this subject. I'm not a professional coder by any means, I learn what I have to for the jobs I need to get done.

    I'm currently running two plugins. One is Inline PHP, and the other is a little plugin that switches specified text.

    In a perfect world: I write "CODE". Then, the plugin turns "CODE" into "[exec] php_code_goes(here) [/exec]". And, then Inline PHP sees that code, and runs the command specified.

    My client doesn't want to have to worry about (or see) a bunch of code in the posts. However, it is necessary to have the code exist somewhere.f

    But, although this is all fine-and-dandy in theory, this doesn't work because Inline PHP runs before the text is converted to code. So nothing happens at all.
    I've tried the above solution, but I can't get it to work at all. Any advice?
    Thanks!

  10. inficone
    Member
    Posted 3 years ago #

    I was facing the same problem i.e how to speciy the order in which plugin output would appear just below each wordpress single post. I was able to resolve the same using the add_filter priority field.

  11. Fking
    Member
    Posted 3 years ago #

    and what if your theme uses this code right after the post end:
    <?php the_content('Read the rest of this entry »');

    ?></div>
    //post end
    <?php
    if($topAd['inpostad2'] != '' && !$custom_fields['_mcf_postDisableInPostAd'][0]) {
    echo '<div id="socratesinpostadbottom" style="clear: both; display: block;">'.stripslashes($topAd['inpostad2']).'</div>

    ';
    }
    ?>

    to show ads, which are supposed to be right after the post, but in my case 3 other plugins are above them.
    How i can prioritize not a plugin but those lines to show the ads first?

Topic Closed

This topic has been closed to new replies.

About this Topic