Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I change action priority in Wordpress?

Tags:

php

wordpress

I'm using the Thematic framework for a child theme. It has a number of hooks, but I'm looking at thematic_header() in particular. The thematic_header() hook adds the following actions (through add_action):

<?php
  add_action('thematic_header', 'thematic_brandingopen', 1);
  add_action('thematic_header', 'thematic_blogtitle', 3);
  add_action('thematic_header', 'thematic_blogdescription', 5);
  add_action('thematic_header', 'thematic_brandingclose', 7);
  add_action('thematic_header', 'thematic_access', 9);
?>

The content of the actions is irrelevant.

My question is this: How can I change the priorities of the five actions in question. For instance, I want thematic_access() to load before thematic_brandingopen(). Only way to do this that I've been able to figure out is by removing and re-adding the actions, ala:

<?php
  function remove_thematic_actions() {
    remove_action('thematic_header', 'thematic_access');
    add_action('thematic_header', 'thematic_access', 0); //puts it above thematic_brandingopen
  } 
  add_action ('init', 'remove_thematic_actions');

That seems like a stupid way of accomplishing something very simple. Is there a way to access and sort/reorder whatever data structure stores actions in WP?

like image 257
eldarshamukhamedov Avatar asked Sep 22 '12 01:09

eldarshamukhamedov


3 Answers

From WordPress

if a hook was registered using a priority other than the default of 10, then you must also specify the priority in the call to remove_action().

So I think you can first remove using following

remove_action('thematic_header', 'thematic_brandingopen', 1);
remove_action('thematic_header', 'thematic_access', 9);

and the add again using different priority

add_action('thematic_header', 'thematic_access', 1);
add_action('thematic_header', 'thematic_brandingopen', 2);
like image 128
The Alpha Avatar answered Oct 20 '22 03:10

The Alpha


not to self-promote but I have done some work on this to provide a non-coding solution through a WordPress plugin called Prioritize Hooks. My plugin lets you set the priorities of various registered hooks through a UI and does the overriding in runtime so the code isn't modified.

like image 38
Jonathan Weatherhead Avatar answered Oct 20 '22 03:10

Jonathan Weatherhead


Just in case this helps someone, the variable actions are stored in is

global $wp_filter;
var_dump( $wp_filter[$hook_name] );

Which is an array of arrays with the keys being the priority when the action was added.

like image 33
lukenofurther Avatar answered Oct 20 '22 02:10

lukenofurther