wp_redirect

The timeline below displays how wordpress function wp_redirect has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.5

/**
 * Redirects to another page.
 *
 * Note: wp_redirect() does not exit automatically, and should almost always be
 * followed by a call to `exit;`:
 *
 *     wp_redirect( $url );
 *     exit;
 *
 * Exiting can also be selectively manipulated by using wp_redirect() as a conditional
 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_status'} filters:
 *
 *     if ( wp_redirect( $url ) ) {
 *         exit;
 *     }
 *
 * @since 1.5.1
 * @since 5.1.0 The `$x_redirect_by` parameter was added.
 * @since 5.4.0 On invalid status codes, wp_die() is called.
 *
 * @global bool $is_IIS
 *
 * @param string       $location      The path or URL to redirect to.
 * @param int          $status        Optional. HTTP response status code to use. Default '302' (Moved Temporarily).
 * @param string|false $x_redirect_by Optional. The application doing the redirect or false to omit. Default 'WordPress'.
 * @return bool False if the redirect was canceled, true otherwise.
 */
function wp_redirect($location, $status = 302, $x_redirect_by = 'WordPress')
{
    global $is_IIS;
    /**
     * Filters the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path or URL to redirect to.
     * @param int    $status   The HTTP response status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filters the redirect HTTP response status code to use.
     *
     * @since 2.3.0
     *
     * @param int    $status   The HTTP response status code to use.
     * @param string $location The path or URL to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    if ($status < 300 || 399 < $status) {
        wp_die(__('HTTP redirect status code must be a redirection code, 3xx.'));
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && 'cgi-fcgi' !== PHP_SAPI) {
        status_header($status);
        // This causes problems on IIS and some FastCGI setups.
    }
    /**
     * Filters the X-Redirect-By header.
     *
     * Allows applications to identify themselves when they're doing a redirect.
     *
     * @since 5.1.0
     *
     * @param string|false $x_redirect_by The application doing the redirect or false to omit the header.
     * @param int          $status        Status code to use.
     * @param string       $location      The path to redirect to.
     */
    $x_redirect_by = apply_filters('x_redirect_by', $x_redirect_by, $status, $location);
    if (is_string($x_redirect_by)) {
        header("X-Redirect-By: {$x_redirect_by}");
    }
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 6.2

/**
 * Redirects to another page.
 *
 * Note: wp_redirect() does not exit automatically, and should almost always be
 * followed by a call to `exit;`:
 *
 *     wp_redirect( $url );
 *     exit;
 *
 * Exiting can also be selectively manipulated by using wp_redirect() as a conditional
 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_status'} filters:
 *
 *     if ( wp_redirect( $url ) ) {
 *         exit;
 *     }
 *
 * @since 1.5.1
 * @since 5.1.0 The `$x_redirect_by` parameter was added.
 * @since 5.4.0 On invalid status codes, wp_die() is called.
 *
 * @global bool $is_IIS
 *
 * @param string $location      The path or URL to redirect to.
 * @param int    $status        Optional. HTTP response status code to use. Default '302' (Moved Temporarily).
 * @param string $x_redirect_by Optional. The application doing the redirect. Default 'WordPress'.
 * @return bool False if the redirect was canceled, true otherwise.
 */
function wp_redirect($location, $status = 302, $x_redirect_by = 'WordPress')
{
    global $is_IIS;
    /**
     * Filters the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path or URL to redirect to.
     * @param int    $status   The HTTP response status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filters the redirect HTTP response status code to use.
     *
     * @since 2.3.0
     *
     * @param int    $status   The HTTP response status code to use.
     * @param string $location The path or URL to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    if ($status < 300 || 399 < $status) {
        wp_die(__('HTTP redirect status code must be a redirection code, 3xx.'));
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && 'cgi-fcgi' !== PHP_SAPI) {
        status_header($status);
        // This causes problems on IIS and some FastCGI setups.
    }
    /**
     * Filters the X-Redirect-By header.
     *
     * Allows applications to identify themselves when they're doing a redirect.
     *
     * @since 5.1.0
     *
     * @param string $x_redirect_by The application doing the redirect.
     * @param int    $status        Status code to use.
     * @param string $location      The path to redirect to.
     */
    $x_redirect_by = apply_filters('x_redirect_by', $x_redirect_by, $status, $location);
    if (is_string($x_redirect_by)) {
        header("X-Redirect-By: {$x_redirect_by}");
    }
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 5.5

/**
 * Redirects to another page.
 *
 * Note: wp_redirect() does not exit automatically, and should almost always be
 * followed by a call to `exit;`:
 *
 *     wp_redirect( $url );
 *     exit;
 *
 * Exiting can also be selectively manipulated by using wp_redirect() as a conditional
 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_location'} filters:
 *
 *     if ( wp_redirect( $url ) ) {
 *         exit;
 *     }
 *
 * @since 1.5.1
 * @since 5.1.0 The `$x_redirect_by` parameter was added.
 * @since 5.4.0 On invalid status codes, wp_die() is called.
 *
 * @global bool $is_IIS
 *
 * @param string $location      The path or URL to redirect to.
 * @param int    $status        Optional. HTTP response status code to use. Default '302' (Moved Temporarily).
 * @param string $x_redirect_by Optional. The application doing the redirect. Default 'WordPress'.
 * @return bool False if the redirect was cancelled, true otherwise.
 */
function wp_redirect($location, $status = 302, $x_redirect_by = 'WordPress')
{
    global $is_IIS;
    /**
     * Filters the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path or URL to redirect to.
     * @param int    $status   The HTTP response status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filters the redirect HTTP response status code to use.
     *
     * @since 2.3.0
     *
     * @param int    $status   The HTTP response status code to use.
     * @param string $location The path or URL to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    if ($status < 300 || 399 < $status) {
        wp_die(__('HTTP redirect status code must be a redirection code, 3xx.'));
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && 'cgi-fcgi' !== PHP_SAPI) {
        status_header($status);
        // This causes problems on IIS and some FastCGI setups.
    }
    /**
     * Filters the X-Redirect-By header.
     *
     * Allows applications to identify themselves when they're doing a redirect.
     *
     * @since 5.1.0
     *
     * @param string $x_redirect_by The application doing the redirect.
     * @param int    $status        Status code to use.
     * @param string $location      The path to redirect to.
     */
    $x_redirect_by = apply_filters('x_redirect_by', $x_redirect_by, $status, $location);
    if (is_string($x_redirect_by)) {
        header("X-Redirect-By: {$x_redirect_by}");
    }
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 5.4

/**
 * Redirects to another page.
 *
 * Note: wp_redirect() does not exit automatically, and should almost always be
 * followed by a call to `exit;`:
 *
 *     wp_redirect( $url );
 *     exit;
 *
 * Exiting can also be selectively manipulated by using wp_redirect() as a conditional
 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_location'} filters:
 *
 *     if ( wp_redirect( $url ) ) {
 *         exit;
 *     }
 *
 * @since 1.5.1
 * @since 5.1.0 The `$x_redirect_by` parameter was added.
 * @since 5.4.0 On invalid status codes, wp_die() is called.
 *
 * @global bool $is_IIS
 *
 * @param string $location      The path or URL to redirect to.
 * @param int    $status        Optional. HTTP response status code to use. Default '302' (Moved Temporarily).
 * @param string $x_redirect_by Optional. The application doing the redirect. Default 'WordPress'.
 * @return bool False if the redirect was cancelled, true otherwise.
 */
function wp_redirect($location, $status = 302, $x_redirect_by = 'WordPress')
{
    global $is_IIS;
    /**
     * Filters the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path or URL to redirect to.
     * @param int    $status   The HTTP response status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filters the redirect HTTP response status code to use.
     *
     * @since 2.3.0
     *
     * @param int    $status   The HTTP response status code to use.
     * @param string $location The path or URL to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    if ($status < 300 || 399 < $status) {
        wp_die(__('HTTP redirect status code must be a redirection code, 3xx.'));
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && PHP_SAPI != 'cgi-fcgi') {
        status_header($status);
        // This causes problems on IIS and some FastCGI setups.
    }
    /**
     * Filters the X-Redirect-By header.
     *
     * Allows applications to identify themselves when they're doing a redirect.
     *
     * @since 5.1.0
     *
     * @param string $x_redirect_by The application doing the redirect.
     * @param int    $status        Status code to use.
     * @param string $location      The path to redirect to.
     */
    $x_redirect_by = apply_filters('x_redirect_by', $x_redirect_by, $status, $location);
    if (is_string($x_redirect_by)) {
        header("X-Redirect-By: {$x_redirect_by}");
    }
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 5.1

/**
 * Redirects to another page.
 *
 * Note: wp_redirect() does not exit automatically, and should almost always be
 * followed by a call to `exit;`:
 *
 *     wp_redirect( $url );
 *     exit;
 *
 * Exiting can also be selectively manipulated by using wp_redirect() as a conditional
 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_location'} filters:
 *
 *     if ( wp_redirect( $url ) ) {
 *         exit;
 *     }
 *
 * @since 1.5.1
 * @since 5.1.0 The `$x_redirect_by` parameter was added.
 *
 * @global bool $is_IIS
 *
 * @param string $location      The path or URL to redirect to.
 * @param int    $status        Optional. HTTP response status code to use. Default '302' (Moved Temporarily).
 * @param string $x_redirect_by Optional. The application doing the redirect. Default 'WordPress'.
 * @return bool False if the redirect was cancelled, true otherwise.
 */
function wp_redirect($location, $status = 302, $x_redirect_by = 'WordPress')
{
    global $is_IIS;
    /**
     * Filters the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path or URL to redirect to.
     * @param int    $status   The HTTP response status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filters the redirect HTTP response status code to use.
     *
     * @since 2.3.0
     *
     * @param int    $status   The HTTP response status code to use.
     * @param string $location The path or URL to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && PHP_SAPI != 'cgi-fcgi') {
        status_header($status);
        // This causes problems on IIS and some FastCGI setups
    }
    /**
     * Filters the X-Redirect-By header.
     *
     * Allows applications to identify themselves when they're doing a redirect.
     *
     * @since 5.1.0
     *
     * @param string $x_redirect_by The application doing the redirect.
     * @param int    $status        Status code to use.
     * @param string $location      The path to redirect to.
     */
    $x_redirect_by = apply_filters('x_redirect_by', $x_redirect_by, $status, $location);
    if (is_string($x_redirect_by)) {
        header("X-Redirect-By: {$x_redirect_by}");
    }
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 4.7

/**
 * Redirects to another page.
 *
 * Note: wp_redirect() does not exit automatically, and should almost always be
 * followed by a call to `exit;`:
 *
 *     wp_redirect( $url );
 *     exit;
 *
 * Exiting can also be selectively manipulated by using wp_redirect() as a conditional
 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_location'} hooks:
 *
 *     if ( wp_redirect( $url ) ) {
 *         exit;
 *     }
 *
 * @since 1.5.1
 *
 * @global bool $is_IIS
 *
 * @param string $location The path to redirect to.
 * @param int    $status   Status code to use.
 * @return bool False if $location is not provided, true otherwise.
 */
function wp_redirect($location, $status = 302)
{
    global $is_IIS;
    /**
     * Filters the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path to redirect to.
     * @param int    $status   Status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filters the redirect status code.
     *
     * @since 2.3.0
     *
     * @param int    $status   Status code to use.
     * @param string $location The path to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && PHP_SAPI != 'cgi-fcgi') {
        status_header($status);
    }
    // This causes problems on IIS and some FastCGI setups
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 4.6

/**
 * Redirects to another page.
 *
 * Note: wp_redirect() does not exit automatically, and should almost always be
 * followed by a call to `exit;`:
 *
 *     wp_redirect( $url );
 *     exit;
 *
 * Exiting can also be selectively manipulated by using wp_redirect() as a conditional
 * in conjunction with the {@see 'wp_redirect'} and {@see 'wp_redirect_location'} hooks:
 *
 *     if ( wp_redirect( $url ) {
 *         exit;
 *     }
 *
 * @since 1.5.1
 *
 * @global bool $is_IIS
 *
 * @param string $location The path to redirect to.
 * @param int    $status   Status code to use.
 * @return bool False if $location is not provided, true otherwise.
 */
function wp_redirect($location, $status = 302)
{
    global $is_IIS;
    /**
     * Filters the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path to redirect to.
     * @param int    $status   Status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filters the redirect status code.
     *
     * @since 2.3.0
     *
     * @param int    $status   Status code to use.
     * @param string $location The path to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && PHP_SAPI != 'cgi-fcgi') {
        status_header($status);
    }
    // This causes problems on IIS and some FastCGI setups
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 4.3

/**
 * Redirects to another page.
 *
 * @since 1.5.1
 *
 * @global bool $is_IIS
 *
 * @param string $location The path to redirect to.
 * @param int    $status   Status code to use.
 * @return bool False if $location is not provided, true otherwise.
 */
function wp_redirect($location, $status = 302)
{
    global $is_IIS;
    /**
     * Filter the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path to redirect to.
     * @param int    $status   Status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filter the redirect status code.
     *
     * @since 2.3.0
     *
     * @param int    $status   Status code to use.
     * @param string $location The path to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && PHP_SAPI != 'cgi-fcgi') {
        status_header($status);
    }
    // This causes problems on IIS and some FastCGI setups
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 4.2

/**
 * Redirects to another page.
 *
 * @since 1.5.1
 *
 * @param string $location The path to redirect to.
 * @param int $status Status code to use.
 * @return bool False if $location is not provided, true otherwise.
 */
function wp_redirect($location, $status = 302)
{
    global $is_IIS;
    /**
     * Filter the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path to redirect to.
     * @param int    $status   Status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filter the redirect status code.
     *
     * @since 2.3.0
     *
     * @param int    $status   Status code to use.
     * @param string $location The path to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && PHP_SAPI != 'cgi-fcgi') {
        status_header($status);
    }
    // This causes problems on IIS and some FastCGI setups
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 3.9

/**
 * Redirects to another page.
 *
 * @since 1.5.1
 *
 * @param string $location The path to redirect to.
 * @param int $status Status code to use.
 * @return bool False if $location is not provided, true otherwise.
 */
function wp_redirect($location, $status = 302)
{
    global $is_IIS;
    /**
     * Filter the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path to redirect to.
     * @param int    $status   Status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filter the redirect status code.
     *
     * @since 2.3.0
     *
     * @param int    $status   Status code to use.
     * @param string $location The path to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && php_sapi_name() != 'cgi-fcgi') {
        status_header($status);
    }
    // This causes problems on IIS and some FastCGI setups
    header("Location: {$location}", true, $status);
    return true;
}

WordPress Version: 3.7

/**
 * Redirects to another page.
 *
 * @since 1.5.1
 * @uses apply_filters() Calls 'wp_redirect' hook on $location and $status.
 *
 * @param string $location The path to redirect to.
 * @param int $status Status code to use.
 * @return bool False if $location is not provided, true otherwise.
 */
function wp_redirect($location, $status = 302)
{
    global $is_IIS;
    /**
     * Filter the redirect location.
     *
     * @since 2.1.0
     *
     * @param string $location The path to redirect to.
     * @param int    $status   Status code to use.
     */
    $location = apply_filters('wp_redirect', $location, $status);
    /**
     * Filter the redirect status code.
     *
     * @since 2.3.0
     *
     * @param int    $status   Status code to use.
     * @param string $location The path to redirect to.
     */
    $status = apply_filters('wp_redirect_status', $status, $location);
    if (!$location) {
        return false;
    }
    $location = wp_sanitize_redirect($location);
    if (!$is_IIS && php_sapi_name() != 'cgi-fcgi') {
        status_header($status);
    }
    // This causes problems on IIS and some FastCGI setups
    header("Location: {$location}", true, $status);
    return true;
}