WordPress Version: 3.7
/**
* Save draft or manually autosave for showing preview.
*
* @package WordPress
* @since 2.7.0
*
* @uses get_post_status()
* @uses edit_post()
* @uses get_post()
* @uses current_user_can()
* @uses wp_die()
* @uses wp_create_post_autosave()
* @uses add_query_arg()
* @uses wp_create_nonce()
*
* @return str URL to redirect to show the preview
*/
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']);
}
if (isset($_POST['tags_input'])) {
$_POST['tags_input'] = explode(",", $_POST['tags_input']);
}
if ($_POST['post_type'] == 'page' || empty($_POST['post_category'])) {
unset($_POST['post_category']);
}
$_POST['ID'] = $post_ID;
$post = get_post($post_ID);
if ('page' == $post->post_type) {
if (!current_user_can('edit_page', $post_ID)) {
wp_die(__('You are not allowed to edit this page.'));
}
} else if (!current_user_can('edit_post', $post_ID)) {
wp_die(__('You are not allowed to edit this post.'));
}
$user_id = get_current_user_id();
$locked = wp_check_post_lock($post->ID);
if (!$locked && 'draft' == $post->post_status && $user_id == $post->post_author) {
$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($id)) {
wp_die($id->get_error_message());
}
if (!$locked && $_POST['post_status'] == 'draft' && $user_id == $post->post_author) {
$url = add_query_arg('preview', 'true', get_permalink($id));
} else {
$nonce = wp_create_nonce('post_preview_' . $id);
$args = array('preview' => 'true', 'preview_id' => $id, 'preview_nonce' => $nonce);
if (isset($_POST['post_format'])) {
$args['post_format'] = empty($_POST['post_format']) ? 'standard' : sanitize_key($_POST['post_format']);
}
$url = add_query_arg($args, get_permalink($id));
}
return apply_filters('preview_post_link', $url);
}