*
* @package WordPress
* @subpackage Plugin
- * @since 1.5
+ * @since 1.5.0
*/
// Initialize the filter globals.
* is valid. It is up to you to take care. This is done for optimization purposes,
* so everything is as quick as possible.
*
- * @package WordPress
- * @subpackage Plugin
- *
* @global array $wp_filter A multidimensional array of all hooks and the callbacks hooked to them.
* @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.
*
/**
* Check if any filter has been registered for a hook.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 2.5
+ * @since 2.5.0
+ *
* @global array $wp_filter Stores all of the filters
*
* @param string $tag The name of the filter hook.
* $value = apply_filters( 'example_filter', 'filter me', $arg1, $arg2 );
* </code>
*
- * @package WordPress
- * @subpackage Plugin
- *
* @global array $wp_filter Stores all of the filters
* @global array $merged_filters Merges the filter hooks using this function.
* @global array $wp_current_filter stores the list of current filters with the current one last
* @see apply_filters() This function is identical, but the arguments passed to the
* functions hooked to <tt>$tag</tt> are supplied using an array.
*
- * @package WordPress
- * @subpackage Plugin
* @since 3.0.0
* @global array $wp_filter Stores all of the filters
* @global array $merged_filters Merges the filter hooks using this function.
* when the hook was added. This goes for both filters and actions. No warning
* will be given on removal failure.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 1.2
+ * @since 1.2.0
*
* @param string $tag The filter hook to which the function to be removed is hooked.
* @param callback $function_to_remove The name of the function which should be removed.
/**
* Remove all of the hooks from a filter.
*
- * @since 2.7
+ * @since 2.7.0
*
* @param string $tag The filter to remove hooks from.
* @param int $priority The priority number to remove.
/**
* Retrieve the name of the current filter or action.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 2.5
+ * @since 2.5.0
*
* @return string Hook name of the current filter or action.
*/
return end( $wp_current_filter );
}
+/**
+ * Retrieve the name of the current action.
+ *
+ * @since 3.9.0
+ *
+ * @uses current_filter()
+ *
+ * @return string Hook name of the current action.
+ */
+function current_action() {
+ return current_filter();
+}
+
+/**
+ * Retrieve the name of a filter currently being processed.
+ *
+ * The function current_filter() only returns the most recent filter or action
+ * being executed. did_action() returns true once the action is initially
+ * processed. This function allows detection for any filter currently being
+ * executed (despite not being the most recent filter to fire, in the case of
+ * hooks called from hook callbacks) to be verified.
+ *
+ * @since 3.9.0
+ *
+ * @see current_filter()
+ * @see did_action()
+ * @global array $wp_current_filter Current filter.
+ *
+ * @param null|string $filter Optional. Filter to check. Defaults to null, which
+ * checks if any filter is currently being run.
+ * @return bool Whether the filter is currently in the stack
+ */
+function doing_filter( $filter = null ) {
+ global $wp_current_filter;
+
+ if ( null === $filter ) {
+ return ! empty( $wp_current_filter );
+ }
+
+ return in_array( $filter, $wp_current_filter );
+}
+
+/**
+ * Retrieve the name of an action currently being processed.
+ *
+ * @since 3.9.0
+ *
+ * @uses doing_filter()
+ *
+ * @param string|null $action Optional. Action to check. Defaults to null, which checks
+ * if any action is currently being run.
+ * @return bool Whether the action is currently in the stack.
+ */
+function doing_action( $action = null ) {
+ return doing_filter( $action );
+}
+
/**
* Hooks a function on to a specific action.
*
*
* @uses add_filter() Adds an action. Parameter list and functionality are the same.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 1.2
+ * @since 1.2.0
*
* @param string $tag The name of the action to which the $function_to_add is hooked.
* @param callback $function_to_add The name of the function you wish to be called.
* @see apply_filters() This function works similar with the exception that
* nothing is returned and only the functions or methods are called.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 1.2
+ * @since 1.2.0
+ *
* @global array $wp_filter Stores all of the filters
* @global array $wp_actions Increments the amount of times action was triggered.
*
/**
* Retrieve the number of times an action is fired.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 2.1
+ * @since 2.1.0
+ *
* @global array $wp_actions Increments the amount of times action was triggered.
*
* @param string $tag The name of the action hook.
* @see do_action() This function is identical, but the arguments passed to the
* functions hooked to <tt>$tag</tt> are supplied using an array.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 2.1
+ * @since 2.1.0
+ *
* @global array $wp_filter Stores all of the filters
* @global array $wp_actions Increments the amount of times action was triggered.
*
/**
* Check if any action has been registered for a hook.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 2.5
+ * @since 2.5.0
+ *
* @see has_filter() has_action() is an alias of has_filter().
*
* @param string $tag The name of the action hook.
* method can be used to remove default functions attached to a specific filter
* hook and possibly replace them with a substitute.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 1.2
+ * @since 1.2.0
*
* @param string $tag The action hook to which the function to be removed is hooked.
* @param callback $function_to_remove The name of the function which should be removed.
/**
* Remove all of the hooks from an action.
*
- * @since 2.7
+ * @since 2.7.0
*
* @param string $tag The action to remove hooks from.
* @param int $priority The priority number to remove them from.
*
* This method extracts the name of a plugin from its filename.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 1.5
+ * @since 1.5.0
*
* @access private
*
* @return string The name of a plugin.
* @uses WP_PLUGIN_DIR
*/
-function plugin_basename($file) {
- $file = str_replace('\\','/',$file); // sanitize for Win32 installs
- $file = preg_replace('|/+|','/', $file); // remove any duplicate slash
- $plugin_dir = str_replace('\\','/',WP_PLUGIN_DIR); // sanitize for Win32 installs
- $plugin_dir = preg_replace('|/+|','/', $plugin_dir); // remove any duplicate slash
- $mu_plugin_dir = str_replace('\\','/',WPMU_PLUGIN_DIR); // sanitize for Win32 installs
- $mu_plugin_dir = preg_replace('|/+|','/', $mu_plugin_dir); // remove any duplicate slash
+function plugin_basename( $file ) {
+ global $wp_plugin_paths;
+
+ foreach ( $wp_plugin_paths as $dir => $realdir ) {
+ if ( strpos( $file, $realdir ) === 0 ) {
+ $file = $dir . substr( $file, strlen( $realdir ) );
+ }
+ }
+
+ $file = wp_normalize_path( $file );
+ $plugin_dir = wp_normalize_path( WP_PLUGIN_DIR );
+ $mu_plugin_dir = wp_normalize_path( WPMU_PLUGIN_DIR );
+
$file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#','',$file); // get relative path from plugins dir
$file = trim($file, '/');
return $file;
}
+/**
+ * Register a plugin's real path.
+ *
+ * This is used in plugin_basename() to resolve symlinked paths.
+ *
+ * @since 3.9.0
+ *
+ * @see plugin_basename()
+ *
+ * @param string $file Known path to the file.
+ * @return bool Whether the path was able to be registered.
+ */
+function wp_register_plugin_realpath( $file ) {
+ global $wp_plugin_paths;
+
+ // Normalize, but store as static to avoid recalculation of a constant value
+ static $wp_plugin_path, $wpmu_plugin_path;
+ if ( ! isset( $wp_plugin_path ) ) {
+ $wp_plugin_path = wp_normalize_path( WP_PLUGIN_DIR );
+ $wpmu_plugin_path = wp_normalize_path( WPMU_PLUGIN_DIR );
+ }
+
+ $plugin_path = wp_normalize_path( dirname( $file ) );
+ $plugin_realpath = wp_normalize_path( dirname( realpath( $file ) ) );
+
+ if ( $plugin_path === $wp_plugin_path || $plugin_path === $wpmu_plugin_path ) {
+ return false;
+ }
+
+ if ( $plugin_path !== $plugin_realpath ) {
+ $wp_plugin_paths[ $plugin_path ] = $plugin_realpath;
+ }
+
+ return true;
+}
+
/**
* Gets the filesystem directory path (with trailing slash) for the plugin __FILE__ passed in
- * @package WordPress
- * @subpackage Plugin
- * @since 2.8
+ *
+ * @since 2.8.0
*
* @param string $file The filename of the plugin (__FILE__)
* @return string the filesystem path of the directory that contains the plugin
/**
* Gets the URL directory path (with trailing slash) for the plugin __FILE__ passed in
- * @package WordPress
- * @subpackage Plugin
- * @since 2.8
+ *
+ * @since 2.8.0
*
* @param string $file The filename of the plugin (__FILE__)
* @return string the URL path of the directory that contains the plugin
* wp-content/plugins/sample.php the name of this hook will be
* 'activate_sample.php'.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 2.0
+ * @since 2.0.0
*
* @param string $file The filename of the plugin including the path.
* @param callback $function the function hooked to the 'activate_PLUGIN' action.
* wp-content/plugins/sample.php the name of this hook will be
* 'deactivate_sample.php'.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 2.0
+ * @since 2.0.0
*
* @param string $file The filename of the plugin including the path.
* @param callback $function the function hooked to the 'deactivate_PLUGIN' action.
* should always check for the 'WP_UNINSTALL_PLUGIN' constant, before
* executing.
*
- * @since 2.7
+ * @since 2.7.0
*
* @param string $file
* @param callback $callback The callback to run when the hook is called. Must be a static method or function.
* functions. This function does not check for the existence of the all hook, so
* it will fail unless the all hook exists prior to this function call.
*
- * @package WordPress
- * @subpackage Plugin
- * @since 2.5
+ * @since 2.5.0
* @access private
*
* @uses $wp_filter Used to process all of the functions in the 'all' hook
* Functions and static method callbacks are just returned as strings and
* shouldn't have any speed penalty.
*
- * @package WordPress
- * @subpackage Plugin
* @access private
* @since 2.2.3
* @link http://trac.wordpress.org/ticket/3875