register_post_status

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

WordPress Version: 6.4

/**
 * Registers a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 *
 * @global stdClass[] $wp_post_statuses Inserts new post status object into the list
 *
 * @param string       $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type array|false $label_count               Nooped plural text from _n_noop() to provide the singular
 *                                                  and plural forms of the label for counts. Default false
 *                                                  which means the `$label` argument will be used for both
 *                                                  the singular and plural forms of this label.
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is the opposite value
 *                                                  of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is the opposite value of $internal.
 *     @type bool        $date_floating             Whether the post has a floating creation date.
 *                                                  Default to false.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'date_floating' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (null === $args->date_floating) {
        $args->date_floating = false;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingular,WordPress.WP.I18n.NonSingularStringLiteralPlural
        $args->label_count = _n_noop($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 6.1

/**
 * Registers a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 *
 * @global stdClass[] $wp_post_statuses Inserts new post status object into the list
 *
 * @param string       $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type array|false $label_count               Nooped plural text from _n_noop() to provide the singular
 *                                                  and plural forms of the label for counts. Default false
 *                                                  which means the `$label` argument will be used for both
 *                                                  the singular and plural forms of this label.
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is the opposite value
 *                                                  of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is the opposite value of $internal.
 *     @type bool        $date_floating             Whether the post has a floating creation date.
 *                                                  Default to false.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'date_floating' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (null === $args->date_floating) {
        $args->date_floating = false;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural
        $args->label_count = _n_noop($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 5.9

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 *
 * @global stdClass[] $wp_post_statuses Inserts new post status object into the list
 *
 * @param string       $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.
 *                                                  Default array of $label, twice.
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is the opposite value
 *                                                  of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is the opposite value of $internal.
 *     @type bool        $date_floating             Whether the post has a floating creation date.
 *                                                  Default to false.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'date_floating' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (null === $args->date_floating) {
        $args->date_floating = false;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural
        $args->label_count = _n_noop($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 5.5

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 *
 * @global array $wp_post_statuses Inserts new post status object into the list
 *
 * @param string       $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.
 *                                                  Default array of $label, twice.
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is the opposite value
 *                                                  of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is the opposite value of $internal.
 *     @type bool        $date_floating             Whether the post has a floating creation date.
 *                                                  Default to false.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'date_floating' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (null === $args->date_floating) {
        $args->date_floating = false;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural
        $args->label_count = _n_noop($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 5.4

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 * @global array $wp_post_statuses Inserts new post status object into the list
 *
 * @param string $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.
 *                                                  Default array of $label, twice.
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is the opposite value
 *                                                  of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is the opposite value of $internal.
 *     @type bool        $date_floating             Whether the post has a floating creation date.
 *                                                  Default to false.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'date_floating' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (null === $args->date_floating) {
        $args->date_floating = false;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural
        $args->label_count = _n_noop($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 5.3

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 * @global array $wp_post_statuses Inserts new post status object into the list
 *
 * @param string $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.
 *                                                  Default array of $label, twice
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is value of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is value of $internal.
 *     @type bool        $date_floating             Whether the post has a floating creation date.
 *                                                  Default to false.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'date_floating' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (null === $args->date_floating) {
        $args->date_floating = false;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural
        $args->label_count = _n_noop($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 5.1

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 * @global array $wp_post_statuses Inserts new post status object into the list
 *
 * @param string $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.
 *                                                  Default array of $label, twice
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is value of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is value of $internal.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        // phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralSingle,WordPress.WP.I18n.NonSingularStringLiteralPlural
        $args->label_count = _n_noop($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 4.8

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 * @global array $wp_post_statuses Inserts new post status object into the list
 *
 * @param string $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.
 *                                                  Default array of $label, twice
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is value of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is value of $internal.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        $args->label_count = _n_noop($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 4.3

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 * @global array $wp_post_statuses Inserts new post status object into the list
 *
 * @param string $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.
 *                                                  Default array of $label, twice
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default false.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is value of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is value of $internal.
 * }
 * @return object
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        $args->label_count = array($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 4.0

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 * @uses $wp_post_statuses Inserts new post status object into the list
 *
 * @param string $post_status Name of the post status.
 * @param array|string $args {
 *     Optional. Array or string of post status arguments.
 *
 *     @type bool|string $label                     A descriptive name for the post status marked
 *                                                  for translation. Defaults to value of $post_status.
 *     @type bool|array  $label_count               Descriptive text to use for nooped plurals.
 *                                                  Default array of $label, twice
 *     @type bool        $exclude_from_search       Whether to exclude posts with this post status
 *                                                  from search results. Default is value of $internal.
 *     @type bool        $_builtin                  Whether the status is built-in. Core-use only.
 *                                                  Default false.
 *     @type bool        $public                    Whether posts of this status should be shown
 *                                                  in the front end of the site. Default true.
 *     @type bool        $internal                  Whether the status is for internal use only.
 *                                                  Default false.
 *     @type bool        $protected                 Whether posts with this status should be protected.
 *                                                  Default false.
 *     @type bool        $private                   Whether posts with this status should be private.
 *                                                  Default false.
 *     @type bool        $publicly_queryable        Whether posts with this status should be publicly-
 *                                                  queryable. Default is value of $public.
 *     @type bool        $show_in_admin_all_list    Whether to include posts in the edit listing for
 *                                                  their post type. Default is value of $internal.
 *     @type bool        $show_in_admin_status_list Show in the list of statuses with post counts at
 *                                                  the top of the edit listings,
 *                                                  e.g. All (12) | Published (9) | My Custom Status (2)
 *                                                  Default is value of $internal.
 * }
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    // Set various defaults.
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        $args->label_count = array($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 3.9

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 *
 * Optional $args contents:
 *
 * label - A descriptive name for the post status marked for translation. Defaults to $post_status.
 * public - Whether posts of this status should be shown in the front end of the site. Defaults to true.
 * exclude_from_search - Whether to exclude posts with this post status from search results. Defaults to false.
 * show_in_admin_all_list - Whether to include posts in the edit listing for their post type
 * show_in_admin_status_list - Show in the list of statuses with post counts at the top of the edit
 *                             listings, e.g. All (12) | Published (9) | My Custom Status (2) ...
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @since 3.0.0
 * @uses $wp_post_statuses Inserts new post status object into the list
 *
 * @param string $post_status Name of the post status.
 * @param array|string $args See above description.
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        $args->label_count = array($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}

WordPress Version: 3.7

/**
 * Register a post status. Do not use before init.
 *
 * A simple function for creating or modifying a post status based on the
 * parameters given. The function will accept an array (second optional
 * parameter), along with a string for the post status name.
 *
 *
 * Optional $args contents:
 *
 * label - A descriptive name for the post status marked for translation. Defaults to $post_status.
 * public - Whether posts of this status should be shown in the front end of the site. Defaults to true.
 * exclude_from_search - Whether to exclude posts with this post status from search results. Defaults to false.
 * show_in_admin_all_list - Whether to include posts in the edit listing for their post type
 * show_in_admin_status_list - Show in the list of statuses with post counts at the top of the edit
 *                             listings, e.g. All (12) | Published (9) | My Custom Status (2) ...
 *
 * Arguments prefixed with an _underscore shouldn't be used by plugins and themes.
 *
 * @package WordPress
 * @subpackage Post
 * @since 3.0.0
 * @uses $wp_post_statuses Inserts new post status object into the list
 *
 * @param string $post_status Name of the post status.
 * @param array|string $args See above description.
 */
