--- a/wp/wp-includes/post.php Wed Sep 21 18:19:35 2022 +0200
+++ b/wp/wp-includes/post.php Tue Sep 27 16:37:53 2022 +0200
@@ -18,6 +18,8 @@
* @since 2.9.0
*/
function create_initial_post_types() {
+ WP_Post_Type::reset_default_labels();
+
register_post_type(
'post',
array(
@@ -126,16 +128,39 @@
register_post_type(
'nav_menu_item',
array(
- 'labels' => array(
+ 'labels' => array(
'name' => __( 'Navigation Menu Items' ),
'singular_name' => __( 'Navigation Menu Item' ),
),
- 'public' => false,
- '_builtin' => true, /* internal use only. don't use this when registering your own post type. */
- 'hierarchical' => false,
- 'rewrite' => false,
- 'delete_with_user' => false,
- 'query_var' => false,
+ 'public' => false,
+ '_builtin' => true, /* internal use only. don't use this when registering your own post type. */
+ 'hierarchical' => false,
+ 'rewrite' => false,
+ 'delete_with_user' => false,
+ 'query_var' => false,
+ 'map_meta_cap' => true,
+ 'capability_type' => array( 'edit_theme_options', 'edit_theme_options' ),
+ 'capabilities' => array(
+ // Meta Capabilities.
+ 'edit_post' => 'edit_post',
+ 'read_post' => 'read_post',
+ 'delete_post' => 'delete_post',
+ // Primitive Capabilities.
+ 'edit_posts' => 'edit_theme_options',
+ 'edit_others_posts' => 'edit_theme_options',
+ 'delete_posts' => 'edit_theme_options',
+ 'publish_posts' => 'edit_theme_options',
+ 'read_private_posts' => 'edit_theme_options',
+ 'read' => 'read',
+ 'delete_private_posts' => 'edit_theme_options',
+ 'delete_published_posts' => 'edit_theme_options',
+ 'delete_others_posts' => 'edit_theme_options',
+ 'edit_private_posts' => 'edit_theme_options',
+ 'edit_published_posts' => 'edit_theme_options',
+ ),
+ 'show_in_rest' => true,
+ 'rest_base' => 'menu-items',
+ 'rest_controller_class' => 'WP_REST_Menu_Items_Controller',
)
);
@@ -310,14 +335,14 @@
'wp_template',
array(
'labels' => array(
- 'name' => __( 'Templates' ),
- 'singular_name' => __( 'Template' ),
+ 'name' => _x( 'Templates', 'post type general name' ),
+ 'singular_name' => _x( 'Template', 'post type singular name' ),
'add_new' => _x( 'Add New', 'Template' ),
'add_new_item' => __( 'Add New Template' ),
'new_item' => __( 'New Template' ),
'edit_item' => __( 'Edit Template' ),
'view_item' => __( 'View Template' ),
- 'all_items' => __( 'All Templates' ),
+ 'all_items' => __( 'Templates' ),
'search_items' => __( 'Search Templates' ),
'parent_item_colon' => __( 'Parent Template:' ),
'not_found' => __( 'No templates found.' ),
@@ -361,6 +386,150 @@
'excerpt',
'editor',
'revisions',
+ 'author',
+ ),
+ )
+ );
+
+ register_post_type(
+ 'wp_template_part',
+ array(
+ 'labels' => array(
+ 'name' => _x( 'Template Parts', 'post type general name' ),
+ 'singular_name' => _x( 'Template Part', 'post type singular name' ),
+ 'add_new' => _x( 'Add New', 'Template Part' ),
+ 'add_new_item' => __( 'Add New Template Part' ),
+ 'new_item' => __( 'New Template Part' ),
+ 'edit_item' => __( 'Edit Template Part' ),
+ 'view_item' => __( 'View Template Part' ),
+ 'all_items' => __( 'Template Parts' ),
+ 'search_items' => __( 'Search Template Parts' ),
+ 'parent_item_colon' => __( 'Parent Template Part:' ),
+ 'not_found' => __( 'No template parts found.' ),
+ 'not_found_in_trash' => __( 'No template parts found in Trash.' ),
+ 'archives' => __( 'Template part archives' ),
+ 'insert_into_item' => __( 'Insert into template part' ),
+ 'uploaded_to_this_item' => __( 'Uploaded to this template part' ),
+ 'filter_items_list' => __( 'Filter template parts list' ),
+ 'items_list_navigation' => __( 'Template parts list navigation' ),
+ 'items_list' => __( 'Template parts list' ),
+ ),
+ 'description' => __( 'Template parts to include in your templates.' ),
+ 'public' => false,
+ '_builtin' => true, /* internal use only. don't use this when registering your own post type. */
+ 'has_archive' => false,
+ 'show_ui' => false,
+ 'show_in_menu' => false,
+ 'show_in_rest' => true,
+ 'rewrite' => false,
+ 'rest_base' => 'template-parts',
+ 'rest_controller_class' => 'WP_REST_Templates_Controller',
+ 'map_meta_cap' => true,
+ 'capabilities' => array(
+ 'create_posts' => 'edit_theme_options',
+ 'delete_posts' => 'edit_theme_options',
+ 'delete_others_posts' => 'edit_theme_options',
+ 'delete_private_posts' => 'edit_theme_options',
+ 'delete_published_posts' => 'edit_theme_options',
+ 'edit_posts' => 'edit_theme_options',
+ 'edit_others_posts' => 'edit_theme_options',
+ 'edit_private_posts' => 'edit_theme_options',
+ 'edit_published_posts' => 'edit_theme_options',
+ 'publish_posts' => 'edit_theme_options',
+ 'read' => 'edit_theme_options',
+ 'read_private_posts' => 'edit_theme_options',
+ ),
+ 'supports' => array(
+ 'title',
+ 'slug',
+ 'excerpt',
+ 'editor',
+ 'revisions',
+ 'author',
+ ),
+ )
+ );
+
+ register_post_type(
+ 'wp_global_styles',
+ array(
+ 'label' => _x( 'Global Styles', 'post type general name' ),
+ 'description' => __( 'Global styles to include in themes.' ),
+ 'public' => false,
+ '_builtin' => true, /* internal use only. don't use this when registering your own post type. */
+ 'show_ui' => false,
+ 'show_in_rest' => false,
+ 'rewrite' => false,
+ 'capabilities' => array(
+ 'read' => 'edit_theme_options',
+ 'create_posts' => 'edit_theme_options',
+ 'edit_posts' => 'edit_theme_options',
+ 'edit_published_posts' => 'edit_theme_options',
+ 'delete_published_posts' => 'edit_theme_options',
+ 'edit_others_posts' => 'edit_theme_options',
+ 'delete_others_posts' => 'edit_theme_options',
+ ),
+ 'map_meta_cap' => true,
+ 'supports' => array(
+ 'title',
+ 'editor',
+ 'revisions',
+ ),
+ )
+ );
+
+ register_post_type(
+ 'wp_navigation',
+ array(
+ 'labels' => array(
+ 'name' => _x( 'Navigation Menus', 'post type general name' ),
+ 'singular_name' => _x( 'Navigation Menu', 'post type singular name' ),
+ 'add_new' => _x( 'Add New', 'Navigation Menu' ),
+ 'add_new_item' => __( 'Add New Navigation Menu' ),
+ 'new_item' => __( 'New Navigation Menu' ),
+ 'edit_item' => __( 'Edit Navigation Menu' ),
+ 'view_item' => __( 'View Navigation Menu' ),
+ 'all_items' => __( 'Navigation Menus' ),
+ 'search_items' => __( 'Search Navigation Menus' ),
+ 'parent_item_colon' => __( 'Parent Navigation Menu:' ),
+ 'not_found' => __( 'No Navigation Menu found.' ),
+ 'not_found_in_trash' => __( 'No Navigation Menu found in Trash.' ),
+ 'archives' => __( 'Navigation Menu archives' ),
+ 'insert_into_item' => __( 'Insert into Navigation Menu' ),
+ 'uploaded_to_this_item' => __( 'Uploaded to this Navigation Menu' ),
+ 'filter_items_list' => __( 'Filter Navigation Menu list' ),
+ 'items_list_navigation' => __( 'Navigation Menus list navigation' ),
+ 'items_list' => __( 'Navigation Menus list' ),
+ ),
+ 'description' => __( 'Navigation menus that can be inserted into your site.' ),
+ 'public' => false,
+ '_builtin' => true, /* internal use only. don't use this when registering your own post type. */
+ 'has_archive' => false,
+ 'show_ui' => true,
+ 'show_in_menu' => false,
+ 'show_in_admin_bar' => false,
+ 'show_in_rest' => true,
+ 'rewrite' => false,
+ 'map_meta_cap' => true,
+ 'capabilities' => array(
+ 'edit_others_posts' => 'edit_theme_options',
+ 'delete_posts' => 'edit_theme_options',
+ 'publish_posts' => 'edit_theme_options',
+ 'create_posts' => 'edit_theme_options',
+ 'read_private_posts' => 'edit_theme_options',
+ 'delete_private_posts' => 'edit_theme_options',
+ 'delete_published_posts' => 'edit_theme_options',
+ 'delete_others_posts' => 'edit_theme_options',
+ 'edit_private_posts' => 'edit_theme_options',
+ 'edit_published_posts' => 'edit_theme_options',
+ 'edit_posts' => 'edit_theme_options',
+ ),
+ 'rest_base' => 'navigation',
+ 'rest_controller_class' => 'WP_REST_Posts_Controller',
+ 'supports' => array(
+ 'title',
+ 'editor',
+ 'revisions',
),
)
);
@@ -807,9 +976,9 @@
*
* @global WP_Post $post Global post object.
*
- * @param int|WP_Post|null $post Optional. Post ID or post object. `null`, `false`, `0` and other PHP falsey
- * values return the current global post inside the loop. A numerically valid post
- * ID that points to a non-existent post returns `null`. Defaults to global $post.
+ * @param int|WP_Post|null $post Optional. Post ID or post object. `null`, `false`, `0` and other PHP falsey values
+ * return the current global post inside the loop. A numerically valid post ID that
+ * points to a non-existent post returns `null`. Defaults to global $post.
* @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which
* correspond to a WP_Post object, an associative array, or a numeric array,
* respectively. Default OBJECT.
@@ -949,7 +1118,7 @@
*
* @since 2.0.0
*
- * @param int|WP_Post $post Optional. Post ID or post object. Defaults to global $post..
+ * @param int|WP_Post $post Optional. Post ID or post object. Defaults to global $post.
* @return string|false Post status on success, false on failure.
*/
function get_post_status( $post = null ) {
@@ -1077,7 +1246,7 @@
*
* @since 3.0.0
*
- * @global array $wp_post_statuses Inserts new post status object into the list
+ * @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 {
@@ -1201,12 +1370,12 @@
*
* @since 3.0.0
*
- * @global array $wp_post_statuses List of post statuses.
+ * @global stdClass[] $wp_post_statuses List of post statuses.
*
* @see register_post_status()
*
* @param string $post_status The name of a registered post status.
- * @return object|null A post status object.
+ * @return stdClass|null A post status object.
*/
function get_post_status_object( $post_status ) {
global $wp_post_statuses;
@@ -1223,7 +1392,7 @@
*
* @since 3.0.0
*
- * @global array $wp_post_statuses List of post statuses.
+ * @global stdClass[] $wp_post_statuses List of post statuses.
*
* @see register_post_status()
*
@@ -1233,7 +1402,7 @@
* @param string $operator Optional. The logical operation to perform. 'or' means only one element
* from the array needs to match; 'and' means all elements must match.
* Default 'and'.
- * @return array A list of post status names or objects.
+ * @return string[]|stdClass[] A list of post status names or objects.
*/
function get_post_stati( $args = array(), $output = 'names', $operator = 'and' ) {
global $wp_post_statuses;
@@ -1371,6 +1540,7 @@
* arguments to register the post type in REST API.
* @since 5.0.0 The `template` and `template_lock` arguments were added.
* @since 5.3.0 The `supports` argument will now accept an array of arguments for a feature.
+ * @since 5.9.0 The `rest_namespace` argument was added.
*
* @global array $wp_post_types List of post types.
*
@@ -1391,7 +1561,7 @@
* @type bool $public Whether a post type is intended for use publicly either via
* the admin interface or by front-end users. While the default
* settings of $exclude_from_search, $publicly_queryable, $show_ui,
- * and $show_in_nav_menus are inherited from public, each does not
+ * and $show_in_nav_menus are inherited from $public, each does not
* rely on this relationship and controls a very specific intention.
* Default false.
* @type bool $hierarchical Whether the post type is hierarchical (e.g. page). Default false.
@@ -1408,8 +1578,8 @@
* @type bool|string $show_in_menu Where to show the post type in the admin menu. To work, $show_ui
* must be true. If true, the post type is shown in its own top level
* menu. If false, no menu is shown. If a string of an existing top
- * level menu (eg. 'tools.php' or 'edit.php?post_type=page'), the post
- * type will be placed as a sub-menu of that.
+ * level menu ('tools.php' or 'edit.php?post_type=page', for example), the
+ * post type will be placed as a sub-menu of that.
* Default is value of $show_ui.
* @type bool $show_in_nav_menus Makes this post type available for selection in navigation menus.
* Default is value of $public.
@@ -1417,17 +1587,18 @@
* of $show_in_menu.
* @type bool $show_in_rest Whether to include the post type in the REST API. Set this to true
* for the post type to be available in the block editor.
- * @type string $rest_base To change the base url of REST API route. Default is $post_type.
- * @type string $rest_controller_class REST API Controller class name. Default is 'WP_REST_Posts_Controller'.
+ * @type string $rest_base To change the base URL of REST API route. Default is $post_type.
+ * @type string $rest_namespace To change the namespace URL of REST API route. Default is wp/v2.
+ * @type string $rest_controller_class REST API controller class name. Default is 'WP_REST_Posts_Controller'.
* @type int $menu_position The position in the menu order the post type should appear. To work,
* $show_in_menu must be true. Default null (at the bottom).
- * @type string $menu_icon The url to the icon to be used for this menu. Pass a base64-encoded
+ * @type string $menu_icon The URL to the icon to be used for this menu. Pass a base64-encoded
* SVG using a data URI, which will be colored to match the color scheme
* -- this should begin with 'data:image/svg+xml;base64,'. Pass the name
* of a Dashicons helper class to use a font icon, e.g.
* 'dashicons-chart-pie'. Pass 'none' to leave div.wp-menu-image empty
* so an icon can be added via CSS. Defaults to use the posts icon.
- * @type string $capability_type The string to use to build the read, edit, and delete capabilities.
+ * @type string|array $capability_type The string to use to build the read, edit, and delete capabilities.
* May be passed as an array to allow for alternative plurals when using
* this argument as a base to construct the capabilities, e.g.
* array('story', 'stories'). Default 'post'.
@@ -1538,13 +1709,30 @@
*/
do_action( 'registered_post_type', $post_type, $post_type_object );
+ /**
+ * Fires after a specific post type is registered.
+ *
+ * The dynamic portion of the filter name, `$post_type`, refers to the post type key.
+ *
+ * Possible hook names include:
+ *
+ * - `registered_post_type_post`
+ * - `registered_post_type_page`
+ *
+ * @since 6.0.0
+ *
+ * @param string $post_type Post type.
+ * @param WP_Post_Type $post_type_object Arguments used to register the post type.
+ */
+ do_action( "registered_post_type_{$post_type}", $post_type, $post_type_object );
+
return $post_type_object;
}
/**
* Unregisters a post type.
*
- * Can not be used to unregister built-in post types.
+ * Cannot be used to unregister built-in post types.
*
* @since 4.5.0
*
@@ -1786,46 +1974,7 @@
* @return object Object with all the labels as member variables.
*/
function get_post_type_labels( $post_type_object ) {
- $nohier_vs_hier_defaults = array(
- 'name' => array( _x( 'Posts', 'post type general name' ), _x( 'Pages', 'post type general name' ) ),
- 'singular_name' => array( _x( 'Post', 'post type singular name' ), _x( 'Page', 'post type singular name' ) ),
- 'add_new' => array( _x( 'Add New', 'post' ), _x( 'Add New', 'page' ) ),
- 'add_new_item' => array( __( 'Add New Post' ), __( 'Add New Page' ) ),
- 'edit_item' => array( __( 'Edit Post' ), __( 'Edit Page' ) ),
- 'new_item' => array( __( 'New Post' ), __( 'New Page' ) ),
- 'view_item' => array( __( 'View Post' ), __( 'View Page' ) ),
- 'view_items' => array( __( 'View Posts' ), __( 'View Pages' ) ),
- 'search_items' => array( __( 'Search Posts' ), __( 'Search Pages' ) ),
- 'not_found' => array( __( 'No posts found.' ), __( 'No pages found.' ) ),
- 'not_found_in_trash' => array( __( 'No posts found in Trash.' ), __( 'No pages found in Trash.' ) ),
- 'parent_item_colon' => array( null, __( 'Parent Page:' ) ),
- 'all_items' => array( __( 'All Posts' ), __( 'All Pages' ) ),
- 'archives' => array( __( 'Post Archives' ), __( 'Page Archives' ) ),
- 'attributes' => array( __( 'Post Attributes' ), __( 'Page Attributes' ) ),
- 'insert_into_item' => array( __( 'Insert into post' ), __( 'Insert into page' ) ),
- 'uploaded_to_this_item' => array( __( 'Uploaded to this post' ), __( 'Uploaded to this page' ) ),
- 'featured_image' => array( _x( 'Featured image', 'post' ), _x( 'Featured image', 'page' ) ),
- 'set_featured_image' => array( _x( 'Set featured image', 'post' ), _x( 'Set featured image', 'page' ) ),
- 'remove_featured_image' => array( _x( 'Remove featured image', 'post' ), _x( 'Remove featured image', 'page' ) ),
- 'use_featured_image' => array( _x( 'Use as featured image', 'post' ), _x( 'Use as featured image', 'page' ) ),
- 'filter_items_list' => array( __( 'Filter posts list' ), __( 'Filter pages list' ) ),
- 'filter_by_date' => array( __( 'Filter by date' ), __( 'Filter by date' ) ),
- 'items_list_navigation' => array( __( 'Posts list navigation' ), __( 'Pages list navigation' ) ),
- 'items_list' => array( __( 'Posts list' ), __( 'Pages list' ) ),
- 'item_published' => array( __( 'Post published.' ), __( 'Page published.' ) ),
- 'item_published_privately' => array( __( 'Post published privately.' ), __( 'Page published privately.' ) ),
- 'item_reverted_to_draft' => array( __( 'Post reverted to draft.' ), __( 'Page reverted to draft.' ) ),
- 'item_scheduled' => array( __( 'Post scheduled.' ), __( 'Page scheduled.' ) ),
- 'item_updated' => array( __( 'Post updated.' ), __( 'Page updated.' ) ),
- 'item_link' => array(
- _x( 'Post Link', 'navigation link block title' ),
- _x( 'Page Link', 'navigation link block title' ),
- ),
- 'item_link_description' => array(
- _x( 'A link to a post.', 'navigation link block description' ),
- _x( 'A link to a page.', 'navigation link block description' ),
- ),
- );
+ $nohier_vs_hier_defaults = WP_Post_Type::get_default_labels();
$nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name'];
@@ -2084,6 +2233,7 @@
* @since 4.4.0
* @since 4.5.0 Added the ability to pass a post type name in addition to object.
* @since 4.6.0 Converted the `$post_type` parameter to accept a `WP_Post_Type` object.
+ * @since 5.9.0 Added `is_post_type_viewable` hook to filter the result.
*
* @param string|WP_Post_Type $post_type Post type name or object.
* @return bool Whether the post type should be considered viewable.
@@ -2100,16 +2250,33 @@
return false;
}
- return $post_type->publicly_queryable || ( $post_type->_builtin && $post_type->public );
+ $is_viewable = $post_type->publicly_queryable || ( $post_type->_builtin && $post_type->public );
+
+ /**
+ * Filters whether a post type is considered "viewable".
+ *
+ * The returned filtered value must be a boolean type to ensure
+ * `is_post_type_viewable()` only returns a boolean. This strictness
+ * is by design to maintain backwards-compatibility and guard against
+ * potential type errors in PHP 8.1+. Non-boolean values (even falsey
+ * and truthy values) will result in the function returning false.
+ *
+ * @since 5.9.0
+ *
+ * @param bool $is_viewable Whether the post type is "viewable" (strict type).
+ * @param WP_Post_Type $post_type Post type object.
+ */
+ return true === apply_filters( 'is_post_type_viewable', $is_viewable, $post_type );
}
/**
* Determine whether a post status is considered "viewable".
*
- * For built-in post statuses such as publish and private, the 'public' value will be evaluted.
+ * For built-in post statuses such as publish and private, the 'public' value will be evaluated.
* For all others, the 'publicly_queryable' value will be used.
*
* @since 5.7.0
+ * @since 5.9.0 Added `is_post_status_viewable` hook to filter the result.
*
* @param string|stdClass $post_status Post status name or object.
* @return bool Whether the post status should be considered viewable.
@@ -2130,7 +2297,23 @@
return false;
}
- return $post_status->publicly_queryable || ( $post_status->_builtin && $post_status->public );
+ $is_viewable = $post_status->publicly_queryable || ( $post_status->_builtin && $post_status->public );
+
+ /**
+ * Filters whether a post status is considered "viewable".
+ *
+ * The returned filtered value must be a boolean type to ensure
+ * `is_post_status_viewable()` only returns a boolean. This strictness
+ * is by design to maintain backwards-compatibility and guard against
+ * potential type errors in PHP 8.1+. Non-boolean values (even falsey
+ * and truthy values) will result in the function returning false.
+ *
+ * @since 5.9.0
+ *
+ * @param bool $is_viewable Whether the post status is "viewable" (strict type).
+ * @param stdClass $post_status Post status object.
+ */
+ return true === apply_filters( 'is_post_status_viewable', $is_viewable, $post_status );
}
/**
@@ -2175,8 +2358,7 @@
* @see WP_Query::parse_query()
*
* @param array $args {
- * Optional. Arguments to retrieve posts. See WP_Query::parse_query() for all
- * available arguments.
+ * Optional. Arguments to retrieve posts. See WP_Query::parse_query() for all available arguments.
*
* @type int $numberposts Total number of posts to retrieve. Is an alias of `$posts_per_page`
* in WP_Query. Accepts -1 for all. Default 5.
@@ -2274,7 +2456,7 @@
* @return bool True on success, false on failure.
*/
function delete_post_meta( $post_id, $meta_key, $meta_value = '' ) {
- // Make sure meta is added to the post, not a revision.
+ // Make sure meta is deleted from the post, not from a revision.
$the_post = wp_is_post_revision( $post_id );
if ( $the_post ) {
$post_id = $the_post;
@@ -2326,7 +2508,7 @@
* is the same as the one that is already in the database.
*/
function update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ) {
- // Make sure meta is added to the post, not a revision.
+ // Make sure meta is updated for the post, not for a revision.
$the_post = wp_is_post_revision( $post_id );
if ( $the_post ) {
$post_id = $the_post;
@@ -2388,8 +2570,10 @@
*
* @since 1.2.0
*
- * @param int $post_id Optional. Post ID. Default is ID of the global $post.
- * @return array Post meta for the given post.
+ * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`.
+ * @return mixed An array of values.
+ * False for an invalid `$post_id` (non-numeric, zero, or negative value).
+ * An empty string if a valid but non-existing post ID is passed.
*/
function get_post_custom( $post_id = 0 ) {
$post_id = absint( $post_id );
@@ -2407,7 +2591,7 @@
*
* @since 1.2.0
*
- * @param int $post_id Optional. Post ID. Default is ID of the global $post.
+ * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`.
* @return array|void Array of the keys, if retrieved.
*/
function get_post_custom_keys( $post_id = 0 ) {
@@ -2432,7 +2616,7 @@
* @since 1.2.0
*
* @param string $key Optional. Meta field key. Default empty.
- * @param int $post_id Optional. Post ID. Default is ID of the global $post.
+ * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`.
* @return array|null Meta field values.
*/
function get_post_custom_values( $key = '', $post_id = 0 ) {
@@ -2457,7 +2641,7 @@
*
* @since 2.7.0
*
- * @param int $post_id Optional. Post ID. Default is ID of the global $post.
+ * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`.
* @return bool Whether post is sticky.
*/
function is_sticky( $post_id = 0 ) {
@@ -2711,7 +2895,7 @@
$updated = false;
if ( ! is_array( $stickies ) ) {
- $stickies = array( $post_id );
+ $stickies = array();
} else {
$stickies = array_unique( array_map( 'intval', $stickies ) );
}
@@ -2818,7 +3002,7 @@
*
* @param string $type Optional. Post type to retrieve count. Default 'post'.
* @param string $perm Optional. 'readable' or empty. Default empty.
- * @return object Number of posts for each status.
+ * @return stdClass Number of posts for each status.
*/
function wp_count_posts( $type = 'post', $perm = '' ) {
global $wpdb;
@@ -2871,11 +3055,11 @@
*
* @since 3.7.0
*
- * @param object $counts An object containing the current post_type's post
- * counts by status.
- * @param string $type Post type.
- * @param string $perm The permission to determine if the posts are 'readable'
- * by the current user.
+ * @param stdClass $counts An object containing the current post_type's post
+ * counts by status.
+ * @param string $type Post type.
+ * @param string $perm The permission to determine if the posts are 'readable'
+ * by the current user.
*/
return apply_filters( 'wp_count_posts', $counts, $type, $perm );
}
@@ -2894,7 +3078,7 @@
*
* @param string|string[] $mime_type Optional. Array or comma-separated list of
* MIME patterns. Default empty.
- * @return object An object containing the attachment counts by mime type.
+ * @return stdClass An object containing the attachment counts by mime type.
*/
function wp_count_attachments( $mime_type = '' ) {
global $wpdb;
@@ -2913,7 +3097,7 @@
*
* @since 3.7.0
*
- * @param object $counts An object containing the attachment counts by
+ * @param stdClass $counts An object containing the attachment counts by
* mime type.
* @param string|string[] $mime_type Array or comma-separated list of MIME patterns.
*/
@@ -2940,7 +3124,7 @@
),
),
'audio' => array(
- __( 'Audio' ),
+ _x( 'Audio', 'file type group' ),
__( 'Manage Audio' ),
/* translators: %s: Number of audio files. */
_n_noop(
@@ -2949,7 +3133,7 @@
),
),
'video' => array(
- __( 'Video' ),
+ _x( 'Video', 'file type group' ),
__( 'Manage Video' ),
/* translators: %s: Number of video files. */
_n_noop(
@@ -3184,9 +3368,9 @@
*
* @since 4.4.0
*
- * @param bool|null $delete Whether to go forward with deletion.
- * @param WP_Post $post Post object.
- * @param bool $force_delete Whether to bypass the Trash.
+ * @param WP_Post|false|null $delete Whether to go forward with deletion. @TODO description
+ * @param WP_Post $post Post object.
+ * @param bool $force_delete Whether to bypass the Trash.
*/
$check = apply_filters( 'pre_delete_post', null, $post, $force_delete );
if ( null !== $check ) {
@@ -3235,7 +3419,7 @@
wp_defer_comment_counting( true );
- $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d", $postid ) );
+ $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d ORDER BY comment_ID DESC", $postid ) );
foreach ( $comment_ids as $comment_id ) {
wp_delete_comment( $comment_id, true );
}
@@ -3340,8 +3524,8 @@
*
* @see wp_delete_post()
*
- * @param int $post_id Optional. Post ID. Default is ID of the global $post
- * if EMPTY_TRASH_DAYS equals true.
+ * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`
+ * if `EMPTY_TRASH_DAYS` equals true.
* @return WP_Post|false|null Post data on success, false or null on failure.
*/
function wp_trash_post( $post_id = 0 ) {
@@ -3417,7 +3601,7 @@
* @since 5.6.0 An untrashed post is now returned to 'draft' status by default, except for
* attachments which are returned to their original 'inherit' status.
*
- * @param int $post_id Optional. Post ID. Default is ID of the global `$post`.
+ * @param int $post_id Optional. Post ID. Default is the ID of the global `$post`.
* @return WP_Post|false|null Post data on success, false or null on failure.
*/
function wp_untrash_post( $post_id = 0 ) {
@@ -3794,7 +3978,7 @@
* @type string $post_date The date of the post. Default is the current time.
* @type string $post_date_gmt The date of the post in the GMT timezone. Default is
* the value of `$post_date`.
- * @type mixed $post_content The post content. Default empty.
+ * @type string $post_content The post content. Default empty.
* @type string $post_content_filtered The filtered post content. Default empty.
* @type string $post_title The post title. Default empty.
* @type string $post_excerpt The post excerpt. Default empty.
@@ -3824,7 +4008,14 @@
* @type int[] $post_category Array of category IDs.
* Defaults to value of the 'default_category' option.
* @type array $tags_input Array of tag names, slugs, or IDs. Default empty.
- * @type array $tax_input Array of taxonomy terms keyed by their taxonomy name. Default empty.
+ * @type array $tax_input An array of taxonomy terms keyed by their taxonomy name.
+ * If the taxonomy is hierarchical, the term list needs to be
+ * either an array of term IDs or a comma-separated string of IDs.
+ * If the taxonomy is non-hierarchical, the term list can be an array
+ * that contains term names or slugs, or a comma-separated string
+ * of names or slugs. This is because, in hierarchical taxonomy,
+ * child terms can have the same names with different parent terms,
+ * so the only way to connect them is using ID. Default empty.
* @type array $meta_input Array of post meta values keyed by their post meta key. Default empty.
* }
* @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false.
@@ -4156,27 +4347,31 @@
* Filters attachment post data before it is updated in or added to the database.
*
* @since 3.9.0
- * @since 5.4.1 `$unsanitized_postarr` argument added.
+ * @since 5.4.1 The `$unsanitized_postarr` parameter was added.
+ * @since 6.0.0 The `$update` parameter was added.
*
* @param array $data An array of slashed, sanitized, and processed attachment post data.
* @param array $postarr An array of slashed and sanitized attachment post data, but not processed.
* @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed attachment post data
* as originally passed to wp_insert_post().
+ * @param bool $update Whether this is an existing attachment post being updated.
*/
- $data = apply_filters( 'wp_insert_attachment_data', $data, $postarr, $unsanitized_postarr );
+ $data = apply_filters( 'wp_insert_attachment_data', $data, $postarr, $unsanitized_postarr, $update );
} else {
/**
* Filters slashed post data just before it is inserted into the database.
*
* @since 2.7.0
- * @since 5.4.1 `$unsanitized_postarr` argument added.
+ * @since 5.4.1 The `$unsanitized_postarr` parameter was added.
+ * @since 6.0.0 The `$update` parameter was added.
*
* @param array $data An array of slashed, sanitized, and processed post data.
* @param array $postarr An array of sanitized (and slashed) but otherwise unmodified post data.
* @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed post data as
* originally passed to wp_insert_post().
+ * @param bool $update Whether this is an existing post being updated.
*/
- $data = apply_filters( 'wp_insert_post_data', $data, $postarr, $unsanitized_postarr );
+ $data = apply_filters( 'wp_insert_post_data', $data, $postarr, $unsanitized_postarr, $update );
}
$data = wp_unslash( $data );
@@ -4411,6 +4606,11 @@
* The dynamic portion of the hook name, `$post->post_type`, refers to
* the post type slug.
*
+ * Possible hook names include:
+ *
+ * - `edit_post_post`
+ * - `edit_post_page`
+ *
* @since 5.1.0
*
* @param int $post_ID Post ID.
@@ -4448,6 +4648,11 @@
* The dynamic portion of the hook name, `$post->post_type`, refers to
* the post type slug.
*
+ * Possible hook names include:
+ *
+ * - `save_post_post`
+ * - `save_post_page`
+ *
* @since 3.7.0
*
* @param int $post_ID Post ID.
@@ -4924,7 +5129,7 @@
if ( $decoded_slug === $slug ) {
$slug = substr( $slug, 0, $length );
} else {
- $slug = utf8_uri_encode( $decoded_slug, $length );
+ $slug = utf8_uri_encode( $decoded_slug, $length, true );
}
}
@@ -5103,6 +5308,12 @@
* The dynamic portions of the hook name, `$new_status` and `$old_status`,
* refer to the old and new post statuses, respectively.
*
+ * Possible hook names include:
+ *
+ * - `draft_to_publish`
+ * - `publish_to_trash`
+ * - `pending_to_draft`
+ *
* @since 2.3.0
*
* @param WP_Post $post Post object.
@@ -5141,11 +5352,13 @@
* transitioned to a status, use the {@see 'transition_post_status'} hook instead.
*
* @since 2.3.0
- *
- * @param int $post_id Post ID.
- * @param WP_Post $post Post object.
+ * @since 5.9.0 Added `$old_status` parameter.
+ *
+ * @param int $post_id Post ID.
+ * @param WP_Post $post Post object.
+ * @param string $old_status Old post status.
*/
- do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );
+ do_action( "{$new_status}_{$post->post_type}", $post->ID, $post, $old_status );
}
/**
@@ -5491,6 +5704,8 @@
if ( $foundid ) {
return get_post( $foundid, $output );
}
+
+ return null;
}
/**
@@ -5548,6 +5763,8 @@
if ( $page ) {
return get_post( $page, $output );
}
+
+ return null;
}
/**
@@ -6127,9 +6344,9 @@
*
* @since 5.5.0
*
- * @param bool|null $delete Whether to go forward with deletion.
- * @param WP_Post $post Post object.
- * @param bool $force_delete Whether to bypass the Trash.
+ * @param WP_Post|false|null $delete Whether to go forward with deletion. @TODO description
+ * @param WP_Post $post Post object.
+ * @param bool $force_delete Whether to bypass the Trash.
*/
$check = apply_filters( 'pre_delete_attachment', null, $post, $force_delete );
if ( null !== $check ) {
@@ -6143,7 +6360,7 @@
$backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true );
$file = get_attached_file( $post_id );
- if ( is_multisite() ) {
+ if ( is_multisite() && is_string( $file ) && ! empty( $file ) ) {
clean_dirsize_cache( $file );
}
@@ -6166,7 +6383,7 @@
wp_defer_comment_counting( true );
- $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d", $post_id ) );
+ $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d ORDER BY comment_ID DESC", $post_id ) );
foreach ( $comment_ids as $comment_id ) {
wp_delete_comment( $comment_id, true );
}
@@ -6301,6 +6518,7 @@
* @type array $sizes Keys are size slugs, each value is an array containing
* 'file', 'width', 'height', and 'mime-type'.
* @type array $image_meta Image metadata.
+ * @type int $filesize File size of the attachment.
* }
*/
function wp_get_attachment_metadata( $attachment_id = 0, $unfiltered = false ) {
@@ -6376,7 +6594,7 @@
*
* @since 2.1.0
*
- * @global string $pagenow
+ * @global string $pagenow The filename of the current screen.
*
* @param int $attachment_id Optional. Attachment post ID. Defaults to global $post.
* @return string|false Attachment URL, otherwise false.
@@ -6485,7 +6703,7 @@
*
* @since 2.1.0
*
- * @param int $post_id Optional. Attachment ID. Default 0.
+ * @param int $post_id Optional. Attachment ID. Default is the ID of the global `$post`.
* @return string|false Thumbnail file path on success, false on failure.
*/
function wp_get_attachment_thumb_file( $post_id = 0 ) {
@@ -6525,7 +6743,7 @@
*
* @since 2.1.0
*
- * @param int $post_id Optional. Attachment ID. Default 0.
+ * @param int $post_id Optional. Attachment ID. Default is the ID of the global `$post`.
* @return string|false Thumbnail URL on success, false on failure.
*/
function wp_get_attachment_thumb_url( $post_id = 0 ) {
@@ -7134,9 +7352,14 @@
return;
}
+ $data = array();
foreach ( $posts as $post ) {
- wp_cache_add( $post->ID, $post, 'posts' );
- }
+ if ( empty( $post->filter ) || 'raw' !== $post->filter ) {
+ $post = sanitize_post( $post, 'raw' );
+ }
+ $data[ $post->ID ] = $post;
+ }
+ wp_cache_add_multiple( $data, 'posts' );
}
/**
@@ -7389,7 +7612,7 @@
* @since 2.3.0
* @access private
*
- * @param int $post_id The ID in the database table of the post being published.
+ * @param int $post_id The ID of the post being published.
*/
function _publish_post_hook( $post_id ) {
if ( defined( 'XMLRPC_REQUEST' ) ) {
@@ -7426,12 +7649,13 @@
* Returns the ID of the post's parent.
*
* @since 3.1.0
- *
- * @param int|WP_Post $post Post ID or post object. Defaults to global $post.
+ * @since 5.9.0 The `$post` parameter was made optional.
+ *
+ * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to global $post.
* @return int|false Post parent ID (which can be 0 if there is no parent),
* or false if the post does not exist.
*/
-function wp_get_post_parent_id( $post ) {
+function wp_get_post_parent_id( $post = null ) {
$post = get_post( $post );
if ( ! $post || is_wp_error( $post ) ) {
return false;
@@ -7644,7 +7868,7 @@
* @since 4.5.0
* @access private
*
- * @param string $post_name Slug.
+ * @param string $post_name Post slug.
* @param int $post_ID Optional. Post ID that should be ignored. Default 0.
*/
function wp_add_trashed_suffix_to_post_name_for_trashed_posts( $post_name, $post_ID = 0 ) {