diff -r c7c34916027a -r 177826044cd9 wp/wp-admin/includes/post.php --- a/wp/wp-admin/includes/post.php Mon Oct 14 18:06:33 2019 +0200 +++ b/wp/wp-admin/includes/post.php Mon Oct 14 18:28:13 2019 +0200 @@ -19,44 +19,52 @@ */ function _wp_translate_postdata( $update = false, $post_data = null ) { - if ( empty($post_data) ) + if ( empty( $post_data ) ) { $post_data = &$_POST; + } - if ( $update ) + if ( $update ) { $post_data['ID'] = (int) $post_data['post_ID']; + } $ptype = get_post_type_object( $post_data['post_type'] ); if ( $update && ! current_user_can( 'edit_post', $post_data['ID'] ) ) { - if ( 'page' == $post_data['post_type'] ) + if ( 'page' == $post_data['post_type'] ) { return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to edit pages as this user.' ) ); - else + } else { return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to edit posts as this user.' ) ); + } } elseif ( ! $update && ! current_user_can( $ptype->cap->create_posts ) ) { - if ( 'page' == $post_data['post_type'] ) + if ( 'page' == $post_data['post_type'] ) { return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to create pages as this user.' ) ); - else + } else { return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to create posts as this user.' ) ); + } } - if ( isset( $post_data['content'] ) ) + if ( isset( $post_data['content'] ) ) { $post_data['post_content'] = $post_data['content']; + } - if ( isset( $post_data['excerpt'] ) ) + if ( isset( $post_data['excerpt'] ) ) { $post_data['post_excerpt'] = $post_data['excerpt']; + } - if ( isset( $post_data['parent_id'] ) ) + if ( isset( $post_data['parent_id'] ) ) { $post_data['post_parent'] = (int) $post_data['parent_id']; + } - if ( isset($post_data['trackback_url']) ) + if ( isset( $post_data['trackback_url'] ) ) { $post_data['to_ping'] = $post_data['trackback_url']; + } $post_data['user_ID'] = get_current_user_id(); - if (!empty ( $post_data['post_author_override'] ) ) { + if ( ! empty( $post_data['post_author_override'] ) ) { $post_data['post_author'] = (int) $post_data['post_author_override']; } else { - if (!empty ( $post_data['post_author'] ) ) { + if ( ! empty( $post_data['post_author'] ) ) { $post_data['post_author'] = (int) $post_data['post_author']; } else { $post_data['post_author'] = (int) $post_data['user_ID']; @@ -64,17 +72,20 @@ } if ( isset( $post_data['user_ID'] ) && ( $post_data['post_author'] != $post_data['user_ID'] ) - && ! current_user_can( $ptype->cap->edit_others_posts ) ) { + && ! current_user_can( $ptype->cap->edit_others_posts ) ) { + if ( $update ) { - if ( 'page' == $post_data['post_type'] ) + if ( 'page' == $post_data['post_type'] ) { return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to edit pages as this user.' ) ); - else + } else { return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to edit posts as this user.' ) ); + } } else { - if ( 'page' == $post_data['post_type'] ) + if ( 'page' == $post_data['post_type'] ) { return new WP_Error( 'edit_others_pages', __( 'Sorry, you are not allowed to create pages as this user.' ) ); - else + } else { return new WP_Error( 'edit_others_posts', __( 'Sorry, you are not allowed to create posts as this user.' ) ); + } } } @@ -92,21 +103,27 @@ } // What to do based on which button they pressed - if ( isset($post_data['saveasdraft']) && '' != $post_data['saveasdraft'] ) + if ( isset( $post_data['saveasdraft'] ) && '' != $post_data['saveasdraft'] ) { $post_data['post_status'] = 'draft'; - if ( isset($post_data['saveasprivate']) && '' != $post_data['saveasprivate'] ) + } + if ( isset( $post_data['saveasprivate'] ) && '' != $post_data['saveasprivate'] ) { $post_data['post_status'] = 'private'; - if ( isset($post_data['publish']) && ( '' != $post_data['publish'] ) && ( !isset($post_data['post_status']) || $post_data['post_status'] != 'private' ) ) + } + if ( isset( $post_data['publish'] ) && ( '' != $post_data['publish'] ) && ( ! isset( $post_data['post_status'] ) || $post_data['post_status'] != 'private' ) ) { $post_data['post_status'] = 'publish'; - if ( isset($post_data['advanced']) && '' != $post_data['advanced'] ) + } + if ( isset( $post_data['advanced'] ) && '' != $post_data['advanced'] ) { $post_data['post_status'] = 'draft'; - if ( isset($post_data['pending']) && '' != $post_data['pending'] ) + } + if ( isset( $post_data['pending'] ) && '' != $post_data['pending'] ) { $post_data['post_status'] = 'pending'; + } - if ( isset( $post_data['ID'] ) ) + if ( isset( $post_data['ID'] ) ) { $post_id = $post_data['ID']; - else + } else { $post_id = false; + } $previous_status = $post_id ? get_post_field( 'post_status', $post_id ) : false; if ( isset( $post_data['post_status'] ) && 'private' == $post_data['post_status'] && ! current_user_can( $ptype->cap->publish_posts ) ) { @@ -117,9 +134,11 @@ // Posts 'submitted for approval' present are submitted to $_POST the same as if they were being published. // Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts. - if ( isset($post_data['post_status']) && (in_array( $post_data['post_status'], $published_statuses ) && !current_user_can( $ptype->cap->publish_posts )) ) - if ( ! in_array( $previous_status, $published_statuses ) || !current_user_can( 'edit_post', $post_id ) ) + if ( isset( $post_data['post_status'] ) && ( in_array( $post_data['post_status'], $published_statuses ) && ! current_user_can( $ptype->cap->publish_posts ) ) ) { + if ( ! in_array( $previous_status, $published_statuses ) || ! current_user_can( 'edit_post', $post_id ) ) { $post_data['post_status'] = 'pending'; + } + } if ( ! isset( $post_data['post_status'] ) ) { $post_data['post_status'] = 'auto-draft' === $previous_status ? 'draft' : $previous_status; @@ -129,36 +148,38 @@ unset( $post_data['post_password'] ); } - if (!isset( $post_data['comment_status'] )) + if ( ! isset( $post_data['comment_status'] ) ) { $post_data['comment_status'] = 'closed'; + } - if (!isset( $post_data['ping_status'] )) + if ( ! isset( $post_data['ping_status'] ) ) { $post_data['ping_status'] = 'closed'; + } - foreach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) { - if ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) { + foreach ( array( 'aa', 'mm', 'jj', 'hh', 'mn' ) as $timeunit ) { + if ( ! empty( $post_data[ 'hidden_' . $timeunit ] ) && $post_data[ 'hidden_' . $timeunit ] != $post_data[ $timeunit ] ) { $post_data['edit_date'] = '1'; break; } } - if ( !empty( $post_data['edit_date'] ) ) { - $aa = $post_data['aa']; - $mm = $post_data['mm']; - $jj = $post_data['jj']; - $hh = $post_data['hh']; - $mn = $post_data['mn']; - $ss = $post_data['ss']; - $aa = ($aa <= 0 ) ? date('Y') : $aa; - $mm = ($mm <= 0 ) ? date('n') : $mm; - $jj = ($jj > 31 ) ? 31 : $jj; - $jj = ($jj <= 0 ) ? date('j') : $jj; - $hh = ($hh > 23 ) ? $hh -24 : $hh; - $mn = ($mn > 59 ) ? $mn -60 : $mn; - $ss = ($ss > 59 ) ? $ss -60 : $ss; - $post_data['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss ); - $valid_date = wp_checkdate( $mm, $jj, $aa, $post_data['post_date'] ); - if ( !$valid_date ) { + if ( ! empty( $post_data['edit_date'] ) ) { + $aa = $post_data['aa']; + $mm = $post_data['mm']; + $jj = $post_data['jj']; + $hh = $post_data['hh']; + $mn = $post_data['mn']; + $ss = $post_data['ss']; + $aa = ( $aa <= 0 ) ? date( 'Y' ) : $aa; + $mm = ( $mm <= 0 ) ? date( 'n' ) : $mm; + $jj = ( $jj > 31 ) ? 31 : $jj; + $jj = ( $jj <= 0 ) ? date( 'j' ) : $jj; + $hh = ( $hh > 23 ) ? $hh - 24 : $hh; + $mn = ( $mn > 59 ) ? $mn - 60 : $mn; + $ss = ( $ss > 59 ) ? $ss - 60 : $ss; + $post_data['post_date'] = sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $aa, $mm, $jj, $hh, $mn, $ss ); + $valid_date = wp_checkdate( $mm, $jj, $aa, $post_data['post_date'] ); + if ( ! $valid_date ) { return new WP_Error( 'invalid_date', __( 'Invalid date.' ) ); } $post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] ); @@ -175,6 +196,27 @@ } /** + * Returns only allowed post data fields + * + * @since 5.0.1 + * + * @param array $post_data Array of post data. Defaults to the contents of $_POST. + * @return object|bool WP_Error on failure, true on success. + */ +function _wp_get_allowed_postdata( $post_data = null ) { + if ( empty( $post_data ) ) { + $post_data = $_POST; + } + + // Pass through errors + if ( is_wp_error( $post_data ) ) { + return $post_data; + } + + return array_diff_key( $post_data, array_flip( array( 'meta_input', 'file', 'guid' ) ) ); +} + +/** * Update an existing post with values provided in $_POST. * * @since 1.5.0 @@ -187,15 +229,16 @@ function edit_post( $post_data = null ) { global $wpdb; - if ( empty($post_data) ) + if ( empty( $post_data ) ) { $post_data = &$_POST; + } // Clear out any data in internal vars. unset( $post_data['filter'] ); - $post_ID = (int) $post_data['post_ID']; - $post = get_post( $post_ID ); - $post_data['post_type'] = $post->post_type; + $post_ID = (int) $post_data['post_ID']; + $post = get_post( $post_ID ); + $post_data['post_type'] = $post->post_type; $post_data['post_mime_type'] = $post->post_mime_type; if ( ! empty( $post_data['post_status'] ) ) { @@ -206,33 +249,41 @@ } } - $ptype = get_post_type_object($post_data['post_type']); - if ( !current_user_can( 'edit_post', $post_ID ) ) { - if ( 'page' == $post_data['post_type'] ) - wp_die( __('Sorry, you are not allowed to edit this page.' )); - else - wp_die( __('Sorry, you are not allowed to edit this post.' )); + $ptype = get_post_type_object( $post_data['post_type'] ); + if ( ! current_user_can( 'edit_post', $post_ID ) ) { + if ( 'page' == $post_data['post_type'] ) { + wp_die( __( 'Sorry, you are not allowed to edit this page.' ) ); + } else { + wp_die( __( 'Sorry, you are not allowed to edit this post.' ) ); + } } if ( post_type_supports( $ptype->name, 'revisions' ) ) { - $revisions = wp_get_post_revisions( $post_ID, array( 'order' => 'ASC', 'posts_per_page' => 1 ) ); - $revision = current( $revisions ); + $revisions = wp_get_post_revisions( + $post_ID, + array( + 'order' => 'ASC', + 'posts_per_page' => 1, + ) + ); + $revision = current( $revisions ); // Check if the revisions have been upgraded - if ( $revisions && _wp_get_post_revision_version( $revision ) < 1 ) + if ( $revisions && _wp_get_post_revision_version( $revision ) < 1 ) { _wp_upgrade_revisions_of_post( $post, wp_get_post_revisions( $post_ID ) ); + } } - if ( isset($post_data['visibility']) ) { + if ( isset( $post_data['visibility'] ) ) { switch ( $post_data['visibility'] ) { - case 'public' : + case 'public': $post_data['post_password'] = ''; break; - case 'password' : + case 'password': unset( $post_data['sticky'] ); break; - case 'private' : - $post_data['post_status'] = 'private'; + case 'private': + $post_data['post_status'] = 'private'; $post_data['post_password'] = ''; unset( $post_data['sticky'] ); break; @@ -240,18 +291,22 @@ } $post_data = _wp_translate_postdata( true, $post_data ); - if ( is_wp_error($post_data) ) + if ( is_wp_error( $post_data ) ) { wp_die( $post_data->get_error_message() ); + } + $translated = _wp_get_allowed_postdata( $post_data ); // Post Formats - if ( isset( $post_data['post_format'] ) ) + if ( isset( $post_data['post_format'] ) ) { set_post_format( $post_ID, $post_data['post_format'] ); + } $format_meta_urls = array( 'url', 'link_url', 'quote_source_url' ); foreach ( $format_meta_urls as $format_meta_url ) { $keyed = '_format_' . $format_meta_url; - if ( isset( $post_data[ $keyed ] ) ) + if ( isset( $post_data[ $keyed ] ) ) { update_post_meta( $post_ID, $keyed, wp_slash( esc_url_raw( wp_unslash( $post_data[ $keyed ] ) ) ) ); + } } $format_keys = array( 'quote', 'quote_source_name', 'image', 'gallery', 'audio_embed', 'video_embed' ); @@ -259,10 +314,11 @@ foreach ( $format_keys as $key ) { $keyed = '_format_' . $key; if ( isset( $post_data[ $keyed ] ) ) { - if ( current_user_can( 'unfiltered_html' ) ) + if ( current_user_can( 'unfiltered_html' ) ) { update_post_meta( $post_ID, $keyed, $post_data[ $keyed ] ); - else + } else { update_post_meta( $post_ID, $keyed, wp_filter_post_kses( $post_data[ $keyed ] ) ); + } } } @@ -281,35 +337,42 @@ } // Meta Stuff - if ( isset($post_data['meta']) && $post_data['meta'] ) { + if ( isset( $post_data['meta'] ) && $post_data['meta'] ) { foreach ( $post_data['meta'] as $key => $value ) { - if ( !$meta = get_post_meta_by_id( $key ) ) + if ( ! $meta = get_post_meta_by_id( $key ) ) { + continue; + } + if ( $meta->post_id != $post_ID ) { continue; - if ( $meta->post_id != $post_ID ) + } + if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $meta->meta_key ) ) { continue; - if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $meta->meta_key ) ) + } + if ( is_protected_meta( $value['key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) ) { continue; - if ( is_protected_meta( $value['key'], 'post' ) || ! current_user_can( 'edit_post_meta', $post_ID, $value['key'] ) ) - continue; + } update_meta( $key, $value['key'], $value['value'] ); } } - if ( isset($post_data['deletemeta']) && $post_data['deletemeta'] ) { + if ( isset( $post_data['deletemeta'] ) && $post_data['deletemeta'] ) { foreach ( $post_data['deletemeta'] as $key => $value ) { - if ( !$meta = get_post_meta_by_id( $key ) ) + if ( ! $meta = get_post_meta_by_id( $key ) ) { continue; - if ( $meta->post_id != $post_ID ) + } + if ( $meta->post_id != $post_ID ) { continue; - if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $post_ID, $meta->meta_key ) ) + } + if ( is_protected_meta( $meta->meta_key, 'post' ) || ! current_user_can( 'delete_post_meta', $post_ID, $meta->meta_key ) ) { continue; + } delete_meta( $key ); } } // Attachment stuff if ( 'attachment' == $post_data['post_type'] ) { - if ( isset( $post_data[ '_wp_attachment_image_alt' ] ) ) { + if ( isset( $post_data['_wp_attachment_image_alt'] ) ) { $image_alt = wp_unslash( $post_data['_wp_attachment_image_alt'] ); if ( $image_alt != get_post_meta( $post_ID, '_wp_attachment_image_alt', true ) ) { $image_alt = wp_strip_all_tags( $image_alt, true ); @@ -321,52 +384,17 @@ $attachment_data = isset( $post_data['attachments'][ $post_ID ] ) ? $post_data['attachments'][ $post_ID ] : array(); /** This filter is documented in wp-admin/includes/media.php */ - $post_data = apply_filters( 'attachment_fields_to_save', $post_data, $attachment_data ); + $translated = apply_filters( 'attachment_fields_to_save', $translated, $attachment_data ); } // Convert taxonomy input to term IDs, to avoid ambiguity. if ( isset( $post_data['tax_input'] ) ) { foreach ( (array) $post_data['tax_input'] as $taxonomy => $terms ) { - // Hierarchical taxonomy data is already sent as term IDs, so no conversion is necessary. - if ( is_taxonomy_hierarchical( $taxonomy ) ) { - continue; - } - - /* - * Assume that a 'tax_input' string is a comma-separated list of term names. - * Some languages may use a character other than a comma as a delimiter, so we standardize on - * commas before parsing the list. - */ - if ( ! is_array( $terms ) ) { - $comma = _x( ',', 'tag delimiter' ); - if ( ',' !== $comma ) { - $terms = str_replace( $comma, ',', $terms ); - } - $terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) ); - } + $tax_object = get_taxonomy( $taxonomy ); - $clean_terms = array(); - foreach ( $terms as $term ) { - // Empty terms are invalid input. - if ( empty( $term ) ) { - continue; - } - - $_term = get_terms( $taxonomy, array( - 'name' => $term, - 'fields' => 'ids', - 'hide_empty' => false, - ) ); - - if ( ! empty( $_term ) ) { - $clean_terms[] = intval( $_term[0] ); - } else { - // No existing term was found, so pass the string. A new term will be created. - $clean_terms[] = $term; - } + if ( $tax_object && isset( $tax_object->meta_box_sanitize_cb ) ) { + $translated['tax_input'][ $taxonomy ] = call_user_func_array( $tax_object->meta_box_sanitize_cb, array( $taxonomy, $terms ) ); } - - $post_data['tax_input'][ $taxonomy ] = $clean_terms; } } @@ -374,18 +402,18 @@ update_post_meta( $post_ID, '_edit_last', get_current_user_id() ); - $success = wp_update_post( $post_data ); + $success = wp_update_post( $translated ); // If the save failed, see if we can sanity check the main fields and try again if ( ! $success && is_callable( array( $wpdb, 'strip_invalid_text_for_column' ) ) ) { $fields = array( 'post_title', 'post_content', 'post_excerpt' ); foreach ( $fields as $field ) { - if ( isset( $post_data[ $field ] ) ) { - $post_data[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->posts, $field, $post_data[ $field ] ); + if ( isset( $translated[ $field ] ) ) { + $translated[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->posts, $field, $translated[ $field ] ); } } - wp_update_post( $post_data ); + wp_update_post( $translated ); } // Now that we have an ID we can fix any attachment anchor hrefs @@ -394,10 +422,11 @@ wp_set_post_lock( $post_ID ); if ( current_user_can( $ptype->cap->edit_others_posts ) && current_user_can( $ptype->cap->publish_posts ) ) { - if ( ! empty( $post_data['sticky'] ) ) + if ( ! empty( $post_data['sticky'] ) ) { stick_post( $post_ID ); - else + } else { unstick_post( $post_ID ); + } } return $post_ID; @@ -419,28 +448,31 @@ function bulk_edit_posts( $post_data = null ) { global $wpdb; - if ( empty($post_data) ) + if ( empty( $post_data ) ) { $post_data = &$_POST; + } - if ( isset($post_data['post_type']) ) - $ptype = get_post_type_object($post_data['post_type']); - else - $ptype = get_post_type_object('post'); + if ( isset( $post_data['post_type'] ) ) { + $ptype = get_post_type_object( $post_data['post_type'] ); + } else { + $ptype = get_post_type_object( 'post' ); + } - if ( !current_user_can( $ptype->cap->edit_posts ) ) { - if ( 'page' == $ptype->name ) - wp_die( __('Sorry, you are not allowed to edit pages.')); - else - wp_die( __('Sorry, you are not allowed to edit posts.')); + if ( ! current_user_can( $ptype->cap->edit_posts ) ) { + if ( 'page' == $ptype->name ) { + wp_die( __( 'Sorry, you are not allowed to edit pages.' ) ); + } else { + wp_die( __( 'Sorry, you are not allowed to edit posts.' ) ); + } } if ( -1 == $post_data['_status'] ) { $post_data['post_status'] = null; - unset($post_data['post_status']); + unset( $post_data['post_status'] ); } else { $post_data['post_status'] = $post_data['_status']; } - unset($post_data['_status']); + unset( $post_data['_status'] ); if ( ! empty( $post_data['post_status'] ) ) { $post_data['post_status'] = sanitize_key( $post_data['post_status'] ); @@ -453,42 +485,54 @@ $post_IDs = array_map( 'intval', (array) $post_data['post'] ); $reset = array( - 'post_author', 'post_status', 'post_password', - 'post_parent', 'page_template', 'comment_status', - 'ping_status', 'keep_private', 'tax_input', - 'post_category', 'sticky', 'post_format', + 'post_author', + 'post_status', + 'post_password', + 'post_parent', + 'page_template', + 'comment_status', + 'ping_status', + 'keep_private', + 'tax_input', + 'post_category', + 'sticky', + 'post_format', ); foreach ( $reset as $field ) { - if ( isset($post_data[$field]) && ( '' == $post_data[$field] || -1 == $post_data[$field] ) ) - unset($post_data[$field]); + if ( isset( $post_data[ $field ] ) && ( '' == $post_data[ $field ] || -1 == $post_data[ $field ] ) ) { + unset( $post_data[ $field ] ); + } } - if ( isset($post_data['post_category']) ) { - if ( is_array($post_data['post_category']) && ! empty($post_data['post_category']) ) + if ( isset( $post_data['post_category'] ) ) { + if ( is_array( $post_data['post_category'] ) && ! empty( $post_data['post_category'] ) ) { $new_cats = array_map( 'absint', $post_data['post_category'] ); - else - unset($post_data['post_category']); + } else { + unset( $post_data['post_category'] ); + } } $tax_input = array(); - if ( isset($post_data['tax_input'])) { + if ( isset( $post_data['tax_input'] ) ) { foreach ( $post_data['tax_input'] as $tax_name => $terms ) { - if ( empty($terms) ) + if ( empty( $terms ) ) { continue; + } if ( is_taxonomy_hierarchical( $tax_name ) ) { $tax_input[ $tax_name ] = array_map( 'absint', $terms ); } else { $comma = _x( ',', 'tag delimiter' ); - if ( ',' !== $comma ) + if ( ',' !== $comma ) { $terms = str_replace( $comma, ',', $terms ); + } $tax_input[ $tax_name ] = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) ); } } } - if ( isset($post_data['post_parent']) && ($parent = (int) $post_data['post_parent']) ) { - $pages = $wpdb->get_results("SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'page'"); + if ( isset( $post_data['post_parent'] ) && ( $parent = (int) $post_data['post_parent'] ) ) { + $pages = $wpdb->get_results( "SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'page'" ); $children = array(); for ( $i = 0; $i < 50 && $parent > 0; $i++ ) { @@ -503,7 +547,7 @@ } } - $updated = $skipped = $locked = array(); + $updated = $skipped = $locked = array(); $shared_post_data = $post_data; foreach ( $post_IDs as $post_ID ) { @@ -512,7 +556,7 @@ $post_type_object = get_post_type_object( get_post_type( $post_ID ) ); - if ( !isset( $post_type_object ) || ( isset($children) && in_array($post_ID, $children) ) || !current_user_can( 'edit_post', $post_ID ) ) { + if ( ! isset( $post_type_object ) || ( isset( $children ) && in_array( $post_ID, $children ) ) || ! current_user_can( 'edit_post', $post_ID ) ) { $skipped[] = $post_ID; continue; } @@ -522,32 +566,34 @@ continue; } - $post = get_post( $post_ID ); + $post = get_post( $post_ID ); $tax_names = get_object_taxonomies( $post ); foreach ( $tax_names as $tax_name ) { - $taxonomy_obj = get_taxonomy($tax_name); - if ( isset( $tax_input[$tax_name]) && current_user_can( $taxonomy_obj->cap->assign_terms ) ) - $new_terms = $tax_input[$tax_name]; - else + $taxonomy_obj = get_taxonomy( $tax_name ); + if ( isset( $tax_input[ $tax_name ] ) && current_user_can( $taxonomy_obj->cap->assign_terms ) ) { + $new_terms = $tax_input[ $tax_name ]; + } else { $new_terms = array(); + } - if ( $taxonomy_obj->hierarchical ) - $current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array('fields' => 'ids') ); - else - $current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array('fields' => 'names') ); + if ( $taxonomy_obj->hierarchical ) { + $current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array( 'fields' => 'ids' ) ); + } else { + $current_terms = (array) wp_get_object_terms( $post_ID, $tax_name, array( 'fields' => 'names' ) ); + } - $post_data['tax_input'][$tax_name] = array_merge( $current_terms, $new_terms ); + $post_data['tax_input'][ $tax_name ] = array_merge( $current_terms, $new_terms ); } - if ( isset($new_cats) && in_array( 'category', $tax_names ) ) { - $cats = (array) wp_get_post_categories($post_ID); - $post_data['post_category'] = array_unique( array_merge($cats, $new_cats) ); + if ( isset( $new_cats ) && in_array( 'category', $tax_names ) ) { + $cats = (array) wp_get_post_categories( $post_ID ); + $post_data['post_category'] = array_unique( array_merge( $cats, $new_cats ) ); unset( $post_data['tax_input']['category'] ); } - $post_data['post_type'] = $post->post_type; + $post_data['post_ID'] = $post_ID; + $post_data['post_type'] = $post->post_type; $post_data['post_mime_type'] = $post->post_mime_type; - $post_data['guid'] = $post->guid; foreach ( array( 'comment_status', 'ping_status', 'post_author' ) as $field ) { if ( ! isset( $post_data[ $field ] ) ) { @@ -555,31 +601,36 @@ } } - $post_data['ID'] = $post_ID; - $post_data['post_ID'] = $post_ID; - $post_data = _wp_translate_postdata( true, $post_data ); if ( is_wp_error( $post_data ) ) { $skipped[] = $post_ID; continue; } + $post_data = _wp_get_allowed_postdata( $post_data ); - if ( isset( $post_data['post_format'] ) ) { - set_post_format( $post_ID, $post_data['post_format'] ); - unset( $post_data['tax_input']['post_format'] ); + if ( isset( $shared_post_data['post_format'] ) ) { + set_post_format( $post_ID, $shared_post_data['post_format'] ); } + // Prevent wp_insert_post() from overwriting post format with the old data. + unset( $post_data['tax_input']['post_format'] ); + $updated[] = wp_update_post( $post_data ); if ( isset( $post_data['sticky'] ) && current_user_can( $ptype->cap->edit_others_posts ) ) { - if ( 'sticky' == $post_data['sticky'] ) + if ( 'sticky' == $post_data['sticky'] ) { stick_post( $post_ID ); - else + } else { unstick_post( $post_ID ); + } } } - return array( 'updated' => $updated, 'skipped' => $skipped, 'locked' => $locked ); + return array( + 'updated' => $updated, + 'skipped' => $skipped, + 'locked' => $locked, + ); } /** @@ -593,42 +644,57 @@ */ function get_default_post_to_edit( $post_type = 'post', $create_in_db = false ) { $post_title = ''; - if ( !empty( $_REQUEST['post_title'] ) ) - $post_title = esc_html( wp_unslash( $_REQUEST['post_title'] )); + if ( ! empty( $_REQUEST['post_title'] ) ) { + $post_title = esc_html( wp_unslash( $_REQUEST['post_title'] ) ); + } $post_content = ''; - if ( !empty( $_REQUEST['content'] ) ) - $post_content = esc_html( wp_unslash( $_REQUEST['content'] )); + if ( ! empty( $_REQUEST['content'] ) ) { + $post_content = esc_html( wp_unslash( $_REQUEST['content'] ) ); + } $post_excerpt = ''; - if ( !empty( $_REQUEST['excerpt'] ) ) - $post_excerpt = esc_html( wp_unslash( $_REQUEST['excerpt'] )); + if ( ! empty( $_REQUEST['excerpt'] ) ) { + $post_excerpt = esc_html( wp_unslash( $_REQUEST['excerpt'] ) ); + } if ( $create_in_db ) { - $post_id = wp_insert_post( array( 'post_title' => __( 'Auto Draft' ), 'post_type' => $post_type, 'post_status' => 'auto-draft' ) ); - $post = get_post( $post_id ); - if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) ) + $post_id = wp_insert_post( + array( + 'post_title' => __( 'Auto Draft' ), + 'post_type' => $post_type, + 'post_status' => 'auto-draft', + ) + ); + $post = get_post( $post_id ); + if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) && get_option( 'default_post_format' ) ) { set_post_format( $post, get_option( 'default_post_format' ) ); + } + + // Schedule auto-draft cleanup + if ( ! wp_next_scheduled( 'wp_scheduled_auto_draft_delete' ) ) { + wp_schedule_event( time(), 'daily', 'wp_scheduled_auto_draft_delete' ); + } } else { - $post = new stdClass; - $post->ID = 0; - $post->post_author = ''; - $post->post_date = ''; - $post->post_date_gmt = ''; - $post->post_password = ''; - $post->post_name = ''; - $post->post_type = $post_type; - $post->post_status = 'draft'; - $post->to_ping = ''; - $post->pinged = ''; + $post = new stdClass; + $post->ID = 0; + $post->post_author = ''; + $post->post_date = ''; + $post->post_date_gmt = ''; + $post->post_password = ''; + $post->post_name = ''; + $post->post_type = $post_type; + $post->post_status = 'draft'; + $post->to_ping = ''; + $post->pinged = ''; $post->comment_status = get_default_comment_status( $post_type ); - $post->ping_status = get_default_comment_status( $post_type, 'pingback' ); - $post->post_pingback = get_option( 'default_pingback_flag' ); - $post->post_category = get_option( 'default_category' ); - $post->page_template = 'default'; - $post->post_parent = 0; - $post->menu_order = 0; - $post = new WP_Post( $post ); + $post->ping_status = get_default_comment_status( $post_type, 'pingback' ); + $post->post_pingback = get_option( 'default_pingback_flag' ); + $post->post_category = get_option( 'default_category' ); + $post->page_template = 'default'; + $post->post_parent = 0; + $post->menu_order = 0; + $post = new WP_Post( $post ); } /** @@ -639,7 +705,7 @@ * @param string $post_content Default post content. * @param WP_Post $post Post object. */ - $post->post_content = apply_filters( 'default_content', $post_content, $post ); + $post->post_content = (string) apply_filters( 'default_content', $post_content, $post ); /** * Filters the default post title initially used in the "Write Post" form. @@ -649,7 +715,7 @@ * @param string $post_title Default post title. * @param WP_Post $post Post object. */ - $post->post_title = apply_filters( 'default_title', $post_title, $post ); + $post->post_title = (string) apply_filters( 'default_title', $post_title, $post ); /** * Filters the default post excerpt initially used in the "Write Post" form. @@ -659,50 +725,59 @@ * @param string $post_excerpt Default post excerpt. * @param WP_Post $post Post object. */ - $post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt, $post ); + $post->post_excerpt = (string) apply_filters( 'default_excerpt', $post_excerpt, $post ); return $post; } /** - * Determine if a post exists based on title, content, and date + * Determines if a post exists based on title, content, date and type. * * @since 2.0.0 + * @since 5.2.0 Added the `$type` parameter. * * @global wpdb $wpdb WordPress database abstraction object. * - * @param string $title Post title - * @param string $content Optional post content - * @param string $date Optional post date + * @param string $title Post title. + * @param string $content Optional post content. + * @param string $date Optional post date. + * @param string $type Optional post type. * @return int Post ID if post exists, 0 otherwise. */ -function post_exists($title, $content = '', $date = '') { +function post_exists( $title, $content = '', $date = '', $type = '' ) { global $wpdb; - $post_title = wp_unslash( sanitize_post_field( 'post_title', $title, 0, 'db' ) ); + $post_title = wp_unslash( sanitize_post_field( 'post_title', $title, 0, 'db' ) ); $post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) ); - $post_date = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) ); + $post_date = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) ); + $post_type = wp_unslash( sanitize_post_field( 'post_type', $type, 0, 'db' ) ); $query = "SELECT ID FROM $wpdb->posts WHERE 1=1"; - $args = array(); + $args = array(); - if ( !empty ( $date ) ) { + if ( ! empty( $date ) ) { $query .= ' AND post_date = %s'; $args[] = $post_date; } - if ( !empty ( $title ) ) { + if ( ! empty( $title ) ) { $query .= ' AND post_title = %s'; $args[] = $post_title; } - if ( !empty ( $content ) ) { + if ( ! empty( $content ) ) { $query .= ' AND post_content = %s'; $args[] = $post_content; } - if ( !empty ( $args ) ) - return (int) $wpdb->get_var( $wpdb->prepare($query, $args) ); + if ( ! empty( $type ) ) { + $query .= ' AND post_type = %s'; + $args[] = $post_type; + } + + if ( ! empty( $args ) ) { + return (int) $wpdb->get_var( $wpdb->prepare( $query, $args ) ); + } return 0; } @@ -717,16 +792,18 @@ * @return int|WP_Error */ function wp_write_post() { - if ( isset($_POST['post_type']) ) - $ptype = get_post_type_object($_POST['post_type']); - else - $ptype = get_post_type_object('post'); + if ( isset( $_POST['post_type'] ) ) { + $ptype = get_post_type_object( $_POST['post_type'] ); + } else { + $ptype = get_post_type_object( 'post' ); + } - if ( !current_user_can( $ptype->cap->edit_posts ) ) { - if ( 'page' == $ptype->name ) + if ( ! current_user_can( $ptype->cap->edit_posts ) ) { + if ( 'page' == $ptype->name ) { return new WP_Error( 'edit_pages', __( 'Sorry, you are not allowed to create pages on this site.' ) ); - else + } else { return new WP_Error( 'edit_posts', __( 'Sorry, you are not allowed to create posts or drafts on this site.' ) ); + } } $_POST['post_mime_type'] = ''; @@ -735,19 +812,20 @@ unset( $_POST['filter'] ); // Edit don't write if we have a post id. - if ( isset( $_POST['post_ID'] ) ) + if ( isset( $_POST['post_ID'] ) ) { return edit_post(); + } - if ( isset($_POST['visibility']) ) { + if ( isset( $_POST['visibility'] ) ) { switch ( $_POST['visibility'] ) { - case 'public' : + case 'public': $_POST['post_password'] = ''; break; - case 'password' : + case 'password': unset( $_POST['sticky'] ); break; - case 'private' : - $_POST['post_status'] = 'private'; + case 'private': + $_POST['post_status'] = 'private'; $_POST['post_password'] = ''; unset( $_POST['sticky'] ); break; @@ -755,16 +833,20 @@ } $translated = _wp_translate_postdata( false ); - if ( is_wp_error($translated) ) + if ( is_wp_error( $translated ) ) { return $translated; + } + $translated = _wp_get_allowed_postdata( $translated ); // Create the post. - $post_ID = wp_insert_post( $_POST ); - if ( is_wp_error( $post_ID ) ) + $post_ID = wp_insert_post( $translated ); + if ( is_wp_error( $post_ID ) ) { return $post_ID; + } - if ( empty($post_ID) ) + if ( empty( $post_ID ) ) { return 0; + } add_meta( $post_ID ); @@ -787,10 +869,11 @@ */ function write_post() { $result = wp_write_post(); - if ( is_wp_error( $result ) ) + if ( is_wp_error( $result ) ) { wp_die( $result->get_error_message() ); - else + } else { return $result; + } } // @@ -808,25 +891,29 @@ function add_meta( $post_ID ) { $post_ID = (int) $post_ID; - $metakeyselect = isset($_POST['metakeyselect']) ? wp_unslash( trim( $_POST['metakeyselect'] ) ) : ''; - $metakeyinput = isset($_POST['metakeyinput']) ? wp_unslash( trim( $_POST['metakeyinput'] ) ) : ''; - $metavalue = isset($_POST['metavalue']) ? $_POST['metavalue'] : ''; - if ( is_string( $metavalue ) ) + $metakeyselect = isset( $_POST['metakeyselect'] ) ? wp_unslash( trim( $_POST['metakeyselect'] ) ) : ''; + $metakeyinput = isset( $_POST['metakeyinput'] ) ? wp_unslash( trim( $_POST['metakeyinput'] ) ) : ''; + $metavalue = isset( $_POST['metavalue'] ) ? $_POST['metavalue'] : ''; + if ( is_string( $metavalue ) ) { $metavalue = trim( $metavalue ); + } - if ( ('0' === $metavalue || ! empty ( $metavalue ) ) && ( ( ( '#NONE#' != $metakeyselect ) && !empty ( $metakeyselect) ) || !empty ( $metakeyinput ) ) ) { + if ( ( ( '#NONE#' != $metakeyselect ) && ! empty( $metakeyselect ) ) || ! empty( $metakeyinput ) ) { /* * We have a key/value pair. If both the select and the input * for the key have data, the input takes precedence. */ - if ( '#NONE#' != $metakeyselect ) + if ( '#NONE#' != $metakeyselect ) { $metakey = $metakeyselect; + } - if ( $metakeyinput ) + if ( $metakeyinput ) { $metakey = $metakeyinput; // default + } - if ( is_protected_meta( $metakey, 'post' ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) ) + if ( is_protected_meta( $metakey, 'post' ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) ) { return false; + } $metakey = wp_slash( $metakey ); @@ -845,7 +932,7 @@ * @return bool */ function delete_meta( $mid ) { - return delete_metadata_by_mid( 'post' , $mid ); + return delete_metadata_by_mid( 'post', $mid ); } /** @@ -860,11 +947,13 @@ function get_meta_keys() { global $wpdb; - $keys = $wpdb->get_col( " + $keys = $wpdb->get_col( + " SELECT meta_key FROM $wpdb->postmeta GROUP BY meta_key - ORDER BY meta_key" ); + ORDER BY meta_key" + ); return $keys; } @@ -894,9 +983,15 @@ function has_meta( $postid ) { global $wpdb; - return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, post_id + return $wpdb->get_results( + $wpdb->prepare( + "SELECT meta_key, meta_value, meta_id, post_id FROM $wpdb->postmeta WHERE post_id = %d - ORDER BY meta_key,meta_id", $postid), ARRAY_A ); + ORDER BY meta_key,meta_id", + $postid + ), + ARRAY_A + ); } /** @@ -910,7 +1005,7 @@ * @return bool */ function update_meta( $meta_id, $meta_key, $meta_value ) { - $meta_key = wp_unslash( $meta_key ); + $meta_key = wp_unslash( $meta_key ); $meta_value = wp_unslash( $meta_value ); return update_metadata_by_mid( 'post', $meta_id, $meta_value, $meta_key ); @@ -930,35 +1025,39 @@ * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success. */ function _fix_attachment_links( $post ) { - $post = get_post( $post, ARRAY_A ); + $post = get_post( $post, ARRAY_A ); $content = $post['post_content']; // Don't run if no pretty permalinks or post is not published, scheduled, or privately published. - if ( ! get_option( 'permalink_structure' ) || ! in_array( $post['post_status'], array( 'publish', 'future', 'private' ) ) ) + if ( ! get_option( 'permalink_structure' ) || ! in_array( $post['post_status'], array( 'publish', 'future', 'private' ) ) ) { return; + } // Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero) - if ( !strpos($content, '?attachment_id=') || !preg_match_all( '/]+)>[\s\S]+?<\/a>/', $content, $link_matches ) ) + if ( ! strpos( $content, '?attachment_id=' ) || ! preg_match_all( '/]+)>[\s\S]+?<\/a>/', $content, $link_matches ) ) { return; + } - $site_url = get_bloginfo('url'); - $site_url = substr( $site_url, (int) strpos($site_url, '://') ); // remove the http(s) - $replace = ''; + $site_url = get_bloginfo( 'url' ); + $site_url = substr( $site_url, (int) strpos( $site_url, '://' ) ); // remove the http(s) + $replace = ''; foreach ( $link_matches[1] as $key => $value ) { - if ( !strpos($value, '?attachment_id=') || !strpos($value, 'wp-att-') - || !preg_match( '/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\\1/', $value, $url_match ) - || !preg_match( '/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match ) ) + if ( ! strpos( $value, '?attachment_id=' ) || ! strpos( $value, 'wp-att-' ) + || ! preg_match( '/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\\1/', $value, $url_match ) + || ! preg_match( '/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match ) ) { continue; + } - $quote = $url_match[1]; // the quote (single or double) + $quote = $url_match[1]; // the quote (single or double) $url_id = (int) $url_match[2]; $rel_id = (int) $rel_match[1]; - if ( !$url_id || !$rel_id || $url_id != $rel_id || strpos($url_match[0], $site_url) === false ) + if ( ! $url_id || ! $rel_id || $url_id != $rel_id || strpos( $url_match[0], $site_url ) === false ) { continue; + } - $link = $link_matches[0][$key]; + $link = $link_matches[0][ $key ]; $replace = str_replace( $url_match[0], 'href=' . $quote . get_attachment_link( $url_id ) . $quote, $link ); $content = str_replace( $link, $replace, $content ); @@ -967,9 +1066,9 @@ if ( $replace ) { $post['post_content'] = $content; // Escape data pulled from DB. - $post = add_magic_quotes($post); + $post = add_magic_quotes( $post ); - return wp_update_post($post); + return wp_update_post( $post ); } } @@ -981,10 +1080,10 @@ * @param string $type The post_type you want the statuses for * @return array As array of all the statuses for the supplied post type */ -function get_available_post_statuses($type = 'post') { - $stati = wp_count_posts($type); +function get_available_post_statuses( $type = 'post' ) { + $stati = wp_count_posts( $type ); - return array_keys(get_object_vars($stati)); + return array_keys( get_object_vars( $stati ) ); } /** @@ -996,40 +1095,49 @@ * @return array */ function wp_edit_posts_query( $q = false ) { - if ( false === $q ) + if ( false === $q ) { $q = $_GET; - $q['m'] = isset($q['m']) ? (int) $q['m'] : 0; - $q['cat'] = isset($q['cat']) ? (int) $q['cat'] : 0; - $post_stati = get_post_stati(); + } + $q['m'] = isset( $q['m'] ) ? (int) $q['m'] : 0; + $q['cat'] = isset( $q['cat'] ) ? (int) $q['cat'] : 0; + $post_stati = get_post_stati(); - if ( isset($q['post_type']) && in_array( $q['post_type'], get_post_types() ) ) + if ( isset( $q['post_type'] ) && in_array( $q['post_type'], get_post_types() ) ) { $post_type = $q['post_type']; - else + } else { $post_type = 'post'; - - $avail_post_stati = get_available_post_statuses($post_type); + } - if ( isset($q['post_status']) && in_array( $q['post_status'], $post_stati ) ) { + $avail_post_stati = get_available_post_statuses( $post_type ); + $post_status = ''; + $perm = ''; + + if ( isset( $q['post_status'] ) && in_array( $q['post_status'], $post_stati ) ) { $post_status = $q['post_status']; - $perm = 'readable'; + $perm = 'readable'; } + $orderby = ''; + if ( isset( $q['orderby'] ) ) { $orderby = $q['orderby']; } elseif ( isset( $q['post_status'] ) && in_array( $q['post_status'], array( 'pending', 'draft' ) ) ) { $orderby = 'modified'; } + $order = ''; + if ( isset( $q['order'] ) ) { $order = $q['order']; } elseif ( isset( $q['post_status'] ) && 'pending' == $q['post_status'] ) { $order = 'ASC'; } - $per_page = "edit_{$post_type}_per_page"; + $per_page = "edit_{$post_type}_per_page"; $posts_per_page = (int) get_user_option( $per_page ); - if ( empty( $posts_per_page ) || $posts_per_page < 1 ) + if ( empty( $posts_per_page ) || $posts_per_page < 1 ) { $posts_per_page = 20; + } /** * Filters the number of items per page to show for a specific 'per_page' type. @@ -1056,19 +1164,20 @@ */ $posts_per_page = apply_filters( 'edit_posts_per_page', $posts_per_page, $post_type ); - $query = compact('post_type', 'post_status', 'perm', 'order', 'orderby', 'posts_per_page'); + $query = compact( 'post_type', 'post_status', 'perm', 'order', 'orderby', 'posts_per_page' ); // Hierarchical types require special args. - if ( is_post_type_hierarchical( $post_type ) && !isset($orderby) ) { - $query['orderby'] = 'menu_order title'; - $query['order'] = 'asc'; - $query['posts_per_page'] = -1; + if ( is_post_type_hierarchical( $post_type ) && empty( $orderby ) ) { + $query['orderby'] = 'menu_order title'; + $query['order'] = 'asc'; + $query['posts_per_page'] = -1; $query['posts_per_archive_page'] = -1; - $query['fields'] = 'id=>parent'; + $query['fields'] = 'id=>parent'; } - if ( ! empty( $q['show_sticky'] ) ) + if ( ! empty( $q['show_sticky'] ) ) { $query['post__in'] = (array) get_option( 'sticky_posts' ); + } wp( $query ); @@ -1076,23 +1185,6 @@ } /** - * Get all available post MIME types for a given post type. - * - * @since 2.5.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $type - * @return mixed - */ -function get_available_post_mime_types($type = 'attachment') { - global $wpdb; - - $types = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT post_mime_type FROM $wpdb->posts WHERE post_type = %s", $type)); - return $types; -} - -/** * Get the query variables for the current attachments request. * * @since 4.2.0 @@ -1105,11 +1197,11 @@ if ( false === $q ) { $q = $_GET; } - $q['m'] = isset( $q['m'] ) ? (int) $q['m'] : 0; - $q['cat'] = isset( $q['cat'] ) ? (int) $q['cat'] : 0; + $q['m'] = isset( $q['m'] ) ? (int) $q['m'] : 0; + $q['cat'] = isset( $q['cat'] ) ? (int) $q['cat'] : 0; $q['post_type'] = 'attachment'; - $post_type = get_post_type_object( 'attachment' ); - $states = 'inherit'; + $post_type = get_post_type_object( 'attachment' ); + $states = 'inherit'; if ( current_user_can( $post_type->cap->read_private_posts ) ) { $states .= ',private'; } @@ -1132,8 +1224,8 @@ $q['posts_per_page'] = apply_filters( 'upload_per_page', $media_per_page ); $post_mime_types = get_post_mime_types(); - if ( isset($q['post_mime_type']) && !array_intersect( (array) $q['post_mime_type'], array_keys($post_mime_types) ) ) { - unset($q['post_mime_type']); + if ( isset( $q['post_mime_type'] ) && ! array_intersect( (array) $q['post_mime_type'], array_keys( $post_mime_types ) ) ) { + unset( $q['post_mime_type'] ); } foreach ( array_keys( $post_mime_types ) as $type ) { @@ -1171,7 +1263,7 @@ function wp_edit_attachments_query( $q = false ) { wp( wp_edit_attachments_query_vars( $q ) ); - $post_mime_types = get_post_mime_types(); + $post_mime_types = get_post_mime_types(); $avail_post_mime_types = get_available_post_mime_types( 'attachment' ); return array( $post_mime_types, $avail_post_mime_types ); @@ -1182,34 +1274,34 @@ * * @since 2.5.0 * - * @param string $id - * @param string $page - * @return string + * @param string $box_id Meta box ID (used in the 'id' attribute for the meta box). + * @param string $screen_id The screen on which the meta box is shown. + * @return string Space-separated string of class names. */ -function postbox_classes( $id, $page ) { - if ( isset( $_GET['edit'] ) && $_GET['edit'] == $id ) { +function postbox_classes( $box_id, $screen_id ) { + if ( isset( $_GET['edit'] ) && $_GET['edit'] == $box_id ) { $classes = array( '' ); - } elseif ( $closed = get_user_option('closedpostboxes_'.$page ) ) { - if ( !is_array( $closed ) ) { + } elseif ( $closed = get_user_option( 'closedpostboxes_' . $screen_id ) ) { + if ( ! is_array( $closed ) ) { $classes = array( '' ); } else { - $classes = in_array( $id, $closed ) ? array( 'closed' ) : array( '' ); + $classes = in_array( $box_id, $closed ) ? array( 'closed' ) : array( '' ); } } else { $classes = array( '' ); } /** - * Filters the postbox classes for a specific screen and screen ID combo. + * Filters the postbox classes for a specific screen and box ID combo. * - * The dynamic portions of the hook name, `$page` and `$id`, refer to - * the screen and screen ID, respectively. + * The dynamic portions of the hook name, `$screen_id` and `$box_id`, refer to + * the screen ID and meta box ID, respectively. * * @since 3.2.0 * - * @param array $classes An array of postbox classes. + * @param string[] $classes An array of postbox classes. */ - $classes = apply_filters( "postbox_classes_{$page}_{$id}", $classes ); + $classes = apply_filters( "postbox_classes_{$screen_id}_{$box_id}", $classes ); return implode( ' ', $classes ); } @@ -1223,59 +1315,62 @@ * @param string $name Optional. Name to override the post name. Default null. * @return array Array containing the sample permalink with placeholder for the post name, and the post name. */ -function get_sample_permalink($id, $title = null, $name = null) { +function get_sample_permalink( $id, $title = null, $name = null ) { $post = get_post( $id ); - if ( ! $post ) + if ( ! $post ) { return array( '', '' ); + } - $ptype = get_post_type_object($post->post_type); + $ptype = get_post_type_object( $post->post_type ); $original_status = $post->post_status; - $original_date = $post->post_date; - $original_name = $post->post_name; + $original_date = $post->post_date; + $original_name = $post->post_name; // Hack: get_permalink() would return ugly permalink for drafts, so we will fake that our post is published. if ( in_array( $post->post_status, array( 'draft', 'pending', 'future' ) ) ) { $post->post_status = 'publish'; - $post->post_name = sanitize_title($post->post_name ? $post->post_name : $post->post_title, $post->ID); + $post->post_name = sanitize_title( $post->post_name ? $post->post_name : $post->post_title, $post->ID ); } // If the user wants to set a new name -- override the current one // Note: if empty name is supplied -- use the title instead, see #6072 - if ( !is_null($name) ) - $post->post_name = sanitize_title($name ? $name : $title, $post->ID); + if ( ! is_null( $name ) ) { + $post->post_name = sanitize_title( $name ? $name : $title, $post->ID ); + } - $post->post_name = wp_unique_post_slug($post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent); + $post->post_name = wp_unique_post_slug( $post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent ); $post->filter = 'sample'; - $permalink = get_permalink($post, true); + $permalink = get_permalink( $post, true ); // Replace custom post_type Token with generic pagename token for ease of use. - $permalink = str_replace("%$post->post_type%", '%pagename%', $permalink); + $permalink = str_replace( "%$post->post_type%", '%pagename%', $permalink ); // Handle page hierarchy if ( $ptype->hierarchical ) { - $uri = get_page_uri($post); + $uri = get_page_uri( $post ); if ( $uri ) { - $uri = untrailingslashit($uri); + $uri = untrailingslashit( $uri ); $uri = strrev( stristr( strrev( $uri ), '/' ) ); - $uri = untrailingslashit($uri); + $uri = untrailingslashit( $uri ); } /** This filter is documented in wp-admin/edit-tag-form.php */ $uri = apply_filters( 'editable_slug', $uri, $post ); - if ( !empty($uri) ) + if ( ! empty( $uri ) ) { $uri .= '/'; - $permalink = str_replace('%pagename%', "{$uri}%pagename%", $permalink); + } + $permalink = str_replace( '%pagename%', "{$uri}%pagename%", $permalink ); } /** This filter is documented in wp-admin/edit-tag-form.php */ - $permalink = array( $permalink, apply_filters( 'editable_slug', $post->post_name, $post ) ); + $permalink = array( $permalink, apply_filters( 'editable_slug', $post->post_name, $post ) ); $post->post_status = $original_status; - $post->post_date = $original_date; - $post->post_name = $original_name; - unset($post->filter); + $post->post_date = $original_date; + $post->post_name = $original_name; + unset( $post->filter ); /** * Filters the sample permalink. @@ -1303,17 +1398,18 @@ */ function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) { $post = get_post( $id ); - if ( ! $post ) + if ( ! $post ) { return ''; + } - list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug); + list($permalink, $post_name) = get_sample_permalink( $post->ID, $new_title, $new_slug ); - $view_link = false; + $view_link = false; $preview_target = ''; if ( current_user_can( 'read_post', $post->ID ) ) { if ( 'draft' === $post->post_status || empty( $post->post_name ) ) { - $view_link = get_preview_post_link( $post ); + $view_link = get_preview_post_link( $post ); $preview_target = " target='wp-preview-{$post->ID}'"; } else { if ( 'publish' === $post->post_status || 'attachment' === $post->post_type ) { @@ -1331,14 +1427,14 @@ if ( false !== $view_link ) { $display_link = urldecode( $view_link ); - $return .= '' . esc_html( $display_link ) . "\n"; + $return .= '' . esc_html( $display_link ) . "\n"; } else { $return .= '' . $permalink . "\n"; } // Encourage a pretty permalink setting - if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) ) { - $return .= '' . __('Change Permalinks') . "\n"; + if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && ! ( 'page' == get_option( 'show_on_front' ) && $id == get_option( 'page_on_front' ) ) ) { + $return .= '' . __( 'Change Permalinks' ) . "\n"; } } else { if ( mb_strlen( $post_name ) > 34 ) { @@ -1348,9 +1444,9 @@ } $post_name_html = '' . esc_html( $post_name_abridged ) . ''; - $display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, esc_html( urldecode( $permalink ) ) ); + $display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, esc_html( urldecode( $permalink ) ) ); - $return = '' . __( 'Permalink:' ) . "\n"; + $return = '' . __( 'Permalink:' ) . "\n"; $return .= '' . $display_link . "\n"; $return .= '‎'; // Fix bi-directional text display defect in RTL languages. $return .= '\n"; @@ -1391,7 +1487,8 @@ $set_thumbnail_link = '