function register_post_status($post_status, $args = array())
{
    global $wp_post_statuses;
    if (!is_array($wp_post_statuses)) {
        $wp_post_statuses = array();
    }
    // Args prefixed with an underscore are reserved for internal use.
    $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null);
    $args = wp_parse_args($args, $defaults);
    $args = (object) $args;
    $post_status = sanitize_key($post_status);
    $args->name = $post_status;
    if (null === $args->public && null === $args->internal && null === $args->protected && null === $args->private) {
        $args->internal = true;
    }
    if (null === $args->public) {
        $args->public = false;
    }
    if (null === $args->private) {
        $args->private = false;
    }
    if (null === $args->protected) {
        $args->protected = false;
    }
    if (null === $args->internal) {
        $args->internal = false;
    }
    if (null === $args->publicly_queryable) {
        $args->publicly_queryable = $args->public;
    }
    if (null === $args->exclude_from_search) {
        $args->exclude_from_search = $args->internal;
    }
    if (null === $args->show_in_admin_all_list) {
        $args->show_in_admin_all_list = !$args->internal;
    }
    if (null === $args->show_in_admin_status_list) {
        $args->show_in_admin_status_list = !$args->internal;
    }
    if (false === $args->label) {
        $args->label = $post_status;
    }
    if (false === $args->label_count) {
        $args->label_count = array($args->label, $args->label);
    }
    $wp_post_statuses[$post_status] = $args;
    return $args;
}