wppaste
WordPress

_deprecated_function( string $function_name, string $version, string $replacement = '' )

Since
2.5.0, 5.4.0, 5.4.0
Source
wp-includes/functions.php:5643

Flags $function_name as deprecated since $version and optionally points to a $replacement function, without calling that replacement for you. It only surfaces a visible notice when WP_DEBUG is true, but it always fires the deprecated_function_run action, so plugins can log deprecated calls even in production. Pair it with the deprecated_function_trigger_error filter if you need to silence or redirect the on-screen warning.

Marks a function as deprecated and inform when it has been used.

Description

There is a 'deprecated_function_run' hook that will be called that can be used to get the backtrace up to what file and function called the deprecated function.

The current behavior is to trigger a user error if WP_DEBUG is true.

This function is to be used in every function that is deprecated.

Compatibility

WordPress
since 5.4.0
PHP
7.4–8.6-dev
  • 6.7.7
  • 6.8.8
  • 6.9.7
  • 7.0.4
  • 7.1.0

Present in every tracked release (6.7.7 to 7.1.0), and compiles on PHP 7.4 through 8.6-dev.

Parameters

$function_namestring
The function that was called.
$versionstring
The version of WordPress that deprecated the function.
$replacementstringoptional
The function that should have been called. Default empty string.Default: ''

Code examples

Every example is editable and runs in a real WordPress booted in your browser by WordPress Playground. Press Run, then edit the code: clicking away re-runs it. Nothing is sent anywhere until you do.

Mark a plugin function as deprecated and fall back to a replacement

A plugin renaming a helper keeps the old name working while flagging it as deprecated.

function acme_get_product_price( $post_id ) {
	_deprecated_function( __FUNCTION__, '7.1.0', 'get_post_meta()' );
	return get_post_meta( $post_id, 'price', true );
}

$price = acme_get_product_price( 2 );
echo esc_html( 'Price for post 2 via deprecated helper: ' . $price );

The function only produces an on-screen PHP notice when WP_DEBUG is true; the fallback call to get_post_meta() still runs either way.

Log every deprecated function call instead of showing a warning

Hook the deprecated_function_run action to capture deprecated calls for your own audit log rather than relying on the default error output.

add_action( 'deprecated_function_run', function( $function_name, $replacement, $version ) {
	printf(
		'Logged deprecated call: %s (deprecated in %s, replacement: %s)',
		esc_html( $function_name ),
		esc_html( $version ),
		esc_html( $replacement ? $replacement : 'none' )
	);
} );

function acme_legacy_json_encode( $data ) {
	_deprecated_function( __FUNCTION__, '7.1.0', 'wp_json_encode()' );
	return wp_json_encode( $data );
}

$json = acme_legacy_json_encode( array( 'post_id' => 1 ) );
echo '<br>Encoded: ' . esc_html( $json );

do_action( 'deprecated_function_run' ) fires on every call regardless of WP_DEBUG, so this is the reliable way to track deprecated usage in production.

Common problems and fixes · 4

Why doesn't calling _deprecated_function() show any warning on my site?

The visible message only appears when WP_DEBUG is true and the deprecated_function_trigger_error filter still returns true, both checked in the same if statement before wp_trigger_error() runs.

Does _deprecated_function() automatically call the replacement function for me?

No. The source only builds a translated message and passes $replacement into it as text; it never invokes $replacement. You have to write the fallback logic yourself, as in the get_post_meta() example.

How do I silence deprecated-function notices from a third-party plugin without editing its code?

Every call passes through the deprecated_function_trigger_error filter before wp_trigger_error() runs, so returning false there suppresses the notice for all calls to _deprecated_function() on the request.

Can I still detect deprecated calls when WP_DEBUG is off in production?

Yes. do_action( 'deprecated_function_run', $function_name, $replacement, $version ) fires unconditionally at the top of the function, before the WP_DEBUG check, so a logging callback attached there runs on every request.

Alternatives and related functions

_deprecated_argument
When a function or method still exists but one of its parameters or an accepted value has been dropped.
_deprecated_class
When an entire class, rather than a single function, has been replaced or removed.
_deprecated_hook
When a filter or action itself is being retired instead of a callable function.
_doing_it_wrong
When the function is still current but is being called in an incorrect way, rather than being obsolete.

Performance profile

How much work a call to _deprecated_function() does, and what it touches: the algorithmic scaling, the Zend instruction count per call across PHP versions, the hooks it hands control to, and the core code that calls it. Measured from the compiled opcodes, not a stopwatch, so every number is identical on any machine running the same PHP version, and every function in core is ranked by cost.

