| [ Index ] |
PHP Cross Reference of Wordpress 2.7.1 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * The plugin API is located in this file, which allows for creating actions 4 * and filters and hooking functions, and methods. The functions or methods will 5 * then be run when the action or filter is called. 6 * 7 * The API callback examples reference functions, but can be methods of classes. 8 * To hook methods, you'll need to pass an array one of two ways. 9 * 10 * Any of the syntaxes explained in the PHP documentation for the 11 * {@link http://us2.php.net/manual/en/language.pseudo-types.php#language.types.callback 'callback'} 12 * type are valid. 13 * 14 * Also see the {@link http://codex.wordpress.org/Plugin_API Plugin API} for 15 * more information and examples on how to use a lot of these functions. 16 * 17 * @package WordPress 18 * @subpackage Plugin 19 * @since 1.5 20 */ 21 22 /** 23 * Hooks a function or method to a specific filter action. 24 * 25 * Filters are the hooks that WordPress launches to modify text of various types 26 * before adding it to the database or sending it to the browser screen. Plugins 27 * can specify that one or more of its PHP functions is executed to 28 * modify specific types of text at these times, using the Filter API. 29 * 30 * To use the API, the following code should be used to bind a callback to the 31 * filter. 32 * 33 * <code> 34 * function example_hook($example) { echo $example; } 35 * add_filter('example_filter', 'example_hook'); 36 * </code> 37 * 38 * In WordPress 1.5.1+, hooked functions can take extra arguments that are set 39 * when the matching do_action() or apply_filters() call is run. The 40 * $accepted_args allow for calling functions only when the number of args 41 * match. Hooked functions can take extra arguments that are set when the 42 * matching do_action() or apply_filters() call is run. For example, the action 43 * comment_id_not_found will pass any functions that hook onto it the ID of the 44 * requested comment. 45 * 46 * <strong>Note:</strong> the function will return true no matter if the 47 * function was hooked fails or not. There are no checks for whether the 48 * function exists beforehand and no checks to whether the <tt>$function_to_add 49 * is even a string. It is up to you to take care and this is done for 50 * optimization purposes, so everything is as quick as possible. 51 * 52 * @package WordPress 53 * @subpackage Plugin 54 * @since 0.71 55 * @global array $wp_filter Stores all of the filters added in the form of 56 * wp_filter['tag']['array of priorities']['array of functions serialized']['array of ['array (functions, accepted_args)]'] 57 * @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. 58 * 59 * @param string $tag The name of the filter to hook the $function_to_add to. 60 * @param callback $function_to_add The name of the function to be called when the filter is applied. 61 * @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. 62 * @param int $accepted_args optional. The number of arguments the function accept (default 1). 63 * @return boolean true 64 */ 65 function add_filter($tag, $function_to_add, $priority = 10, $accepted_args = 1) { 66 global $wp_filter, $merged_filters; 67 68 $idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority); 69 $wp_filter[$tag][$priority][$idx] = array('function' => $function_to_add, 'accepted_args' => $accepted_args); 70 unset( $merged_filters[ $tag ] ); 71 return true; 72 } 73 74 /** 75 * Check if any filter has been registered for a hook. 76 * 77 * @package WordPress 78 * @subpackage Plugin 79 * @since 2.5 80 * @global array $wp_filter Stores all of the filters 81 * 82 * @param string $tag The name of the filter hook. 83 * @param callback $function_to_check optional. If specified, return the priority of that function on this hook or false if not attached. 84 * @return int|boolean Optionally returns the priority on that hook for the specified function. 85 */ 86 function has_filter($tag, $function_to_check = false) { 87 global $wp_filter; 88 89 $has = !empty($wp_filter[$tag]); 90 if ( false === $function_to_check || false == $has ) 91 return $has; 92 93 if ( !$idx = _wp_filter_build_unique_id($tag, $function_to_check, false) ) 94 return false; 95 96 foreach ( (array) array_keys($wp_filter[$tag]) as $priority ) { 97 if ( isset($wp_filter[$tag][$priority][$idx]) ) 98 return $priority; 99 } 100 101 return false; 102 } 103 104 /** 105 * Call the functions added to a filter hook. 106 * 107 * The callback functions attached to filter hook $tag are invoked by calling 108 * this function. This function can be used to create a new filter hook by 109 * simply calling this function with the name of the new hook specified using 110 * the $tag parameter. 111 * 112 * The function allows for additional arguments to be added and passed to hooks. 113 * <code> 114 * function example_hook($string, $arg1, $arg2) 115 * { 116 * //Do stuff 117 * return $string; 118 * } 119 * $value = apply_filters('example_filter', 'filter me', 'arg1', 'arg2'); 120 * </code> 121 * 122 * @package WordPress 123 * @subpackage Plugin 124 * @since 0.71 125 * @global array $wp_filter Stores all of the filters 126 * @global array $merged_filters Merges the filter hooks using this function. 127 * @global array $wp_current_filter stores the list of current filters with the current one last 128 * 129 * @param string $tag The name of the filter hook. 130 * @param mixed $value The value on which the filters hooked to <tt>$tag</tt> are applied on. 131 * @param mixed $var,... Additional variables passed to the functions hooked to <tt>$tag</tt>. 132 * @return mixed The filtered value after all hooked functions are applied to it. 133 */ 134 function apply_filters($tag, $value) { 135 global $wp_filter, $merged_filters, $wp_current_filter; 136 137 $args = array(); 138 $wp_current_filter[] = $tag; 139 140 // Do 'all' actions first 141 if ( isset($wp_filter['all']) ) { 142 $args = func_get_args(); 143 _wp_call_all_hook($args); 144 } 145 146 if ( !isset($wp_filter[$tag]) ) { 147 array_pop($wp_current_filter); 148 return $value; 149 } 150 151 // Sort 152 if ( !isset( $merged_filters[ $tag ] ) ) { 153 ksort($wp_filter[$tag]); 154 $merged_filters[ $tag ] = true; 155 } 156 157 reset( $wp_filter[ $tag ] ); 158 159 if ( empty($args) ) 160 $args = func_get_args(); 161 162 do { 163 foreach( (array) current($wp_filter[$tag]) as $the_ ) 164 if ( !is_null($the_['function']) ){ 165 $args[1] = $value; 166 $value = call_user_func_array($the_['function'], array_slice($args, 1, (int) $the_['accepted_args'])); 167 } 168 169 } while ( next($wp_filter[$tag]) !== false ); 170 171 array_pop( $wp_current_filter ); 172 173 return $value; 174 } 175 176 /** 177 * Removes a function from a specified filter hook. 178 * 179 * This function removes a function attached to a specified filter hook. This 180 * method can be used to remove default functions attached to a specific filter 181 * hook and possibly replace them with a substitute. 182 * 183 * To remove a hook, the $function_to_remove and $priority arguments must match 184 * when the hook was added. This goes for both filters and actions. No warning 185 * will be given on removal failure. 186 * 187 * @package WordPress 188 * @subpackage Plugin 189 * @since 1.2 190 * 191 * @param string $tag The filter hook to which the function to be removed is hooked. 192 * @param callback $function_to_remove The name of the function which should be removed. 193 * @param int $priority optional. The priority of the function (default: 10). 194 * @param int $accepted_args optional. The number of arguments the function accpets (default: 1). 195 * @return boolean Whether the function existed before it was removed. 196 */ 197 function remove_filter($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { 198 $function_to_remove = _wp_filter_build_unique_id($tag, $function_to_remove, $priority); 199 200 $r = isset($GLOBALS['wp_filter'][$tag][$priority][$function_to_remove]); 201 202 if ( true === $r) { 203 unset($GLOBALS['wp_filter'][$tag][$priority][$function_to_remove]); 204 if ( empty($GLOBALS['wp_filter'][$tag][$priority]) ) 205 unset($GLOBALS['wp_filter'][$tag][$priority]); 206 unset($GLOBALS['merged_filters'][$tag]); 207 } 208 209 return $r; 210 } 211 212 /** 213 * Remove all of the hooks from a filter. 214 * 215 * @since 2.7 216 * 217 * @param string $tag The filter to remove hooks from. 218 * @param int $priority The priority number to remove. 219 * @return bool True when finished. 220 */ 221 function remove_all_filters($tag, $priority = false) { 222 global $wp_filter, $merged_filters; 223 224 if( isset($wp_filter[$tag]) ) { 225 if( false !== $priority && isset($$wp_filter[$tag][$priority]) ) 226 unset($wp_filter[$tag][$priority]); 227 else 228 unset($wp_filter[$tag]); 229 } 230 231 if( isset($merged_filters[$tag]) ) 232 unset($merged_filters[$tag]); 233 234 return true; 235 } 236 237 /** 238 * Retrieve the name of the current filter or action. 239 * 240 * @package WordPress 241 * @subpackage Plugin 242 * @since 2.5 243 * 244 * @return string Hook name of the current filter or action. 245 */ 246 function current_filter() { 247 global $wp_current_filter; 248 return end( $wp_current_filter ); 249 } 250 251 252 /** 253 * Hooks a function on to a specific action. 254 * 255 * Actions are the hooks that the WordPress core launches at specific points 256 * during execution, or when specific events occur. Plugins can specify that 257 * one or more of its PHP functions are executed at these points, using the 258 * Action API. 259 * 260 * @uses add_filter() Adds an action. Parameter list and functionality are the same. 261 * 262 * @package WordPress 263 * @subpackage Plugin 264 * @since 1.2 265 * 266 * @param string $tag The name of the action to which the $function_to_add is hooked. 267 * @param callback $function_to_add The name of the function you wish to be called. 268 * @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. 269 * @param int $accepted_args optional. The number of arguments the function accept (default 1). 270 */ 271 function add_action($tag, $function_to_add, $priority = 10, $accepted_args = 1) { 272 return add_filter($tag, $function_to_add, $priority, $accepted_args); 273 } 274 275 276 /** 277 * Execute functions hooked on a specific action hook. 278 * 279 * This function invokes all functions attached to action hook $tag. It is 280 * possible to create new action hooks by simply calling this function, 281 * specifying the name of the new hook using the <tt>$tag</tt> parameter. 282 * 283 * You can pass extra arguments to the hooks, much like you can with 284 * apply_filters(). 285 * 286 * @see apply_filters() This function works similar with the exception that 287 * nothing is returned and only the functions or methods are called. 288 * 289 * @package WordPress 290 * @subpackage Plugin 291 * @since 1.2 292 * @global array $wp_filter Stores all of the filters 293 * @global array $wp_actions Increments the amount of times action was triggered. 294 * 295 * @param string $tag The name of the action to be executed. 296 * @param mixed $arg,... Optional additional arguments which are passed on to the functions hooked to the action. 297 * @return null Will return null if $tag does not exist in $wp_filter array 298 */ 299 function do_action($tag, $arg = '') { 300 global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter; 301 302 if ( is_array($wp_actions) ) 303 $wp_actions[] = $tag; 304 else 305 $wp_actions = array($tag); 306 307 $wp_current_filter[] = $tag; 308 309 // Do 'all' actions first 310 if ( isset($wp_filter['all']) ) { 311 $all_args = func_get_args(); 312 _wp_call_all_hook($all_args); 313 } 314 315 if ( !isset($wp_filter[$tag]) ) { 316 array_pop($wp_current_filter); 317 return; 318 } 319 320 $args = array(); 321 if ( is_array($arg) && 1 == count($arg) && is_object($arg[0]) ) // array(&$this) 322 $args[] =& $arg[0]; 323 else 324 $args[] = $arg; 325 for ( $a = 2; $a < func_num_args(); $a++ ) 326 $args[] = func_get_arg($a); 327 328 // Sort 329 if ( !isset( $merged_filters[ $tag ] ) ) { 330 ksort($wp_filter[$tag]); 331 $merged_filters[ $tag ] = true; 332 } 333 334 reset( $wp_filter[ $tag ] ); 335 336 do { 337 foreach ( (array) current($wp_filter[$tag]) as $the_ ) 338 if ( !is_null($the_['function']) ) 339 call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args'])); 340 341 } while ( next($wp_filter[$tag]) !== false ); 342 343 array_pop($wp_current_filter); 344 } 345 346 /** 347 * Retrieve the number times an action is fired. 348 * 349 * @package WordPress 350 * @subpackage Plugin 351 * @since 2.1 352 * @global array $wp_actions Increments the amount of times action was triggered. 353 * 354 * @param string $tag The name of the action hook. 355 * @return int The number of times action hook <tt>$tag</tt> is fired 356 */ 357 function did_action($tag) { 358 global $wp_actions; 359 360 if ( empty($wp_actions) ) 361 return 0; 362 363 return count(array_keys($wp_actions, $tag)); 364 } 365 366 /** 367 * Execute functions hooked on a specific action hook, specifying arguments in an array. 368 * 369 * @see do_action() This function is identical, but the arguments passed to the 370 * functions hooked to <tt>$tag</tt> are supplied using an array. 371 * 372 * @package WordPress 373 * @subpackage Plugin 374 * @since 2.1 375 * @global array $wp_filter Stores all of the filters 376 * @global array $wp_actions Increments the amount of times action was triggered. 377 * 378 * @param string $tag The name of the action to be executed. 379 * @param array $args The arguments supplied to the functions hooked to <tt>$tag</tt> 380 * @return null Will return null if $tag does not exist in $wp_filter array 381 */ 382 function do_action_ref_array($tag, $args) { 383 global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter; 384 385 if ( !is_array($wp_actions) ) 386 $wp_actions = array($tag); 387 else 388 $wp_actions[] = $tag; 389 390 $wp_current_filter[] = $tag; 391 392 // Do 'all' actions first 393 if ( isset($wp_filter['all']) ) { 394 $all_args = func_get_args(); 395 _wp_call_all_hook($all_args); 396 } 397 398 if ( !isset($wp_filter[$tag]) ) { 399 array_pop($wp_current_filter); 400 return; 401 } 402 403 // Sort 404 if ( !isset( $merged_filters[ $tag ] ) ) { 405 ksort($wp_filter[$tag]); 406 $merged_filters[ $tag ] = true; 407 } 408 409 reset( $wp_filter[ $tag ] ); 410 411 do { 412 foreach( (array) current($wp_filter[$tag]) as $the_ ) 413 if ( !is_null($the_['function']) ) 414 call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args'])); 415 416 } while ( next($wp_filter[$tag]) !== false ); 417 418 array_pop($wp_current_filter); 419 } 420 421 /** 422 * Check if any action has been registered for a hook. 423 * 424 * @package WordPress 425 * @subpackage Plugin 426 * @since 2.5 427 * @see has_filter() has_action() is an alias of has_filter(). 428 * 429 * @param string $tag The name of the action hook. 430 * @param callback $function_to_check optional. If specified, return the priority of that function on this hook or false if not attached. 431 * @return int|boolean Optionally returns the priority on that hook for the specified function. 432 */ 433 function has_action($tag, $function_to_check = false) { 434 return has_filter($tag, $function_to_check); 435 } 436 437 /** 438 * Removes a function from a specified action hook. 439 * 440 * This function removes a function attached to a specified action hook. This 441 * method can be used to remove default functions attached to a specific filter 442 * hook and possibly replace them with a substitute. 443 * 444 * @package WordPress 445 * @subpackage Plugin 446 * @since 1.2 447 * 448 * @param string $tag The action hook to which the function to be removed is hooked. 449 * @param callback $function_to_remove The name of the function which should be removed. 450 * @param int $priority optional The priority of the function (default: 10). 451 * @param int $accepted_args optional. The number of arguments the function accpets (default: 1). 452 * @return boolean Whether the function is removed. 453 */ 454 function remove_action($tag, $function_to_remove, $priority = 10, $accepted_args = 1) { 455 return remove_filter($tag, $function_to_remove, $priority, $accepted_args); 456 } 457 458 /** 459 * Remove all of the hooks from an action. 460 * 461 * @since 2.7 462 * 463 * @param string $tag The action to remove hooks from. 464 * @param int $priority The priority number to remove them from. 465 * @return bool True when finished. 466 */ 467 function remove_all_actions($tag, $priority = false) { 468 return remove_all_filters($tag, $priority); 469 } 470 471 // 472 // Functions for handling plugins. 473 // 474 475 /** 476 * Gets the basename of a plugin. 477 * 478 * This method extracts the name of a plugin from its filename. 479 * 480 * @package WordPress 481 * @subpackage Plugin 482 * @since 1.5 483 * 484 * @access private 485 * 486 * @param string $file The filename of plugin. 487 * @return string The name of a plugin. 488 * @uses WP_PLUGIN_DIR 489 */ 490 function plugin_basename($file) { 491 $file = str_replace('\\','/',$file); // sanitize for Win32 installs 492 $file = preg_replace('|/+|','/', $file); // remove any duplicate slash 493 $plugin_dir = str_replace('\\','/',WP_PLUGIN_DIR); // sanitize for Win32 installs 494 $plugin_dir = preg_replace('|/+|','/', $plugin_dir); // remove any duplicate slash 495 $file = preg_replace('|^' . preg_quote($plugin_dir, '|') . '/|','',$file); // get relative path from plugins dir 496 return $file; 497 } 498 499 /** 500 * Set the activation hook for a plugin. 501 * 502 * When a plugin is activated, the action 'activate_PLUGINNAME' hook is 503 * activated. In the name of this hook, PLUGINNAME is replaced with the name of 504 * the plugin, including the optional subdirectory. For example, when the plugin 505 * is located in wp-content/plugin/sampleplugin/sample.php, then the name of 506 * this hook will become 'activate_sampleplugin/sample.php'. When the plugin 507 * consists of only one file and is (as by default) located at 508 * wp-content/plugin/sample.php the name of this hook will be 509 * 'activate_sample.php'. 510 * 511 * @package WordPress 512 * @subpackage Plugin 513 * @since 2.0 514 * 515 * @access private 516 * 517 * @param string $file The filename of the plugin including the path. 518 * @param callback $function the function hooked to the 'activate_PLUGIN' action. 519 */ 520 function register_activation_hook($file, $function) { 521 $file = plugin_basename($file); 522 add_action('activate_' . $file, $function); 523 } 524 525 /** 526 * Set the deactivation hook for a plugin. 527 * 528 * When a plugin is deactivated, the action 'deactivate_PLUGINNAME' hook is 529 * deactivated. In the name of this hook, PLUGINNAME is replaced with the name 530 * of the plugin, including the optional subdirectory. For example, when the 531 * plugin is located in wp-content/plugin/sampleplugin/sample.php, then 532 * the name of this hook will become 'activate_sampleplugin/sample.php'. 533 * 534 * When the plugin consists of only one file and is (as by default) located at 535 * wp-content/plugin/sample.php the name of this hook will be 536 * 'activate_sample.php'. 537 * 538 * @package WordPress 539 * @subpackage Plugin 540 * @since 2.0 541 * 542 * @access private 543 * 544 * @param string $file The filename of the plugin including the path. 545 * @param callback $function the function hooked to the 'activate_PLUGIN' action. 546 */ 547 function register_deactivation_hook($file, $function) { 548 $file = plugin_basename($file); 549 add_action('deactivate_' . $file, $function); 550 } 551 552 /** 553 * Set the uninstallation hook for a plugin. 554 * 555 * Registers the uninstall hook that will be called when the user clicks on the 556 * uninstall link that calls for the plugin to uninstall itself. The link won't 557 * be active unless the plugin hooks into the action. 558 * 559 * The plugin should not run arbitrary code outside of functions, when 560 * registering the uninstall hook. In order to run using the hook, the plugin 561 * will have to be included, which means that any code laying outside of a 562 * function will be run during the uninstall process. The plugin should not 563 * hinder the uninstall process. 564 * 565 * If the plugin can not be written without running code within the plugin, then 566 * the plugin should create a file named 'uninstall.php' in the base plugin 567 * folder. This file will be called, if it exists, during the uninstall process 568 * bypassing the uninstall hook. The plugin, when using the 'uninstall.php' 569 * should always check for the 'WP_UNINSTALL_PLUGIN' constant, before 570 * executing. 571 * 572 * @since 2.7 573 * 574 * @param string $file 575 * @param callback $callback The callback to run when the hook is called. 576 */ 577 function register_uninstall_hook($file, $callback) { 578 // The option should not be autoloaded, because it is not needed in most 579 // cases. Emphasis should be put on using the 'uninstall.php' way of 580 // uninstalling the plugin. 581 $uninstallable_plugins = (array) get_option('uninstall_plugins'); 582 $uninstallable_plugins[plugin_basename($file)] = $callback; 583 update_option('uninstall_plugins', $uninstallable_plugins); 584 } 585 586 /** 587 * Calls the 'all' hook, which will process the functions hooked into it. 588 * 589 * The 'all' hook passes all of the arguments or parameters that were used for 590 * the hook, which this function was called for. 591 * 592 * This function is used internally for apply_filters(), do_action(), and 593 * do_action_ref_array() and is not meant to be used from outside those 594 * functions. This function does not check for the existence of the all hook, so 595 * it will fail unless the all hook exists prior to this function call. 596 * 597 * @package WordPress 598 * @subpackage Plugin 599 * @since 2.5 600 * @access private 601 * 602 * @uses $wp_filter Used to process all of the functions in the 'all' hook 603 * 604 * @param array $args The collected parameters from the hook that was called. 605 * @param string $hook Optional. The hook name that was used to call the 'all' hook. 606 */ 607 function _wp_call_all_hook($args) { 608 global $wp_filter; 609 610 reset( $wp_filter['all'] ); 611 do { 612 foreach( (array) current($wp_filter['all']) as $the_ ) 613 if ( !is_null($the_['function']) ) 614 call_user_func_array($the_['function'], $args); 615 616 } while ( next($wp_filter['all']) !== false ); 617 } 618 619 /** 620 * Build Unique ID for storage and retrieval. 621 * 622 * The old way to serialize the callback caused issues and this function is the 623 * solution. It works by checking for objects and creating an a new property in 624 * the class to keep track of the object and new objects of the same class that 625 * need to be added. 626 * 627 * It also allows for the removal of actions and filters for objects after they 628 * change class properties. It is possible to include the property $wp_filter_id 629 * in your class and set it to "null" or a number to bypass the workaround. 630 * However this will prevent you from adding new classes and any new classes 631 * will overwrite the previous hook by the same class. 632 * 633 * Functions and static method callbacks are just returned as strings and 634 * shouldn't have any speed penalty. 635 * 636 * @package WordPress 637 * @subpackage Plugin 638 * @access private 639 * @since 2.2.3 640 * @link http://trac.wordpress.org/ticket/3875 641 * 642 * @global array $wp_filter Storage for all of the filters and actions 643 * @param string $tag Used in counting how many hooks were applied 644 * @param string|array $function Used for creating unique id 645 * @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. 646 * @param string $type filter or action 647 * @return string Unique ID for usage as array key 648 */ 649 function _wp_filter_build_unique_id($tag, $function, $priority) { 650 global $wp_filter; 651 652 // If function then just skip all of the tests and not overwrite the following. 653 if ( is_string($function) ) 654 return $function; 655 // Object Class Calling 656 else if (is_object($function[0]) ) { 657 $obj_idx = get_class($function[0]).$function[1]; 658 if ( !isset($function[0]->wp_filter_id) ) { 659 if ( false === $priority ) 660 return false; 661 $count = isset($wp_filter[$tag][$priority]) ? count((array)$wp_filter[$tag][$priority]) : 0; 662 $function[0]->wp_filter_id = $count; 663 $obj_idx .= $count; 664 unset($count); 665 } else 666 $obj_idx .= $function[0]->wp_filter_id; 667 return $obj_idx; 668 } 669 // Static Calling 670 else if ( is_string($function[0]) ) 671 return $function[0].$function[1]; 672 } 673 674 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Mon Mar 23 16:23:02 2009 | Cross-referenced by PHPXref 0.7 |