%s

'; $upload_iframe_src = get_upload_iframe_src( 'image', $post->ID ); - $content = sprintf( $set_thumbnail_link, + $content = sprintf( + $set_thumbnail_link, esc_url( $upload_iframe_src ), '', // Empty when there's no featured image set, `aria-describedby` attribute otherwise. esc_html( $post_type_object->labels->set_featured_image ) @@ -1422,7 +1519,8 @@ $thumbnail_html = wp_get_attachment_image( $thumbnail_id, $size ); if ( ! empty( $thumbnail_html ) ) { - $content = sprintf( $set_thumbnail_link, + $content = sprintf( + $set_thumbnail_link, esc_url( $upload_iframe_src ), ' aria-describedby="set-post-thumbnail-desc"', $thumbnail_html @@ -1441,9 +1539,9 @@ * @since 3.5.0 Added the `$post_id` parameter. * @since 4.6.0 Added the `$thumbnail_id` parameter. * - * @param string $content Admin post thumbnail HTML markup. - * @param int $post_id Post ID. - * @param int $thumbnail_id Thumbnail ID. + * @param string $content Admin post thumbnail HTML markup. + * @param int $post_id Post ID. + * @param int|null $thumbnail_id Thumbnail attachment ID, or null if there isn't one. */ return apply_filters( 'admin_post_thumbnail_html', $content, $post->ID, $thumbnail_id ); } @@ -1502,7 +1600,7 @@ return false; } - $now = time(); + $now = time(); $lock = "$now:$user_id"; update_post_meta( $post->ID, '_edit_lock', $lock ); @@ -1517,12 +1615,14 @@ * @return none */ function _admin_notice_post_locked() { - if ( ! $post = get_post() ) + if ( ! $post = get_post() ) { return; + } $user = null; - if ( $user_id = wp_check_post_lock( $post->ID ) ) + if ( $user_id = wp_check_post_lock( $post->ID ) ) { $user = get_userdata( $user_id ); + } if ( $user ) { @@ -1537,8 +1637,9 @@ * @param WP_Post $post Post object. * @param WP_User|bool $user WP_User object on success, false otherwise. */ - if ( ! apply_filters( 'show_post_locked_dialog', true, $post, $user ) ) + if ( ! apply_filters( 'show_post_locked_dialog', true, $post, $user ) ) { return; + } $locked = true; } else { @@ -1548,12 +1649,13 @@ if ( $locked && ( $sendback = wp_get_referer() ) && false === strpos( $sendback, 'post.php' ) && false === strpos( $sendback, 'post-new.php' ) ) { - $sendback_text = __('Go back'); + $sendback_text = __( 'Go back' ); } else { $sendback = admin_url( 'edit.php' ); - if ( 'post' != $post->post_type ) + if ( 'post' != $post->post_type ) { $sendback = add_query_arg( 'post_type', $post->post_type, $sendback ); + } $sendback_text = get_post_type_object( $post->post_type )->labels->all_items; } @@ -1571,8 +1673,8 @@ if ( get_post_type_object( $post->post_type )->public ) { if ( 'publish' == $post->post_status || $user->ID != $post->post_author ) { // Latest content is in autosave - $nonce = wp_create_nonce( 'post_preview_' . $post->ID ); - $query_args['preview_id'] = $post->ID; + $nonce = wp_create_nonce( 'post_preview_' . $post->ID ); + $query_args['preview_id'] = $post->ID; $query_args['preview_nonce'] = $nonce; } } @@ -1599,13 +1701,13 @@
ID, 64 ); ?>

display_name ) ); - } else { - /* translators: %s: user's display name */ - printf( __( '%s is already editing this post.' ), esc_html( $user->display_name ) ); - } + if ( $override ) { + /* translators: %s: user's display name */ + printf( __( '%s is already editing this post. Do you want to take over?' ), esc_html( $user->display_name ) ); + } else { + /* translators: %s: user's display name */ + printf( __( '%s is already editing this post.' ), esc_html( $user->display_name ) ); + } ?>