Cost class
Trivial

Touches nothing outside its own arguments.

Scaling
Constant

No loop in the body: the same number of instructions runs whatever you pass in.

Instructions
12–38

Executed per call on PHP 8.5, depending on the branch taken. The body compiles to 63.

Plugin surface
2 hooks

Third-party callbacks on 'deprecated_function_run', 'deprecated_function_trigger_error' run inside this call, and their cost is not bounded by anything here.

Called by
50

50 places in core call this, so the cost is paid more often than your own code shows.

What it touches

  • hookthird-party callbacksdo_action()called directly

Further down the call graph this can also reach query, option, cache, serialize and transient. Those are the worst case, several calls deep and usually down an error path, not what a normal call pays.

What one call costs · 4 distinct outcomes

One number would be a lie: the work depends on which branch runs. These are every distinct cost _deprecated_function() can have, taken from its control-flow graph on PHP 8.5.

WhenInstructionsCalls it makes
always12do_action()
!apply_filters()17do_action(), apply_filters()
apply_filters() && !function_exists()33–35do_action(), apply_filters(), function_exists(), sprintf(), wp_trigger_error()
apply_filters() && function_exists()37–38do_action(), apply_filters(), function_exists(), __(), sprintf(), wp_trigger_error()

Across PHP versions

Compiles the same on PHP 7.4, 8.1, 8.2, 8.3, 8.4, 8.5 and 8.6-dev: 63 instructions, 12–38 executed per call, 5 branches. The work does not change between versions.

An instruction is not a fixed amount of time, so a matching count is not necessarily the same speed; what it rules out is a difference in the work itself.

Hooks and filters fired · 2

2 hooks fire while _deprecated_function() runs, in this order:

  1. do_action( deprecated_function_run )actionline 5654 (+11 into the body)

    Fires when a deprecated function is called.

  2. apply_filters( deprecated_function_trigger_error )filterline 5663 (+20 into the body)

    Filters whether to trigger an error for deprecated functions.

Uses · 4

  • do_action()Calls the callback functions that have been added to an action hook.
  • apply_filters()Calls the callback functions that have been added to a filter hook.
  • __()Retrieves the translation of $text.
  • wp_trigger_error()Generates a user-level error/warning/notice/deprecation message.

Used by · 50

Show all 50

Source code

function _deprecated_function( $function_name, $version, $replacement = '' ) { 	/**	 * Fires when a deprecated function is called.	 *	 * @since 2.5.0	 *	 * @param string $function_name The function that was called.	 * @param string $replacement   The function that should have been called.	 * @param string $version       The version of WordPress that deprecated the function.	 */	do_action( 'deprecated_function_run', $function_name, $replacement, $version ); 	/**	 * Filters whether to trigger an error for deprecated functions.	 *	 * @since 2.5.0	 *	 * @param bool $trigger Whether to trigger the error for deprecated functions. Default true.	 */	if ( WP_DEBUG && apply_filters( 'deprecated_function_trigger_error', true ) ) {		if ( function_exists( '__' ) ) {			if ( $replacement ) {				$message = sprintf(					/* translators: 1: PHP function name, 2: Version number, 3: Alternative function name. */					__( 'Function %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),					$function_name,					$version,					$replacement				);			} else {				$message = sprintf(					/* translators: 1: PHP function name, 2: Version number. */					__( 'Function %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),					$function_name,					$version				);			}		} else {			if ( $replacement ) {				$message = sprintf(					'Function %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',					$function_name,					$version,					$replacement				);			} else {				$message = sprintf(					'Function %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.',					$function_name,					$version				);			}		} 		wp_trigger_error( '', $message, E_USER_DEPRECATED );	}}

Changelog

Introduced in 2.5.0. Unchanged from 6.7.7 through 7.1.0.

  1. 6.7.7
  2. 6.8.8
  3. 6.9.7
  4. 7.0.4
  5. 7.1.0

Signature, return type and hooks compared across 5 parsed releases.

5.4.0
The error type is now classified as E_USER_DEPRECATED (used to default to E_USER_NOTICE).from the docblock
5.4.0
This function is no longer marked as "private".from the docblock
2.5.0
Introduced.from the docblock

About this page

Parsed data
Generated from the wordpress-develop 7.1.0 tag, from src/wp-includes/functions.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it.
Corrections
Something wrong on this page? Report it and it gets fixed in the next regeneration.