diff -r be944660c56a -r 3d72ae0968f4 wp/wp-includes/post.php --- 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 ) {