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'] )
+ return new WP_Error( 'edit_others_pages', __( 'You are not allowed to edit pages as this user.' ) );
+ else
+ return new WP_Error( 'edit_others_posts', __( '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'] )
+ return new WP_Error( 'edit_others_pages', __( 'You are not allowed to create pages as this user.' ) );
+ else
+ return new WP_Error( 'edit_others_posts', __( 'You are not allowed to create posts as this user.' ) );
+ }
+
if ( isset( $post_data['content'] ) )
$post_data['post_content'] = $post_data['content'];
if ( isset($post_data['trackback_url']) )
$post_data['to_ping'] = $post_data['trackback_url'];
- if ( !isset($post_data['user_ID']) )
- $post_data['user_ID'] = $GLOBALS['user_ID'];
+ $post_data['user_ID'] = get_current_user_id();
if (!empty ( $post_data['post_author_override'] ) ) {
$post_data['post_author'] = (int) $post_data['post_author_override'];
}
}
- $ptype = get_post_type_object( $post_data['post_type'] );
- if ( isset($post_data['user_ID']) && ($post_data['post_author'] != $post_data['user_ID']) ) {
- if ( !current_user_can( $ptype->cap->edit_others_posts ) ) {
- if ( 'page' == $post_data['post_type'] ) {
- return new WP_Error( 'edit_others_pages', $update ?
- __( 'You are not allowed to edit pages as this user.' ) :
- __( 'You are not allowed to create pages as this user.' )
- );
- } else {
- return new WP_Error( 'edit_others_posts', $update ?
- __( 'You are not allowed to edit posts as this user.' ) :
- __( 'You are not allowed to post as this user.' )
- );
- }
+ if ( isset( $post_data['user_ID'] ) && ( $post_data['post_author'] != $post_data['user_ID'] )
+ && ! current_user_can( $ptype->cap->edit_others_posts ) ) {
+ if ( $update ) {
+ if ( 'page' == $post_data['post_type'] )
+ return new WP_Error( 'edit_others_pages', __( 'You are not allowed to edit pages as this user.' ) );
+ else
+ return new WP_Error( 'edit_others_posts', __( 'You are not allowed to edit posts as this user.' ) );
+ } else {
+ if ( 'page' == $post_data['post_type'] )
+ return new WP_Error( 'edit_others_pages', __( 'You are not allowed to create pages as this user.' ) );
+ else
+ return new WP_Error( 'edit_others_posts', __( 'You are not allowed to create posts as this user.' ) );
+ }
+ }
+
+ if ( ! empty( $post_data['post_status'] ) ) {
+ $post_data['post_status'] = sanitize_key( $post_data['post_status'] );
+
+ // No longer an auto-draft
+ if ( 'auto-draft' === $post_data['post_status'] ) {
+ $post_data['post_status'] = 'draft';
+ }
+
+ if ( ! get_post_status_object( $post_data['post_status'] ) ) {
+ unset( $post_data['post_status'] );
}
}
$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 ) ) {
+ $post_data['post_status'] = $previous_status ? $previous_status : 'pending';
+ }
+
+ $published_statuses = array( 'publish', 'future' );
+
// 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']) && ('publish' == $post_data['post_status'] && !current_user_can( $ptype->cap->publish_posts )) )
- if ( $previous_status != 'publish' || !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'] = $previous_status;
+ if ( ! isset( $post_data['post_status'] ) ) {
+ $post_data['post_status'] = 'auto-draft' === $previous_status ? 'draft' : $previous_status;
+ }
+
+ if ( isset( $post_data['post_password'] ) && ! current_user_can( $ptype->cap->publish_posts ) ) {
+ unset( $post_data['post_password'] );
+ }
if (!isset( $post_data['comment_status'] ))
$post_data['comment_status'] = 'closed';
$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', __( 'Whoops, the provided date is invalid.' ) );
+ }
$post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
}
$post_data['post_type'] = $post->post_type;
$post_data['post_mime_type'] = $post->post_mime_type;
+ if ( ! empty( $post_data['post_status'] ) ) {
+ $post_data['post_status'] = sanitize_key( $post_data['post_status'] );
+
+ if ( 'inherit' == $post_data['post_status'] ) {
+ unset( $post_data['post_status'] );
+ }
+ }
+
$ptype = get_post_type_object($post_data['post_type']);
- if ( !current_user_can( $ptype->cap->edit_post, $post_ID ) ) {
+ if ( !current_user_can( 'edit_post', $post_ID ) ) {
if ( 'page' == $post_data['post_type'] )
wp_die( __('You are not allowed to edit this page.' ));
else
wp_die( __('You are not allowed to edit this post.' ));
}
- // Autosave shouldn't save too soon after a real save
- if ( 'autosave' == $post_data['action'] ) {
- $post =& get_post( $post_ID );
- $now = time();
- $then = strtotime($post->post_date_gmt . ' +0000');
- $delta = AUTOSAVE_INTERVAL / 2;
- if ( ($now - $then) < $delta )
- return $post_ID;
- }
+ if ( post_type_supports( $ptype->name, 'revisions' ) ) {
+ $revisions = wp_get_post_revisions( $post_ID, array( 'order' => 'ASC', 'posts_per_page' => 1 ) );
+ $revision = current( $revisions );
- $post_data = _wp_translate_postdata( true, $post_data );
- if ( is_wp_error($post_data) )
- wp_die( $post_data->get_error_message() );
- if ( 'autosave' != $post_data['action'] && 'auto-draft' == $post_data['post_status'] )
- $post_data['post_status'] = 'draft';
+ // Check if the revisions have been upgraded
+ 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']) ) {
switch ( $post_data['visibility'] ) {
}
}
+ $post_data = _wp_translate_postdata( true, $post_data );
+ if ( is_wp_error($post_data) )
+ wp_die( $post_data->get_error_message() );
+
// Post Formats
- if ( isset( $post_data['post_format'] ) ) {
- if ( current_theme_supports( 'post-formats', $post_data['post_format'] ) )
- set_post_format( $post_ID, $post_data['post_format'] );
- elseif ( '0' == $post_data['post_format'] )
- set_post_format( $post_ID, false );
+ 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 ] ) )
+ 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' );
+
+ foreach ( $format_keys as $key ) {
+ $keyed = '_format_' . $key;
+ if ( isset( $post_data[ $keyed ] ) ) {
+ if ( current_user_can( 'unfiltered_html' ) )
+ update_post_meta( $post_ID, $keyed, $post_data[ $keyed ] );
+ else
+ update_post_meta( $post_ID, $keyed, wp_filter_post_kses( $post_data[ $keyed ] ) );
+ }
+ }
+
+ if ( 'attachment' === $post_data['post_type'] && preg_match( '#^(audio|video)/#', $post_data['post_mime_type'] ) ) {
+ $id3data = wp_get_attachment_metadata( $post_ID );
+ if ( ! is_array( $id3data ) ) {
+ $id3data = array();
+ }
+
+ foreach ( wp_get_attachment_id3_keys( $post, 'edit' ) as $key => $label ) {
+ if ( isset( $post_data[ 'id3_' . $key ] ) ) {
+ $id3data[ $key ] = sanitize_text_field( wp_unslash( $post_data[ 'id3_' . $key ] ) );
+ }
+ }
+ wp_update_attachment_metadata( $post_ID, $id3data );
}
// Meta Stuff
}
}
+ // Attachment stuff
+ if ( 'attachment' == $post_data['post_type'] ) {
+ 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 );
+ // update_meta expects slashed.
+ update_post_meta( $post_ID, '_wp_attachment_image_alt', wp_slash( $image_alt ) );
+ }
+ }
+
+ $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 );
+ }
+
add_meta( $post_ID );
- update_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID );
+ update_post_meta( $post_ID, '_edit_last', get_current_user_id() );
wp_update_post( $post_data );
}
unset($post_data['_status']);
+ if ( ! empty( $post_data['post_status'] ) ) {
+ $post_data['post_status'] = sanitize_key( $post_data['post_status'] );
+
+ if ( 'inherit' == $post_data['post_status'] ) {
+ unset( $post_data['post_status'] );
+ }
+ }
+
$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' );
+ $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',
+ );
+
foreach ( $reset as $field ) {
if ( isset($post_data[$field]) && ( '' == $post_data[$field] || -1 == $post_data[$field] ) )
unset($post_data[$field]);
}
}
- if ( isset( $post_data['post_format'] ) ) {
- if ( '0' == $post_data['post_format'] )
- $post_data['post_format'] = false;
- // don't change the post format if it's not supported or not '0' (standard)
- elseif ( ! current_theme_supports( 'post-formats', $post_data['post_format'] ) )
- unset( $post_data['post_format'] );
- }
-
$updated = $skipped = $locked = array();
+ $shared_post_data = $post_data;
+
foreach ( $post_IDs as $post_ID ) {
+ // Start with fresh post data with each iteration.
+ $post_data = $shared_post_data;
+
$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( $post_type_object->cap->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;
}
unset( $post_data['tax_input']['category'] );
}
+ $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 ] ) ) {
+ $post_data[ $field ] = $post->$field;
+ }
+ }
+
$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;
+ }
+
$updated[] = wp_update_post( $post_data );
if ( isset( $post_data['sticky'] ) && current_user_can( $ptype->cap->edit_others_posts ) ) {
* @since 2.0.0
*
* @param string $post_type A post type string, defaults to 'post'.
- * @return object stdClass object containing all the default post data as attributes
+ * @return WP_Post Post object containing all the default post data as attributes
*/
function get_default_post_to_edit( $post_type = 'post', $create_in_db = false ) {
- global $wpdb;
-
$post_title = '';
if ( !empty( $_REQUEST['post_title'] ) )
- $post_title = esc_html( stripslashes( $_REQUEST['post_title'] ));
+ $post_title = esc_html( wp_unslash( $_REQUEST['post_title'] ));
$post_content = '';
if ( !empty( $_REQUEST['content'] ) )
- $post_content = esc_html( stripslashes( $_REQUEST['content'] ));
+ $post_content = esc_html( wp_unslash( $_REQUEST['content'] ));
$post_excerpt = '';
if ( !empty( $_REQUEST['excerpt'] ) )
- $post_excerpt = esc_html( stripslashes( $_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->page_template = 'default';
$post->post_parent = 0;
$post->menu_order = 0;
+ $post = new WP_Post( $post );
}
+ /**
+ * Filter the default post content initially used in the "Write Post" form.
+ *
+ * @since 1.5.0
+ *
+ * @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_title = apply_filters( 'default_title', $post_title, $post );
+
+ /**
+ * Filter the default post title initially used in the "Write Post" form.
+ *
+ * @since 1.5.0
+ *
+ * @param string $post_title Default post title.
+ * @param WP_Post $post Post object.
+ */
+ $post->post_title = apply_filters( 'default_title', $post_title, $post );
+
+ /**
+ * Filter the default post excerpt initially used in the "Write Post" form.
+ *
+ * @since 1.5.0
+ *
+ * @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_name = '';
return $post;
}
-/**
- * Get the default page information to use.
- *
- * @since 2.5.0
- *
- * @return object stdClass object containing all the default post data as attributes
- */
-function get_default_page_to_edit() {
- $page = get_default_post_to_edit();
- $page->post_type = 'page';
- return $page;
-}
-
-/**
- * Get an existing post and format it for editing.
- *
- * @since 2.0.0
- *
- * @param unknown_type $id
- * @return unknown
- */
-function get_post_to_edit( $id ) {
-
- $post = get_post( $id, OBJECT, 'edit' );
-
- if ( $post->post_type == 'page' )
- $post->page_template = get_post_meta( $id, '_wp_page_template', true );
-
- return $post;
-}
-
/**
* Determine if a post exists based on title, content, and date
*
function post_exists($title, $content = '', $date = '') {
global $wpdb;
- $post_title = stripslashes( sanitize_post_field( 'post_title', $title, 0, 'db' ) );
- $post_content = stripslashes( sanitize_post_field( 'post_content', $content, 0, 'db' ) );
- $post_date = stripslashes( sanitize_post_field( 'post_date', $date, 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' ) );
$query = "SELECT ID FROM $wpdb->posts WHERE 1=1";
$args = array();
}
if ( !empty ( $args ) )
- return $wpdb->get_var( $wpdb->prepare($query, $args) );
+ return (int) $wpdb->get_var( $wpdb->prepare($query, $args) );
return 0;
}
* @return unknown
*/
function wp_write_post() {
- global $user_ID;
-
if ( isset($_POST['post_type']) )
$ptype = get_post_type_object($_POST['post_type']);
else
if ( isset( $_POST['post_ID'] ) )
return edit_post();
- $translated = _wp_translate_postdata( false );
- if ( is_wp_error($translated) )
- return $translated;
-
if ( isset($_POST['visibility']) ) {
switch ( $_POST['visibility'] ) {
case 'public' :
}
}
+ $translated = _wp_translate_postdata( false );
+ if ( is_wp_error($translated) )
+ return $translated;
+
// Create the post.
$post_ID = wp_insert_post( $_POST );
if ( is_wp_error( $post_ID ) )
* @return unknown
*/
function add_meta( $post_ID ) {
- global $wpdb;
$post_ID = (int) $post_ID;
- $metakeyselect = isset($_POST['metakeyselect']) ? stripslashes( trim( $_POST['metakeyselect'] ) ) : '';
- $metakeyinput = isset($_POST['metakeyinput']) ? stripslashes( trim( $_POST['metakeyinput'] ) ) : '';
+ $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 ) ) ) {
- // We have a key/value pair. If both the select and the
- // input for the key have data, the input takes precedence:
-
+ /*
+ * 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 )
$metakey = $metakeyselect;
if ( is_protected_meta( $metakey, 'post' ) || ! current_user_can( 'add_post_meta', $post_ID, $metakey ) )
return false;
- $metakey = esc_sql( $metakey );
+ $metakey = wp_slash( $metakey );
return add_post_meta( $post_ID, $metakey, $metavalue );
}
* @return unknown
*/
function update_meta( $meta_id, $meta_key, $meta_value ) {
- $meta_key = stripslashes( $meta_key );
- $meta_value = stripslashes_deep( $meta_value );
+ $meta_key = wp_unslash( $meta_key );
+ $meta_value = wp_unslash( $meta_value );
return update_metadata_by_mid( 'post', $meta_id, $meta_value, $meta_key );
}
* @since 2.3.0
* @access private
*
- * @param unknown_type $post_ID
- * @return unknown
+ * @param int|object $post Post ID or post object.
+ * @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_ID ) {
- $post = & get_post( $post_ID, ARRAY_A );
+function _fix_attachment_links( $post ) {
+ $post = get_post( $post, ARRAY_A );
$content = $post['post_content'];
- // quick sanity check, don't run if no pretty permalinks or post is not published
- if ( !get_option('permalink_structure') || $post['post_status'] != 'publish' )
+ // 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' ) ) )
return;
// Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero)
}
}
-/**
- * Move child posts to a new parent.
- *
- * @since 2.3.0
- * @access private
- *
- * @param unknown_type $old_ID
- * @param unknown_type $new_ID
- * @return unknown
- */
-function _relocate_children( $old_ID, $new_ID ) {
- global $wpdb;
- $old_ID = (int) $old_ID;
- $new_ID = (int) $new_ID;
-
- $children = $wpdb->get_col( $wpdb->prepare("
- SELECT post_id
- FROM $wpdb->postmeta
- WHERE meta_key = '_wp_attachment_temp_parent'
- AND meta_value = %d", $old_ID) );
-
- foreach ( $children as $child_id ) {
- $wpdb->update($wpdb->posts, array('post_parent' => $new_ID), array('ID' => $child_id) );
- delete_post_meta($child_id, '_wp_attachment_temp_parent');
- }
-}
-
/**
* Get all the possible statuses for a post_type
*
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 )
$posts_per_page = 20;
- $posts_per_page = apply_filters( $per_page, $posts_per_page );
+ /**
+ * Filter the number of items per page to show for a specific 'per_page' type.
+ *
+ * The dynamic portion of the hook name, $post_type, refers to the post type.
+ *
+ * Some examples of filter hooks generated here include: 'edit_attachment_per_page',
+ * 'edit_post_per_page', 'edit_page_per_page', etc.
+ *
+ * @since 3.0.0
+ *
+ * @param int $posts_per_page Number of posts to display per page for the given post
+ * type. Default 20.
+ */
+ $posts_per_page = apply_filters( "edit_{$post_type}_per_page", $posts_per_page );
+
+ /**
+ * Filter the number of posts displayed per page when specifically listing "posts".
+ *
+ * @since 2.8.0
+ *
+ * @param int $posts_per_page Number of posts to be displayed. Default 20.
+ * @param string $post_type The post type.
+ */
$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');
return $avail_post_stati;
}
-/**
- * Get default post mime types
- *
- * @since 2.9.0
- *
- * @return array
- */
-function get_post_mime_types() {
- $post_mime_types = array( // array( adj, noun )
- 'image' => array(__('Images'), __('Manage Images'), _n_noop('Image <span class="count">(%s)</span>', 'Images <span class="count">(%s)</span>')),
- 'audio' => array(__('Audio'), __('Manage Audio'), _n_noop('Audio <span class="count">(%s)</span>', 'Audio <span class="count">(%s)</span>')),
- 'video' => array(__('Video'), __('Manage Video'), _n_noop('Video <span class="count">(%s)</span>', 'Video <span class="count">(%s)</span>')),
- );
-
- return apply_filters('post_mime_types', $post_mime_types);
-}
-
/**
* {@internal Missing Short Description}}
*
}
/**
- * {@internal Missing Short Description}}
+ * Executes a query for attachments. An array of WP_Query arguments
+ * can be passed in, which will override the arguments set by this function.
*
* @since 2.5.0
*
- * @param unknown_type $q
- * @return unknown
+ * @param array|bool $q Array of query variables to use to build the query or false to use $_GET superglobal.
+ * @return array
*/
function wp_edit_attachments_query( $q = false ) {
if ( false === $q )
$states .= ',private';
$q['post_status'] = isset( $q['status'] ) && 'trash' == $q['status'] ? 'trash' : $states;
+ $q['post_status'] = isset( $q['attachment-filter'] ) && 'trash' == $q['attachment-filter'] ? 'trash' : $states;
+
$media_per_page = (int) get_user_option( 'upload_per_page' );
if ( empty( $media_per_page ) || $media_per_page < 1 )
$media_per_page = 20;
+
+ /**
+ * Filter the number of items to list per page when listing media items.
+ *
+ * @since 2.9.0
+ *
+ * @param int $media_per_page Number of media to list. Default 20.
+ */
$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['detached']) )
- add_filter('posts_where', '_edit_attachments_query_helper');
+ foreach( array_keys( $post_mime_types ) as $type ) {
+ if ( isset( $q['attachment-filter'] ) && "post_mime_type:$type" == $q['attachment-filter'] ) {
+ $q['post_mime_type'] = $type;
+ break;
+ }
+ }
- wp( $q );
+ if ( isset( $q['detached'] ) || ( isset( $q['attachment-filter'] ) && 'detached' == $q['attachment-filter'] ) ) {
+ $q['post_parent'] = 0;
+ }
- if ( isset($q['detached']) )
- remove_filter('posts_where', '_edit_attachments_query_helper');
+ wp( $q );
return array($post_mime_types, $avail_post_mime_types);
}
-function _edit_attachments_query_helper($where) {
- global $wpdb;
- return $where .= " AND {$wpdb->posts}.post_parent < 1";
-}
-
/**
* Returns the list of classes to be used by a metabox
*
$classes = array( '' );
}
+ /**
+ * Filter the postbox classes for a specific screen and screen ID combo.
+ *
+ * The dynamic portions of the hook name, $page, and $id, refer to
+ * the screen, and screen ID, respectively.
+ *
+ * @since 3.2.0
+ *
+ * @param array $classes An array of postbox classes.
+ */
$classes = apply_filters( "postbox_classes_{$page}_{$id}", $classes );
return implode( ' ', $classes );
}
* @return array With two entries of type string
*/
function get_sample_permalink($id, $title = null, $name = null) {
- $post = &get_post($id);
- if ( !$post->ID )
- return array('', '');
+ $post = get_post( $id );
+ if ( ! $post )
+ return array( '', '' );
$ptype = get_post_type_object($post->post_type);
$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')) ) {
+ // 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' ) ) ) {
$post->post_status = 'publish';
$post->post_name = sanitize_title($post->post_name ? $post->post_name : $post->post_title, $post->ID);
}
$uri = untrailingslashit($uri);
$uri = strrev( stristr( strrev( $uri ), '/' ) );
$uri = untrailingslashit($uri);
+
+ /** This filter is documented in wp-admin/edit-tag-form.php */
$uri = apply_filters( 'editable_slug', $uri );
if ( !empty($uri) )
$uri .= '/';
$permalink = str_replace('%pagename%', "{$uri}%pagename%", $permalink);
}
- $permalink = array($permalink, apply_filters('editable_slug', $post->post_name));
+ /** This filter is documented in wp-admin/edit-tag-form.php */
+ $permalink = array( $permalink, apply_filters( 'editable_slug', $post->post_name ) );
$post->post_status = $original_status;
$post->post_date = $original_date;
$post->post_name = $original_name;
}
/**
- * sample permalink html
- *
- * intended to be used for the inplace editor of the permalink post slug on in the post (and page?) editor.
+ * Returns the HTML of the sample permalink slug editor.
*
* @since 2.5.0
*
* @param int|object $id Post ID or post object.
- * @param string $new_title (optional) New title
- * @param string $new_slug (optional) New slug
- * @return string intended to be used for the inplace editor of the permalink post slug on in the post (and page?) editor.
+ * @param string $new_title Optional. New title.
+ * @param string $new_slug Optional. New slug.
+ * @return string The HTML of the sample permalink slug editor.
*/
function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
- global $wpdb;
- $post = &get_post($id);
+ $post = get_post( $id );
+ if ( ! $post )
+ return '';
list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);
- if ( 'publish' == $post->post_status ) {
- $ptype = get_post_type_object($post->post_type);
+ if ( current_user_can( 'read_post', $post->ID ) ) {
+ $ptype = get_post_type_object( $post->post_type );
$view_post = $ptype->labels->view_item;
+ }
+
+ if ( 'publish' == get_post_status( $post ) ) {
$title = __('Click to edit this part of the permalink');
} else {
$title = __('Temporary permalink. Click to edit this part.');
}
- if ( false === strpos($permalink, '%postname%') && false === strpos($permalink, '%pagename%') ) {
- $return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink">' . $permalink . "</span>\n";
- if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) )
- $return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button" target="_blank">' . __('Change Permalinks') . "</a></span>\n";
- if ( isset($view_post) )
- $return .= "<span id='view-post-btn'><a href='$permalink' class='button' target='_blank'>$view_post</a></span>\n";
-
- $return = apply_filters('get_sample_permalink_html', $return, $id, $new_title, $new_slug);
-
- return $return;
- }
-
- if ( function_exists('mb_strlen') ) {
- if ( mb_strlen($post_name) > 30 ) {
- $post_name_abridged = mb_substr($post_name, 0, 14). '…' . mb_substr($post_name, -14);
- } else {
- $post_name_abridged = $post_name;
+ if ( false === strpos( $permalink, '%postname%' ) && false === strpos( $permalink, '%pagename%' ) ) {
+ $return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink" tabindex="-1">' . $permalink . "</span>\n";
+ if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) ) {
+ $return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button button-small" target="_blank">' . __('Change Permalinks') . "</a></span>\n";
}
} else {
- if ( strlen($post_name) > 30 ) {
- $post_name_abridged = substr($post_name, 0, 14). '…' . substr($post_name, -14);
+ if ( function_exists( 'mb_strlen' ) && mb_strlen( $post_name ) > 30 ) {
+ $post_name_abridged = mb_substr( $post_name, 0, 14 ) . '…' . mb_substr( $post_name, -14 );
+ } elseif ( strlen( $post_name ) > 30 ) {
+ $post_name_abridged = substr( $post_name, 0, 14 ) . '…' . substr( $post_name, -14 );
} else {
$post_name_abridged = $post_name;
}
+
+ $post_name_html = '<span id="editable-post-name" title="' . $title . '">' . $post_name_abridged . '</span>';
+ $display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, $permalink );
+
+ $return = '<strong>' . __( 'Permalink:' ) . "</strong>\n";
+ $return .= '<span id="sample-permalink" tabindex="-1">' . $display_link . "</span>\n";
+ $return .= '‎'; // Fix bi-directional text display defect in RTL languages.
+ $return .= '<span id="edit-slug-buttons"><a href="#post_name" class="edit-slug button button-small hide-if-no-js" onclick="editPermalink(' . $id . '); return false;">' . __( 'Edit' ) . "</a></span>\n";
+ $return .= '<span id="editable-post-name-full">' . $post_name . "</span>\n";
}
- $post_name_html = '<span id="editable-post-name" title="' . $title . '">' . $post_name_abridged . '</span>';
- $display_link = str_replace(array('%pagename%','%postname%'), $post_name_html, $permalink);
- $view_link = str_replace(array('%pagename%','%postname%'), $post_name, $permalink);
- $return = '<strong>' . __('Permalink:') . "</strong>\n";
- $return .= '<span id="sample-permalink">' . $display_link . "</span>\n";
- $return .= '‎'; // Fix bi-directional text display defect in RTL languages.
- $return .= '<span id="edit-slug-buttons"><a href="#post_name" class="edit-slug button hide-if-no-js" onclick="editPermalink(' . $id . '); return false;">' . __('Edit') . "</a></span>\n";
- $return .= '<span id="editable-post-name-full">' . $post_name . "</span>\n";
- if ( isset($view_post) )
- $return .= "<span id='view-post-btn'><a href='$view_link' class='button' target='_blank'>$view_post</a></span>\n";
+ if ( isset( $view_post ) ) {
+ if( 'draft' == $post->post_status ) {
+ $preview_link = set_url_scheme( get_permalink( $post->ID ) );
+ /** This filter is documented in wp-admin/includes/meta-boxes.php */
+ $preview_link = apply_filters( 'preview_post_link', add_query_arg( 'preview', 'true', $preview_link ), $post );
+ $return .= "<span id='view-post-btn'><a href='" . esc_url( $preview_link ) . "' class='button button-small' target='wp-preview-{$post->ID}'>$view_post</a></span>\n";
+ } else {
+ $return .= "<span id='view-post-btn'><a href='" . get_permalink( $post ) . "' class='button button-small'>$view_post</a></span>\n";
+ }
+ }
- $return = apply_filters('get_sample_permalink_html', $return, $id, $new_title, $new_slug);
+ /**
+ * Filter the sample permalink HTML markup.
+ *
+ * @since 2.9.0
+ *
+ * @param string $return Sample permalink HTML markup.
+ * @param int|WP_Post $id Post object or ID.
+ * @param string $new_title New sample permalink title.
+ * @param string $new_slug New sample permalink slug.
+ */
+ $return = apply_filters( 'get_sample_permalink_html', $return, $id, $new_title, $new_slug );
return $return;
}
* @since 2.9.0
*
* @param int $thumbnail_id ID of the attachment used for thumbnail
- * @param int $post_id ID of the post associated with the thumbnail, defaults to global $post_ID
+ * @param mixed $post The post ID or object associated with the thumbnail, defaults to global $post.
* @return string html
*/
-function _wp_post_thumbnail_html( $thumbnail_id = null, $post_id = null ) {
- global $content_width, $_wp_additional_image_sizes, $post_ID;
+function _wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) {
+ global $content_width, $_wp_additional_image_sizes;
- if ( empty( $post_id ) )
- $post_id = $post_ID;
+ $post = get_post( $post );
- $upload_iframe_src = esc_url( get_upload_iframe_src('image', $post_id) );
+ $upload_iframe_src = esc_url( get_upload_iframe_src('image', $post->ID ) );
$set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__( 'Set featured image' ) . '" href="%s" id="set-post-thumbnail" class="thickbox">%s</a></p>';
$content = sprintf( $set_thumbnail_link, $upload_iframe_src, esc_html__( 'Set featured image' ) );
else
$thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'post-thumbnail' );
if ( !empty( $thumbnail_html ) ) {
- $ajax_nonce = wp_create_nonce( "set_post_thumbnail-$post_id" );
+ $ajax_nonce = wp_create_nonce( 'set_post_thumbnail-' . $post->ID );
$content = sprintf( $set_thumbnail_link, $upload_iframe_src, $thumbnail_html );
$content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail" onclick="WPRemoveThumbnail(\'' . $ajax_nonce . '\');return false;">' . esc_html__( 'Remove featured image' ) . '</a></p>';
}
$content_width = $old_content_width;
}
- return apply_filters( 'admin_post_thumbnail_html', $content );
+ /**
+ * Filter the admin post thumbnail HTML markup to return.
+ *
+ * @since 2.9.0
+ *
+ * @param string $content Admin post thumbnail HTML markup.
+ * @param int $post_id Post ID.
+ */
+ return apply_filters( 'admin_post_thumbnail_html', $content, $post->ID );
}
/**
$time = $lock[0];
$user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true );
- $time_window = apply_filters( 'wp_check_post_lock_window', AUTOSAVE_INTERVAL * 2 );
+ /** This filter is documented in wp-admin/includes/ajax-actions.php */
+ $time_window = apply_filters( 'wp_check_post_lock_window', 150 );
if ( $time && $time > time() - $time_window && $user != get_current_user_id() )
return $user;
}
/**
- * Outputs the notice message to say that someone else is editing this post at the moment.
+ * Outputs the HTML for the notice to say that someone else is editing or has taken over editing of this post.
*
* @since 2.8.5
* @return none
*/
function _admin_notice_post_locked() {
- global $post;
+ if ( ! $post = get_post() )
+ return;
- $lock = explode( ':', get_post_meta( $post->ID, '_edit_lock', true ) );
- $user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true );
- $last_user = get_userdata( $user );
- $last_user_name = $last_user ? $last_user->display_name : __('Somebody');
+ $user = null;
+ if ( $user_id = wp_check_post_lock( $post->ID ) )
+ $user = get_userdata( $user_id );
+
+ if ( $user ) {
+
+ /**
+ * Filter whether to show the post locked dialog.
+ *
+ * Returning a falsey value to the filter will short-circuit displaying the dialog.
+ *
+ * @since 3.6.0
+ *
+ * @param bool $display Whether to display the dialog. Default true.
+ * @param WP_User|bool $user WP_User object on success, false otherwise.
+ */
+ if ( ! apply_filters( 'show_post_locked_dialog', true, $post, $user ) )
+ return;
+
+ $locked = true;
+ } else {
+ $locked = false;
+ }
- switch ($post->post_type) {
- case 'post':
- $message = __( 'Warning: %s is currently editing this post' );
- break;
- case 'page':
- $message = __( 'Warning: %s is currently editing this page' );
- break;
- default:
- $message = __( 'Warning: %s is currently editing this.' );
+ if ( $locked && ( $sendback = wp_get_referer() ) &&
+ false === strpos( $sendback, 'post.php' ) && false === strpos( $sendback, 'post-new.php' ) ) {
+
+ $sendback_text = __('Go back');
+ } else {
+ $sendback = admin_url( 'edit.php' );
+
+ 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;
}
- $message = sprintf( $message, esc_html( $last_user_name ) );
- echo "<div class='error'><p>$message</p></div>";
+ $hidden = $locked ? '' : ' hidden';
+
+ ?>
+ <div id="post-lock-dialog" class="notification-dialog-wrap<?php echo $hidden; ?>">
+ <div class="notification-dialog-background"></div>
+ <div class="notification-dialog">
+ <?php
+
+ if ( $locked ) {
+ if ( get_post_type_object( $post->post_type )->public ) {
+ $preview_link = set_url_scheme( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) );
+
+ if ( 'publish' == $post->post_status || $user->ID != $post->post_author ) {
+ // Latest content is in autosave
+ $nonce = wp_create_nonce( 'post_preview_' . $post->ID );
+ $preview_link = add_query_arg( array( 'preview_id' => $post->ID, 'preview_nonce' => $nonce ), $preview_link );
+ }
+ } else {
+ $preview_link = '';
+ }
+
+ /** This filter is documented in wp-admin/includes/meta-boxes.php */
+ $preview_link = apply_filters( 'preview_post_link', $preview_link, $post );
+
+ /**
+ * Filter whether to allow the post lock to be overridden.
+ *
+ * Returning a falsey value to the filter will disable the ability
+ * to override the post lock.
+ *
+ * @since 3.6.0
+ *
+ * @param bool $override Whether to allow overriding post locks. Default true.
+ * @param WP_Post $post Post object.
+ * @param WP_User $user User object.
+ */
+ $override = apply_filters( 'override_post_lock', true, $post, $user );
+ $tab_last = $override ? '' : ' wp-tab-last';
+
+ ?>
+ <div class="post-locked-message">
+ <div class="post-locked-avatar"><?php echo get_avatar( $user->ID, 64 ); ?></div>
+ <p class="currently-editing wp-tab-first" tabindex="0">
+ <?php
+ _e( 'This content is currently locked.' );
+ if ( $override )
+ printf( ' ' . __( 'If you take over, %s will be blocked from continuing to edit.' ), esc_html( $user->display_name ) );
+ ?>
+ </p>
+ <?php
+ /**
+ * Fires inside the post locked dialog before the buttons are displayed.
+ *
+ * @since 3.6.0
+ *
+ * @param WP_Post $post Post object.
+ */
+ do_action( 'post_locked_dialog', $post );
+ ?>
+ <p>
+ <a class="button" href="<?php echo esc_url( $sendback ); ?>"><?php echo $sendback_text; ?></a>
+ <?php if ( $preview_link ) { ?>
+ <a class="button<?php echo $tab_last; ?>" href="<?php echo esc_url( $preview_link ); ?>"><?php _e('Preview'); ?></a>
+ <?php
+ }
+
+ // Allow plugins to prevent some users overriding the post lock
+ if ( $override ) {
+ ?>
+ <a class="button button-primary wp-tab-last" href="<?php echo esc_url( add_query_arg( 'get-post-lock', '1', get_edit_post_link( $post->ID, 'url' ) ) ); ?>"><?php _e('Take over'); ?></a>
+ <?php
+ }
+
+ ?>
+ </p>
+ </div>
+ <?php
+ } else {
+ ?>
+ <div class="post-taken-over">
+ <div class="post-locked-avatar"></div>
+ <p class="wp-tab-first" tabindex="0">
+ <span class="currently-editing"></span><br />
+ <span class="locked-saving hidden"><img src="images/wpspin_light-2x.gif" width="16" height="16" /> <?php _e('Saving revision...'); ?></span>
+ <span class="locked-saved hidden"><?php _e('Your latest changes were saved as a revision.'); ?></span>
+ </p>
+ <?php
+ /**
+ * Fires inside the dialog displayed when a user has lost the post lock.
+ *
+ * @since 3.6.0
+ *
+ * @param WP_Post $post Post object.
+ */
+ do_action( 'post_lock_lost_dialog', $post );
+ ?>
+ <p><a class="button button-primary wp-tab-last" href="<?php echo esc_url( $sendback ); ?>"><?php echo $sendback_text; ?></a></p>
+ </div>
+ <?php
+ }
+
+ ?>
+ </div>
+ </div>
+ <?php
}
/**
* @uses _wp_translate_postdata()
* @uses _wp_post_revision_fields()
*
- * @return unknown
+ * @param mixed $post_data Associative array containing the post data or int post ID.
+ * @return mixed The autosave revision ID. WP_Error or 0 on error.
*/
-function wp_create_post_autosave( $post_id ) {
- $translated = _wp_translate_postdata( true );
- if ( is_wp_error( $translated ) )
- return $translated;
+function wp_create_post_autosave( $post_data ) {
+ if ( is_numeric( $post_data ) ) {
+ $post_id = $post_data;
+ $post_data = &$_POST;
+ } else {
+ $post_id = (int) $post_data['post_ID'];
+ }
+
+ $post_data = _wp_translate_postdata( true, $post_data );
+ if ( is_wp_error( $post_data ) )
+ return $post_data;
+
+ $post_author = get_current_user_id();
- // Only store one autosave. If there is already an autosave, overwrite it.
- if ( $old_autosave = wp_get_post_autosave( $post_id ) ) {
- $new_autosave = _wp_post_revision_fields( $_POST, true );
+ // Store one autosave per author. If there is already an autosave, overwrite it.
+ if ( $old_autosave = wp_get_post_autosave( $post_id, $post_author ) ) {
+ $new_autosave = _wp_post_revision_fields( $post_data, true );
$new_autosave['ID'] = $old_autosave->ID;
- $new_autosave['post_author'] = get_current_user_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 );
+ $autosave_is_different = false;
+ foreach ( array_intersect( array_keys( $new_autosave ), array_keys( _wp_post_revision_fields() ) ) as $field ) {
+ if ( normalize_whitespace( $new_autosave[ $field ] ) != normalize_whitespace( $post->$field ) ) {
+ $autosave_is_different = true;
+ break;
+ }
+ }
+
+ if ( ! $autosave_is_different ) {
+ wp_delete_post_revision( $old_autosave->ID );
+ return 0;
+ }
+
return wp_update_post( $new_autosave );
}
// _wp_put_post_revision() expects unescaped.
- $_POST = stripslashes_deep($_POST);
+ $post_data = wp_unslash( $post_data );
// Otherwise create the new autosave as a special post revision
- return _wp_put_post_revision( $_POST, true );
+ return _wp_put_post_revision( $post_data, true );
}
/**
function post_preview() {
$post_ID = (int) $_POST['post_ID'];
- $status = get_post_status( $post_ID );
- if ( 'auto-draft' == $status )
- wp_die( __('Preview not available. Please save as a draft first.') );
-
- if ( isset($_POST['catslist']) )
- $_POST['post_category'] = explode(",", $_POST['catslist']);
+ $_POST['ID'] = $post_ID;
- if ( isset($_POST['tags_input']) )
- $_POST['tags_input'] = explode(",", $_POST['tags_input']);
+ if ( ! $post = get_post( $post_ID ) ) {
+ wp_die( __( 'You are not allowed to edit this post.' ) );
+ }
- if ( $_POST['post_type'] == 'page' || empty($_POST['post_category']) )
- unset($_POST['post_category']);
+ if ( ! current_user_can( 'edit_post', $post->ID ) ) {
+ wp_die( __( 'You are not allowed to edit this post.' ) );
+ }
- $_POST['ID'] = $post_ID;
- $post = get_post($post_ID);
+ $is_autosave = false;
- if ( 'page' == $post->post_type ) {
- if ( !current_user_can('edit_page', $post_ID) )
- wp_die(__('You are not allowed to edit this page.'));
+ if ( ! wp_check_post_lock( $post->ID ) && get_current_user_id() == $post->post_author && ( 'draft' == $post->post_status || 'auto-draft' == $post->post_status ) ) {
+ $saved_post_id = edit_post();
} else {
- if ( !current_user_can('edit_post', $post_ID) )
- wp_die(__('You are not allowed to edit this post.'));
+ $is_autosave = true;
+
+ if ( 'auto-draft' == $_POST['post_status'] )
+ $_POST['post_status'] = 'draft';
+
+ $saved_post_id = wp_create_post_autosave( $post->ID );
}
- if ( 'draft' == $post->post_status ) {
- $id = edit_post();
- } else { // Non drafts are not overwritten. The autosave is stored in a special post revision.
- $id = wp_create_post_autosave( $post->ID );
- if ( ! is_wp_error($id) )
- $id = $post->ID;
+ if ( is_wp_error( $saved_post_id ) )
+ wp_die( $saved_post_id->get_error_message() );
+
+ $query_args = array( 'preview' => 'true' );
+
+ if ( $is_autosave && $saved_post_id ) {
+ $query_args['preview_id'] = $post->ID;
+ $query_args['preview_nonce'] = wp_create_nonce( 'post_preview_' . $post->ID );
+
+ if ( isset( $_POST['post_format'] ) )
+ $query_args['post_format'] = empty( $_POST['post_format'] ) ? 'standard' : sanitize_key( $_POST['post_format'] );
}
- if ( is_wp_error($id) )
- wp_die( $id->get_error_message() );
+ $url = add_query_arg( $query_args, get_permalink( $post->ID ) );
- if ( $_POST['post_status'] == 'draft' ) {
- $url = add_query_arg( 'preview', 'true', get_permalink($id) );
- } else {
- $nonce = wp_create_nonce('post_preview_' . $id);
- $url = add_query_arg( array( 'preview' => 'true', 'preview_id' => $id, 'preview_nonce' => $nonce ), get_permalink($id) );
+ /** This filter is documented in wp-admin/includes/meta-boxes.php */
+ return apply_filters( 'preview_post_link', $url, $post );
+}
+
+/**
+ * Save a post submitted with XHR
+ *
+ * Intended for use with heartbeat and autosave.js
+ *
+ * @since 3.9.0
+ *
+ * @param $post_data Associative array of the submitted post data.
+ * @return mixed The value 0 or WP_Error on failure. The saved post ID on success.
+ * Te ID can be the draft post_id or the autosave revision post_id.
+ */
+function wp_autosave( $post_data ) {
+ // Back-compat
+ if ( ! defined( 'DOING_AUTOSAVE' ) )
+ define( 'DOING_AUTOSAVE', true );
+
+ $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 ) ) {
+ return new WP_Error( 'invalid_nonce', __( 'Error while saving.' ) );
+ }
+
+ $post = get_post( $post_id );
+
+ if ( ! current_user_can( 'edit_post', $post->ID ) ) {
+ return new WP_Error( 'edit_posts', __( 'You are not allowed to edit this item.' ) );
}
- return $url;
+ if ( 'auto-draft' == $post->post_status )
+ $post_data['post_status'] = 'draft';
+
+ 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
+ return edit_post( wp_slash( $post_data ) );
+ } else {
+ // Non drafts or other users drafts are not overwritten. The autosave is stored in a special post revision for each user.
+ return wp_create_post_autosave( wp_slash( $post_data ) );
+ }
}