- - " href=""> + - +
- +

ID; + $new_autosave = _wp_post_revision_data( $post_data, true ); + $new_autosave['ID'] = $old_autosave->ID; $new_autosave['post_author'] = $post_author; // If the new autosave has the same content as the post, delete the autosave. - $post = get_post( $post_id ); + $post = get_post( $post_id ); $autosave_is_different = false; foreach ( array_intersect( array_keys( $new_autosave ), array_keys( _wp_post_revision_fields( $post ) ) ) as $field ) { if ( normalize_whitespace( $new_autosave[ $field ] ) != normalize_whitespace( $post->$field ) ) { @@ -1737,7 +1841,7 @@ */ function post_preview() { - $post_ID = (int) $_POST['post_ID']; + $post_ID = (int) $_POST['post_ID']; $_POST['ID'] = $post_ID; if ( ! $post = get_post( $post_ID ) ) { @@ -1755,19 +1859,21 @@ } else { $is_autosave = true; - if ( isset( $_POST['post_status'] ) && 'auto-draft' == $_POST['post_status'] ) + if ( isset( $_POST['post_status'] ) && 'auto-draft' == $_POST['post_status'] ) { $_POST['post_status'] = 'draft'; + } $saved_post_id = wp_create_post_autosave( $post->ID ); } - if ( is_wp_error( $saved_post_id ) ) + if ( is_wp_error( $saved_post_id ) ) { wp_die( $saved_post_id->get_error_message() ); + } $query_args = array(); if ( $is_autosave && $saved_post_id ) { - $query_args['preview_id'] = $post->ID; + $query_args['preview_id'] = $post->ID; $query_args['preview_nonce'] = wp_create_nonce( 'post_preview_' . $post->ID ); if ( isset( $_POST['post_format'] ) ) { @@ -1795,10 +1901,11 @@ */ function wp_autosave( $post_data ) { // Back-compat - if ( ! defined( 'DOING_AUTOSAVE' ) ) + if ( ! defined( 'DOING_AUTOSAVE' ) ) { define( 'DOING_AUTOSAVE', true ); + } - $post_id = (int) $post_data['post_id']; + $post_id = (int) $post_data['post_id']; $post_data['ID'] = $post_data['post_ID'] = $post_id; if ( false === wp_verify_nonce( $post_data['_wpnonce'], 'update-post_' . $post_id ) ) { @@ -1811,11 +1918,13 @@ return new WP_Error( 'edit_posts', __( 'Sorry, you are not allowed to edit this item.' ) ); } - if ( 'auto-draft' == $post->post_status ) + if ( 'auto-draft' == $post->post_status ) { $post_data['post_status'] = 'draft'; + } - if ( $post_data['post_type'] != 'page' && ! empty( $post_data['catslist'] ) ) + if ( $post_data['post_type'] != 'page' && ! empty( $post_data['catslist'] ) ) { $post_data['post_category'] = explode( ',', $post_data['catslist'] ); + } if ( ! wp_check_post_lock( $post->ID ) && get_current_user_id() == $post->post_author && ( 'auto-draft' == $post->post_status || 'draft' == $post->post_status ) ) { // Drafts and auto-drafts are just overwritten by autosave for the same user if the post is not locked @@ -1831,8 +1940,8 @@ * * @param int $post_id Optional. Post ID. */ -function redirect_post($post_id = '') { - if ( isset($_POST['save']) || isset($_POST['publish']) ) { +function redirect_post( $post_id = '' ) { + if ( isset( $_POST['save'] ) || isset( $_POST['publish'] ) ) { $status = get_post_status( $post_id ); if ( isset( $_POST['publish'] ) ) { @@ -1851,13 +1960,13 @@ } $location = add_query_arg( 'message', $message, get_edit_post_link( $post_id, 'url' ) ); - } elseif ( isset($_POST['addmeta']) && $_POST['addmeta'] ) { + } elseif ( isset( $_POST['addmeta'] ) && $_POST['addmeta'] ) { $location = add_query_arg( 'message', 2, wp_get_referer() ); - $location = explode('#', $location); + $location = explode( '#', $location ); $location = $location[0] . '#postcustom'; - } elseif ( isset($_POST['deletemeta']) && $_POST['deletemeta'] ) { + } elseif ( isset( $_POST['deletemeta'] ) && $_POST['deletemeta'] ) { $location = add_query_arg( 'message', 3, wp_get_referer() ); - $location = explode('#', $location); + $location = explode( '#', $location ); $location = $location[0] . '#postcustom'; } else { $location = add_query_arg( 'message', 4, get_edit_post_link( $post_id, 'url' ) ); @@ -1874,3 +1983,428 @@ wp_redirect( apply_filters( 'redirect_post_location', $location, $post_id ) ); exit; } + +/** + * Sanitizes POST values from a checkbox taxonomy metabox. + * + * @since 5.1.0 + * + * @param mixed $terms Raw term data from the 'tax_input' field. + * @return array + */ +function taxonomy_meta_box_sanitize_cb_checkboxes( $taxonomy, $terms ) { + return array_map( 'intval', $terms ); +} + +/** + * Sanitizes POST values from an input taxonomy metabox. + * + * @since 5.1.0 + * + * @param mixed $terms Raw term data from the 'tax_input' field. + * @return array + */ +function taxonomy_meta_box_sanitize_cb_input( $taxonomy, $terms ) { + /* + * Assume that a 'tax_input' string is a comma-separated list of term names. + * Some languages may use a character other than a comma as a delimiter, so we standardize on + * commas before parsing the list. + */ + if ( ! is_array( $terms ) ) { + $comma = _x( ',', 'tag delimiter' ); + if ( ',' !== $comma ) { + $terms = str_replace( $comma, ',', $terms ); + } + $terms = explode( ',', trim( $terms, " \n\t\r\0\x0B," ) ); + } + + $clean_terms = array(); + foreach ( $terms as $term ) { + // Empty terms are invalid input. + if ( empty( $term ) ) { + continue; + } + + $_term = get_terms( + $taxonomy, + array( + 'name' => $term, + 'fields' => 'ids', + 'hide_empty' => false, + ) + ); + + if ( ! empty( $_term ) ) { + $clean_terms[] = intval( $_term[0] ); + } else { + // No existing term was found, so pass the string. A new term will be created. + $clean_terms[] = $term; + } + } + + return $clean_terms; +} + +/** + * Return whether the post can be edited in the block editor. + * + * @since 5.0.0 + * + * @param int|WP_Post $post Post ID or WP_Post object. + * @return bool Whether the post can be edited in the block editor. + */ +function use_block_editor_for_post( $post ) { + $post = get_post( $post ); + + if ( ! $post ) { + return false; + } + + // We're in the meta box loader, so don't use the block editor. + if ( isset( $_GET['meta-box-loader'] ) ) { + check_admin_referer( 'meta-box-loader', 'meta-box-loader-nonce' ); + return false; + } + + // The posts page can't be edited in the block editor. + if ( absint( get_option( 'page_for_posts' ) ) === $post->ID && empty( $post->post_content ) ) { + return false; + } + + $use_block_editor = use_block_editor_for_post_type( $post->post_type ); + + /** + * Filter whether a post is able to be edited in the block editor. + * + * @since 5.0.0 + * + * @param bool $use_block_editor Whether the post can be edited or not. + * @param WP_Post $post The post being checked. + */ + return apply_filters( 'use_block_editor_for_post', $use_block_editor, $post ); +} + +/** + * Return whether a post type is compatible with the block editor. + * + * The block editor depends on the REST API, and if the post type is not shown in the + * REST API, then it won't work with the block editor. + * + * @since 5.0.0 + * + * @param string $post_type The post type. + * @return bool Whether the post type can be edited with the block editor. + */ +function use_block_editor_for_post_type( $post_type ) { + if ( ! post_type_exists( $post_type ) ) { + return false; + } + + if ( ! post_type_supports( $post_type, 'editor' ) ) { + return false; + } + + $post_type_object = get_post_type_object( $post_type ); + if ( $post_type_object && ! $post_type_object->show_in_rest ) { + return false; + } + + /** + * Filter whether a post is able to be edited in the block editor. + * + * @since 5.0.0 + * + * @param bool $use_block_editor Whether the post type can be edited or not. Default true. + * @param string $post_type The post type being checked. + */ + return apply_filters( 'use_block_editor_for_post_type', true, $post_type ); +} + +/** + * Returns all the block categories that will be shown in the block editor. + * + * @since 5.0.0 + * + * @param WP_Post $post Post object. + * @return array Array of block categories. + */ +function get_block_categories( $post ) { + $default_categories = array( + array( + 'slug' => 'common', + 'title' => __( 'Common Blocks' ), + 'icon' => null, + ), + array( + 'slug' => 'formatting', + 'title' => __( 'Formatting' ), + 'icon' => null, + ), + array( + 'slug' => 'layout', + 'title' => __( 'Layout Elements' ), + 'icon' => null, + ), + array( + 'slug' => 'widgets', + 'title' => __( 'Widgets' ), + 'icon' => null, + ), + array( + 'slug' => 'embed', + 'title' => __( 'Embeds' ), + 'icon' => null, + ), + array( + 'slug' => 'reusable', + 'title' => __( 'Reusable Blocks' ), + 'icon' => null, + ), + ); + + /** + * Filter the default array of block categories. + * + * @since 5.0.0 + * + * @param array $default_categories Array of block categories. + * @param WP_Post $post Post being loaded. + */ + return apply_filters( 'block_categories', $default_categories, $post ); +} + +/** + * Prepares server-registered blocks for the block editor. + * + * Returns an associative array of registered block data keyed by block name. Data includes properties + * of a block relevant for client registration. + * + * @since 5.0.0 + * + * @return array An associative array of registered block data. + */ +function get_block_editor_server_block_settings() { + $block_registry = WP_Block_Type_Registry::get_instance(); + $blocks = array(); + $keys_to_pick = array( 'title', 'description', 'icon', 'category', 'keywords', 'supports', 'attributes' ); + + foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) { + foreach ( $keys_to_pick as $key ) { + if ( ! isset( $block_type->{ $key } ) ) { + continue; + } + + if ( ! isset( $blocks[ $block_name ] ) ) { + $blocks[ $block_name ] = array(); + } + + $blocks[ $block_name ][ $key ] = $block_type->{ $key }; + } + } + + return $blocks; +} + +/** + * Renders the meta boxes forms. + * + * @since 5.0.0 + */ +function the_block_editor_meta_boxes() { + global $post, $current_screen, $wp_meta_boxes; + + // Handle meta box state. + $_original_meta_boxes = $wp_meta_boxes; + + /** + * Fires right before the meta boxes are rendered. + * + * This allows for the filtering of meta box data, that should already be + * present by this point. Do not use as a means of adding meta box data. + * + * @since 5.0.0 + * + * @param array $wp_meta_boxes Global meta box state. + */ + $wp_meta_boxes = apply_filters( 'filter_block_editor_meta_boxes', $wp_meta_boxes ); + $locations = array( 'side', 'normal', 'advanced' ); + $priorities = array( 'high', 'sorted', 'core', 'default', 'low' ); + + // Render meta boxes. + ?> +
+ +
+
+ + +
+ +
+ +
+ + id ][ $location ] ) ) { + continue; + } + + foreach ( $priorities as $priority ) { + if ( ! isset( $wp_meta_boxes[ $current_screen->id ][ $location ][ $priority ] ) ) { + continue; + } + + $meta_boxes = (array) $wp_meta_boxes[ $current_screen->id ][ $location ][ $priority ]; + foreach ( $meta_boxes as $meta_box ) { + if ( false == $meta_box || ! $meta_box['title'] ) { + continue; + } + + // If a meta box is just here for back compat, don't show it in the block editor. + if ( isset( $meta_box['args']['__back_compat_meta_box'] ) && $meta_box['args']['__back_compat_meta_box'] ) { + continue; + } + + $meta_boxes_per_location[ $location ][] = array( + 'id' => $meta_box['id'], + 'title' => $meta_box['title'], + ); + } + } + } + + /** + * Sadly we probably can not add this data directly into editor settings. + * + * Some meta boxes need admin_head to fire for meta box registry. + * admin_head fires after admin_enqueue_scripts, which is where we create our + * editor instance. + */ + $script = 'window._wpLoadBlockEditor.then( function() { + wp.data.dispatch( \'core/edit-post\' ).setAvailableMetaBoxesPerLocation( ' . wp_json_encode( $meta_boxes_per_location ) . ' ); + } );'; + + wp_add_inline_script( 'wp-edit-post', $script ); + + /** + * When `wp-edit-post` is output in the ``, the inline script needs to be manually printed. Otherwise, + * meta boxes will not display because inline scripts for `wp-edit-post` will not be printed again after this point. + */ + if ( wp_script_is( 'wp-edit-post', 'done' ) ) { + printf( "\n", trim( $script ) ); + } + + /** + * If the 'postcustom' meta box is enabled, then we need to perform some + * extra initialization on it. + */ + $enable_custom_fields = (bool) get_user_meta( get_current_user_id(), 'enable_custom_fields', true ); + if ( $enable_custom_fields ) { + $script = "( function( $ ) { + if ( $('#postcustom').length ) { + $( '#the-list' ).wpList( { + addBefore: function( s ) { + s.data += '&post_id=$post->ID'; + return s; + }, + addAfter: function() { + $('table#list-table').show(); + } + }); + } + } )( jQuery );"; + wp_enqueue_script( 'wp-lists' ); + wp_add_inline_script( 'wp-lists', $script ); + } + + // Reset meta box data. + $wp_meta_boxes = $_original_meta_boxes; +} + +/** + * Renders the hidden form required for the meta boxes form. + * + * @since 5.0.0 + * + * @param WP_Post $post Current post object. + */ +function the_block_editor_meta_box_post_form_hidden_fields( $post ) { + $form_extra = ''; + if ( 'auto-draft' === $post->post_status ) { + $form_extra .= ""; + } + $form_action = 'editpost'; + $nonce_action = 'update-post_' . $post->ID; + $form_extra .= ""; + $referer = wp_get_referer(); + $current_user = wp_get_current_user(); + $user_id = $current_user->ID; + wp_nonce_field( $nonce_action ); + + /* + * Some meta boxes hook into these actions to add hidden input fields in the classic post form. For backwards + * compatibility, we can capture the output from these actions, and extract the hidden input fields. + */ + ob_start(); + /** This filter is documented in wp-admin/edit-form-advanced.php */ + do_action( 'edit_form_after_title', $post ); + /** This filter is documented in wp-admin/edit-form-advanced.php */ + do_action( 'edit_form_advanced', $post ); + $classic_output = ob_get_clean(); + + $classic_elements = wp_html_split( $classic_output ); + $hidden_inputs = ''; + foreach ( $classic_elements as $element ) { + if ( 0 !== strpos( $element, ' + + + + + + + + ` fields, which will be POSTed back to + * the server when meta boxes are saved. + * + * @since 5.0.0 + * + * @params WP_Post $post The post that is being edited. + */ + do_action( 'block_editor_meta_box_hidden_fields', $post ); +}