wp/wp-includes/plugin.php
author ymh <ymh.work@gmail.com>
Wed, 06 Nov 2013 03:21:17 +0000
changeset 0 d970ebf37754
child 5 5e2f62d02dcd
permissions -rw-r--r--
first import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * The plugin API is located in this file, which allows for creating actions
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * and filters and hooking functions, and methods. The functions or methods will
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * then be run when the action or filter is called.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * The API callback examples reference functions, but can be methods of classes.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * To hook methods, you'll need to pass an array one of two ways.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 * Any of the syntaxes explained in the PHP documentation for the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
 * {@link http://us2.php.net/manual/en/language.pseudo-types.php#language.types.callback 'callback'}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
 * type are valid.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 * Also see the {@link http://codex.wordpress.org/Plugin_API Plugin API} for
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * more information and examples on how to use a lot of these functions.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 * @since 1.5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
// Initialize the filter globals.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
if ( ! isset( $wp_filter ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
	$wp_filter = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
if ( ! isset( $wp_actions ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
	$wp_actions = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
if ( ! isset( $merged_filters ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
	$merged_filters = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
if ( ! isset( $wp_current_filter ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
	$wp_current_filter = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
 * Hooks a function or method to a specific filter action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
 * WordPress offers filter hooks to allow plugins to modify
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
 * various types of internal data at runtime.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
 * A plugin can modify data by binding a callback to a filter hook. When the filter
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
 * is later applied, each bound callback is run in order of priority, and given
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
 * the opportunity to modify a value by returning a new value.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
 * The following example shows how a callback function is bound to a filter hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
 * Note that $example is passed to the callback, (maybe) modified, then returned:
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
 * <code>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
 * function example_callback( $example ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
 * 	// Maybe modify $example in some way
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
 * 	return $example;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
 * }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
 * add_filter( 'example_filter', 'example_callback' );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
 * </code>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
 * Since WordPress 1.5.1, bound callbacks can take as many arguments as are
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
 * passed as parameters in the corresponding apply_filters() call. The $accepted_args
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
 * parameter allows for calling functions only when the number of args match.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
 * <strong>Note:</strong> the function will return true whether or not the callback
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
 * is valid. It is up to you to take care. This is done for optimization purposes,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
 * so everything is as quick as possible.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
 * @global array $wp_filter      A multidimensional array of all hooks and the callbacks hooked to them.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
 * @global array $merged_filters Tracks the tags that need to be merged for later. If the hook is added, it doesn't need to run through that process.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
 * @since 0.71
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
 * @param string   $tag             The name of the filter to hook the $function_to_add callback to.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
 * @param callback $function_to_add The callback to be run when the filter is applied.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
 * @param int      $priority        (optional) The order in which the functions associated with a particular action are executed. Lower numbers correspond with earlier execution, and functions with the same priority are executed in the order in which they were added to the action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
 *                                  Default 10.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
 * @param int      $accepted_args   (optional) The number of arguments the function accepts.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
 *                                  Default 1.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
 * @return boolean true
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
function add_filter( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
	global $wp_filter, $merged_filters;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
	$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
	$wp_filter[$tag][$priority][$idx] = array('function' => $function_to_add, 'accepted_args' => $accepted_args);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
	unset( $merged_filters[ $tag ] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
	return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
 * Check if any filter has been registered for a hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
 * @since 2.5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
 * @global array $wp_filter Stores all of the filters
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
 * @param string $tag The name of the filter hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
 * @param callback $function_to_check optional.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
 * @return mixed If $function_to_check is omitted, returns boolean for whether the hook has anything registered.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
 * 	When checking a specific function, the priority of that hook is returned, or false if the function is not attached.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
 * 	When using the $function_to_check argument, this function may return a non-boolean value that evaluates to false
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
 * 	(e.g.) 0, so use the === operator for testing the return value.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
function has_filter($tag, $function_to_check = false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
	global $wp_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
	$has = !empty($wp_filter[$tag]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
	if ( false === $function_to_check || false == $has )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
		return $has;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
	if ( !$idx = _wp_filter_build_unique_id($tag, $function_to_check, false) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
		return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
	foreach ( (array) array_keys($wp_filter[$tag]) as $priority ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
		if ( isset($wp_filter[$tag][$priority][$idx]) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
			return $priority;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
	return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
 * Call the functions added to a filter hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
 * The callback functions attached to filter hook $tag are invoked by calling
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
 * this function. This function can be used to create a new filter hook by
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
 * simply calling this function with the name of the new hook specified using
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
 * the $tag parameter.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
 * The function allows for additional arguments to be added and passed to hooks.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
 * <code>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
 * // Our filter callback function
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
 * function example_callback( $string, $arg1, $arg2 ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
 *	// (maybe) modify $string
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
 *	return $string;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
 * }
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
 * add_filter( 'example_filter', 'example_callback', 10, 3 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
 * // Apply the filters by calling the 'example_callback' function we
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
 * // "hooked" to 'example_filter' using the add_filter() function above.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
 * // - 'example_filter' is the filter hook $tag
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
 * // - 'filter me' is the value being filtered
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
 * // - $arg1 and $arg2 are the additional arguments passed to the callback.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
 * $value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
 * </code>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
 * @global array $wp_filter         Stores all of the filters
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
 * @global array $merged_filters    Merges the filter hooks using this function.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
 * @global array $wp_current_filter stores the list of current filters with the current one last
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
 * @since 0.71
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
 * @param string $tag  The name of the filter hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
 * @param mixed $value The value on which the filters hooked to <tt>$tag</tt> are applied on.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
 * @param mixed $var   Additional variables passed to the functions hooked to <tt>$tag</tt>.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
 * @return mixed The filtered value after all hooked functions are applied to it.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
function apply_filters( $tag, $value ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
	global $wp_filter, $merged_filters, $wp_current_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
	$args = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
	// Do 'all' actions first
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
	if ( isset($wp_filter['all']) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
		$wp_current_filter[] = $tag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
		$args = func_get_args();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
		_wp_call_all_hook($args);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
	if ( !isset($wp_filter[$tag]) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
		if ( isset($wp_filter['all']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
			array_pop($wp_current_filter);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
		return $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
	if ( !isset($wp_filter['all']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
		$wp_current_filter[] = $tag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
	// Sort
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
	if ( !isset( $merged_filters[ $tag ] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
		ksort($wp_filter[$tag]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
		$merged_filters[ $tag ] = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
	reset( $wp_filter[ $tag ] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
	if ( empty($args) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
		$args = func_get_args();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
	do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
		foreach( (array) current($wp_filter[$tag]) as $the_ )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
			if ( !is_null($the_['function']) ){
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
				$args[1] = $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
				$value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
	} while ( next($wp_filter[$tag]) !== false );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
	array_pop( $wp_current_filter );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
	return $value;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
 * Execute functions hooked on a specific filter hook, specifying arguments in an array.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
 * @see apply_filters() This function is identical, but the arguments passed to the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
 * functions hooked to <tt>$tag</tt> are supplied using an array.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
 * @since 3.0.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
 * @global array $wp_filter Stores all of the filters
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
 * @global array $merged_filters Merges the filter hooks using this function.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
 * @global array $wp_current_filter stores the list of current filters with the current one last
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
 * @param string $tag The name of the filter hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
 * @param array $args The arguments supplied to the functions hooked to <tt>$tag</tt>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
 * @return mixed The filtered value after all hooked functions are applied to it.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
function apply_filters_ref_array($tag, $args) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
	global $wp_filter, $merged_filters, $wp_current_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
	// Do 'all' actions first
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
	if ( isset($wp_filter['all']) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
		$wp_current_filter[] = $tag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
		$all_args = func_get_args();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
		_wp_call_all_hook($all_args);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
	if ( !isset($wp_filter[$tag]) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
		if ( isset($wp_filter['all']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
			array_pop($wp_current_filter);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
		return $args[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
	if ( !isset($wp_filter['all']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
		$wp_current_filter[] = $tag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
	// Sort
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
	if ( !isset( $merged_filters[ $tag ] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
		ksort($wp_filter[$tag]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
		$merged_filters[ $tag ] = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
	reset( $wp_filter[ $tag ] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
	do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
		foreach( (array) current($wp_filter[$tag]) as $the_ )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
			if ( !is_null($the_['function']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
				$args[0] = call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
	} while ( next($wp_filter[$tag]) !== false );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
	array_pop( $wp_current_filter );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
	return $args[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
 * Removes a function from a specified filter hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
 * This function removes a function attached to a specified filter hook. This
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
 * method can be used to remove default functions attached to a specific filter
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
 * hook and possibly replace them with a substitute.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
 * To remove a hook, the $function_to_remove and $priority arguments must match
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
 * when the hook was added. This goes for both filters and actions. No warning
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
 * will be given on removal failure.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
 * @since 1.2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
 * @param string $tag The filter hook to which the function to be removed is hooked.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
 * @param callback $function_to_remove The name of the function which should be removed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
 * @param int $priority optional. The priority of the function (default: 10).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
 * @param int $accepted_args optional. The number of arguments the function accepts (default: 1).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
 * @return boolean Whether the function existed before it was removed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
function remove_filter( $tag, $function_to_remove, $priority = 10 ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
	$function_to_remove = _wp_filter_build_unique_id($tag, $function_to_remove, $priority);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
	$r = isset($GLOBALS['wp_filter'][$tag][$priority][$function_to_remove]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
	if ( true === $r) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
		unset($GLOBALS['wp_filter'][$tag][$priority][$function_to_remove]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
		if ( empty($GLOBALS['wp_filter'][$tag][$priority]) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
			unset($GLOBALS['wp_filter'][$tag][$priority]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
		unset($GLOBALS['merged_filters'][$tag]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
	return $r;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
 * Remove all of the hooks from a filter.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
 * @since 2.7
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
 * @param string $tag The filter to remove hooks from.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
 * @param int $priority The priority number to remove.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
 * @return bool True when finished.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
function remove_all_filters($tag, $priority = false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
	global $wp_filter, $merged_filters;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
	if( isset($wp_filter[$tag]) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
		if( false !== $priority && isset($wp_filter[$tag][$priority]) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
			unset($wp_filter[$tag][$priority]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
		else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
			unset($wp_filter[$tag]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
	if( isset($merged_filters[$tag]) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
		unset($merged_filters[$tag]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
	return true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
 * Retrieve the name of the current filter or action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
 * @since 2.5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
 * @return string Hook name of the current filter or action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
function current_filter() {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
	global $wp_current_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
	return end( $wp_current_filter );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
 * Hooks a function on to a specific action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
 * Actions are the hooks that the WordPress core launches at specific points
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
 * during execution, or when specific events occur. Plugins can specify that
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
 * one or more of its PHP functions are executed at these points, using the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
 * Action API.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
 * @uses add_filter() Adds an action. Parameter list and functionality are the same.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
 * @since 1.2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
 * @param string $tag The name of the action to which the $function_to_add is hooked.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
 * @param callback $function_to_add The name of the function you wish to be called.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
 * @param int $priority optional. Used to specify the order in which the functions associated with a particular action are executed (default: 10). Lower numbers correspond with earlier execution, and functions with the same priority are executed in the order in which they were added to the action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
 * @param int $accepted_args optional. The number of arguments the function accept (default 1).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
	return add_filter($tag, $function_to_add, $priority, $accepted_args);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
 * Execute functions hooked on a specific action hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
 * This function invokes all functions attached to action hook $tag. It is
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
 * possible to create new action hooks by simply calling this function,
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
 * specifying the name of the new hook using the <tt>$tag</tt> parameter.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
 * You can pass extra arguments to the hooks, much like you can with
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
 * apply_filters().
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
 * @see apply_filters() This function works similar with the exception that
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
 * nothing is returned and only the functions or methods are called.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
 * @since 1.2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
 * @global array $wp_filter Stores all of the filters
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
 * @global array $wp_actions Increments the amount of times action was triggered.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
 * @param string $tag The name of the action to be executed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
 * @param mixed $arg,... Optional additional arguments which are passed on to the functions hooked to the action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
 * @return null Will return null if $tag does not exist in $wp_filter array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
function do_action($tag, $arg = '') {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
	global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
	if ( ! isset($wp_actions[$tag]) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
		$wp_actions[$tag] = 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
	else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
		++$wp_actions[$tag];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
	// Do 'all' actions first
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
	if ( isset($wp_filter['all']) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
		$wp_current_filter[] = $tag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
		$all_args = func_get_args();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
		_wp_call_all_hook($all_args);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
	if ( !isset($wp_filter[$tag]) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
		if ( isset($wp_filter['all']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
			array_pop($wp_current_filter);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
		return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
	if ( !isset($wp_filter['all']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
		$wp_current_filter[] = $tag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
	$args = array();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
	if ( is_array($arg) && 1 == count($arg) && isset($arg[0]) && is_object($arg[0]) ) // array(&$this)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
		$args[] =& $arg[0];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
	else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
		$args[] = $arg;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
	for ( $a = 2; $a < func_num_args(); $a++ )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
		$args[] = func_get_arg($a);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
	// Sort
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
	if ( !isset( $merged_filters[ $tag ] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
		ksort($wp_filter[$tag]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
		$merged_filters[ $tag ] = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
	reset( $wp_filter[ $tag ] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
	do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
		foreach ( (array) current($wp_filter[$tag]) as $the_ )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
			if ( !is_null($the_['function']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
				call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
	} while ( next($wp_filter[$tag]) !== false );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
	array_pop($wp_current_filter);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
 * Retrieve the number of times an action is fired.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
 * @since 2.1
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
 * @global array $wp_actions Increments the amount of times action was triggered.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
 * @param string $tag The name of the action hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
 * @return int The number of times action hook <tt>$tag</tt> is fired
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
function did_action($tag) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
	global $wp_actions;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
	if ( ! isset( $wp_actions[ $tag ] ) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
		return 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
	return $wp_actions[$tag];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
 * Execute functions hooked on a specific action hook, specifying arguments in an array.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
 * @see do_action() This function is identical, but the arguments passed to the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
 * functions hooked to <tt>$tag</tt> are supplied using an array.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
 * @since 2.1
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
 * @global array $wp_filter Stores all of the filters
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
 * @global array $wp_actions Increments the amount of times action was triggered.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
 * @param string $tag The name of the action to be executed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
 * @param array $args The arguments supplied to the functions hooked to <tt>$tag</tt>
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
 * @return null Will return null if $tag does not exist in $wp_filter array
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
function do_action_ref_array($tag, $args) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
	global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
	if ( ! isset($wp_actions[$tag]) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
		$wp_actions[$tag] = 1;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
	else
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
		++$wp_actions[$tag];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
	// Do 'all' actions first
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
	if ( isset($wp_filter['all']) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
		$wp_current_filter[] = $tag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
		$all_args = func_get_args();
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
		_wp_call_all_hook($all_args);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
	if ( !isset($wp_filter[$tag]) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
		if ( isset($wp_filter['all']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
			array_pop($wp_current_filter);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
		return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
	if ( !isset($wp_filter['all']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
		$wp_current_filter[] = $tag;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
	// Sort
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
	if ( !isset( $merged_filters[ $tag ] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
		ksort($wp_filter[$tag]);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
		$merged_filters[ $tag ] = true;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
	reset( $wp_filter[ $tag ] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
	do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
		foreach( (array) current($wp_filter[$tag]) as $the_ )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
			if ( !is_null($the_['function']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
				call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
	} while ( next($wp_filter[$tag]) !== false );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
	array_pop($wp_current_filter);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
 * Check if any action has been registered for a hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
 * @since 2.5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
 * @see has_filter() has_action() is an alias of has_filter().
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
 * @param string $tag The name of the action hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
 * @param callback $function_to_check optional.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
 * @return mixed If $function_to_check is omitted, returns boolean for whether the hook has anything registered.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
 * 	When checking a specific function, the priority of that hook is returned, or false if the function is not attached.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
 * 	When using the $function_to_check argument, this function may return a non-boolean value that evaluates to false
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
 * 	(e.g.) 0, so use the === operator for testing the return value.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
function has_action($tag, $function_to_check = false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
	return has_filter($tag, $function_to_check);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
 * Removes a function from a specified action hook.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
 * This function removes a function attached to a specified action hook. This
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
 * method can be used to remove default functions attached to a specific filter
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
 * hook and possibly replace them with a substitute.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
 * @since 1.2
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
 * @param string $tag The action hook to which the function to be removed is hooked.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
 * @param callback $function_to_remove The name of the function which should be removed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
 * @param int $priority optional The priority of the function (default: 10).
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
 * @return boolean Whether the function is removed.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
function remove_action( $tag, $function_to_remove, $priority = 10 ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
	return remove_filter( $tag, $function_to_remove, $priority );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
 * Remove all of the hooks from an action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
 * @since 2.7
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
 * @param string $tag The action to remove hooks from.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
 * @param int $priority The priority number to remove them from.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
 * @return bool True when finished.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
function remove_all_actions($tag, $priority = false) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
	return remove_all_filters($tag, $priority);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
//
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
// Functions for handling plugins.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
//
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
 * Gets the basename of a plugin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
 * This method extracts the name of a plugin from its filename.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
 * @since 1.5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
 * @access private
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
 * @param string $file The filename of plugin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
 * @return string The name of a plugin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
 * @uses WP_PLUGIN_DIR
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
function plugin_basename($file) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
	$file = str_replace('\\','/',$file); // sanitize for Win32 installs
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
	$file = preg_replace('|/+|','/', $file); // remove any duplicate slash
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
	$plugin_dir = str_replace('\\','/',WP_PLUGIN_DIR); // sanitize for Win32 installs
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
	$plugin_dir = preg_replace('|/+|','/', $plugin_dir); // remove any duplicate slash
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
	$mu_plugin_dir = str_replace('\\','/',WPMU_PLUGIN_DIR); // sanitize for Win32 installs
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
	$mu_plugin_dir = preg_replace('|/+|','/', $mu_plugin_dir); // remove any duplicate slash
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
	$file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#','',$file); // get relative path from plugins dir
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
	$file = trim($file, '/');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
	return $file;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
 * Gets the filesystem directory path (with trailing slash) for the plugin __FILE__ passed in
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
 * @since 2.8
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
 * @param string $file The filename of the plugin (__FILE__)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
 * @return string the filesystem path of the directory that contains the plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
function plugin_dir_path( $file ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
	return trailingslashit( dirname( $file ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
 * Gets the URL directory path (with trailing slash) for the plugin __FILE__ passed in
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
 * @since 2.8
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
 * @param string $file The filename of the plugin (__FILE__)
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
 * @return string the URL path of the directory that contains the plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
function plugin_dir_url( $file ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
	return trailingslashit( plugins_url( '', $file ) );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
 * Set the activation hook for a plugin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
 * When a plugin is activated, the action 'activate_PLUGINNAME' hook is
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
 * called. In the name of this hook, PLUGINNAME is replaced with the name
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
 * of the plugin, including the optional subdirectory. For example, when the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
 * plugin is located in wp-content/plugins/sampleplugin/sample.php, then
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
 * the name of this hook will become 'activate_sampleplugin/sample.php'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
 * When the plugin consists of only one file and is (as by default) located at
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
 * wp-content/plugins/sample.php the name of this hook will be
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
 * 'activate_sample.php'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
 * @since 2.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
 * @param string $file The filename of the plugin including the path.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
 * @param callback $function the function hooked to the 'activate_PLUGIN' action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
function register_activation_hook($file, $function) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
	$file = plugin_basename($file);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
	add_action('activate_' . $file, $function);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
 * Set the deactivation hook for a plugin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
 * When a plugin is deactivated, the action 'deactivate_PLUGINNAME' hook is
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
 * called. In the name of this hook, PLUGINNAME is replaced with the name
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
 * of the plugin, including the optional subdirectory. For example, when the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
 * plugin is located in wp-content/plugins/sampleplugin/sample.php, then
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
 * the name of this hook will become 'deactivate_sampleplugin/sample.php'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
 * When the plugin consists of only one file and is (as by default) located at
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
 * wp-content/plugins/sample.php the name of this hook will be
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
 * 'deactivate_sample.php'.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
 * @since 2.0
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
 * @param string $file The filename of the plugin including the path.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
 * @param callback $function the function hooked to the 'deactivate_PLUGIN' action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
function register_deactivation_hook($file, $function) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
	$file = plugin_basename($file);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
	add_action('deactivate_' . $file, $function);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
 * Set the uninstallation hook for a plugin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
 * Registers the uninstall hook that will be called when the user clicks on the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
 * uninstall link that calls for the plugin to uninstall itself. The link won't
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
 * be active unless the plugin hooks into the action.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
 * The plugin should not run arbitrary code outside of functions, when
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
 * registering the uninstall hook. In order to run using the hook, the plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
 * will have to be included, which means that any code laying outside of a
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
 * function will be run during the uninstall process. The plugin should not
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
 * hinder the uninstall process.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
 * If the plugin can not be written without running code within the plugin, then
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
 * the plugin should create a file named 'uninstall.php' in the base plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
 * folder. This file will be called, if it exists, during the uninstall process
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
 * bypassing the uninstall hook. The plugin, when using the 'uninstall.php'
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
 * should always check for the 'WP_UNINSTALL_PLUGIN' constant, before
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
 * executing.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
 * @since 2.7
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
 * @param string $file
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
 * @param callback $callback The callback to run when the hook is called. Must be a static method or function.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
function register_uninstall_hook( $file, $callback ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
	if ( is_array( $callback ) && is_object( $callback[0] ) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
		_doing_it_wrong( __FUNCTION__, __( 'Only a static class method or function can be used in an uninstall hook.' ), '3.1' );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
		return;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
	// The option should not be autoloaded, because it is not needed in most
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
	// cases. Emphasis should be put on using the 'uninstall.php' way of
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
	// uninstalling the plugin.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
	$uninstallable_plugins = (array) get_option('uninstall_plugins');
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
	$uninstallable_plugins[plugin_basename($file)] = $callback;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
	update_option('uninstall_plugins', $uninstallable_plugins);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
 * Calls the 'all' hook, which will process the functions hooked into it.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
 * The 'all' hook passes all of the arguments or parameters that were used for
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
 * the hook, which this function was called for.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
 * This function is used internally for apply_filters(), do_action(), and
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
 * do_action_ref_array() and is not meant to be used from outside those
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
 * functions. This function does not check for the existence of the all hook, so
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
 * it will fail unless the all hook exists prior to this function call.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
 * @since 2.5
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
 * @access private
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
 * @uses $wp_filter Used to process all of the functions in the 'all' hook
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
 * @param array $args The collected parameters from the hook that was called.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
function _wp_call_all_hook($args) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
	global $wp_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
	reset( $wp_filter['all'] );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
	do {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
		foreach( (array) current($wp_filter['all']) as $the_ )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
			if ( !is_null($the_['function']) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
				call_user_func_array($the_['function'], $args);
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
	} while ( next($wp_filter['all']) !== false );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
/**
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
 * Build Unique ID for storage and retrieval.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
 * The old way to serialize the callback caused issues and this function is the
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
 * solution. It works by checking for objects and creating an a new property in
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
 * the class to keep track of the object and new objects of the same class that
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
 * need to be added.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
 * It also allows for the removal of actions and filters for objects after they
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
 * change class properties. It is possible to include the property $wp_filter_id
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
 * in your class and set it to "null" or a number to bypass the workaround.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
 * However this will prevent you from adding new classes and any new classes
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
 * will overwrite the previous hook by the same class.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
 * Functions and static method callbacks are just returned as strings and
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
 * shouldn't have any speed penalty.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
 * @package WordPress
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
 * @subpackage Plugin
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
 * @access private
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
 * @since 2.2.3
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
 * @link http://trac.wordpress.org/ticket/3875
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
 *
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
 * @global array $wp_filter Storage for all of the filters and actions
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
 * @param string $tag Used in counting how many hooks were applied
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
 * @param callback $function Used for creating unique id
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
 * @param int|bool $priority Used in counting how many hooks were applied. If === false and $function is an object reference, we return the unique id only if it already has one, false otherwise.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
 * @return string|bool Unique ID for usage as array key or false if $priority === false and $function is an object reference, and it does not already have a unique id.
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
 */
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
function _wp_filter_build_unique_id($tag, $function, $priority) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
	global $wp_filter;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
	static $filter_id_count = 0;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
	if ( is_string($function) )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
		return $function;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
	if ( is_object($function) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
		// Closures are currently implemented as objects
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
		$function = array( $function, '' );
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
	} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
		$function = (array) $function;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
	if (is_object($function[0]) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
		// Object Class Calling
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
		if ( function_exists('spl_object_hash') ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
			return spl_object_hash($function[0]) . $function[1];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
		} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
			$obj_idx = get_class($function[0]).$function[1];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
			if ( !isset($function[0]->wp_filter_id) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
				if ( false === $priority )
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
					return false;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
				$obj_idx .= isset($wp_filter[$tag][$priority]) ? count((array)$wp_filter[$tag][$priority]) : $filter_id_count;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
				$function[0]->wp_filter_id = $filter_id_count;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
				++$filter_id_count;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
			} else {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
				$obj_idx .= $function[0]->wp_filter_id;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
			}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
			return $obj_idx;
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
		}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
	} else if ( is_string($function[0]) ) {
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
		// Static Calling
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
		return $function[0] . '::' . $function[1];
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
	}
d970ebf37754 first import
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
}