2007-05-25 09:16:21 +02:00
< ? php
2008-10-02 03:03:26 +02:00
/**
* WordPress Post Administration API .
*
* @ package WordPress
* @ subpackage Administration
*/
2007-05-25 09:16:21 +02:00
2008-05-08 19:25:07 +02:00
/**
2008-09-17 02:40:10 +02:00
* Rename $_POST data from form names to DB post columns .
2008-05-08 19:25:07 +02:00
*
* Manipulates $_POST directly .
*
* @ package WordPress
2008-10-02 03:03:26 +02:00
* @ since 2.6 . 0
2008-05-08 19:25:07 +02:00
*
* @ param bool $update Are we updating a pre - existing post ?
2010-09-07 13:21:11 +02:00
* @ param array $post_data Array of post data . Defaults to the contents of $_POST .
2008-05-08 19:25:07 +02:00
* @ return object | bool WP_Error on failure , true on success .
*/
2008-09-11 07:50:14 +02:00
function _wp_translate_postdata ( $update = false , $post_data = null ) {
2008-09-11 00:47:03 +02:00
if ( empty ( $post_data ) )
$post_data = & $_POST ;
2008-05-08 19:25:07 +02:00
if ( $update )
2008-09-11 00:47:03 +02:00
$post_data [ 'ID' ] = ( int ) $post_data [ 'post_ID' ];
2011-05-31 18:08:46 +02:00
2012-11-30 15:03:47 +01:00
$ptype = get_post_type_object ( $post_data [ 'post_type' ] );
if ( $update && ! current_user_can ( $ptype -> cap -> 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.' ) );
}
2011-05-31 18:08:46 +02:00
if ( isset ( $post_data [ 'content' ] ) )
$post_data [ 'post_content' ] = $post_data [ 'content' ];
if ( isset ( $post_data [ 'excerpt' ] ) )
$post_data [ 'post_excerpt' ] = $post_data [ 'excerpt' ];
if ( isset ( $post_data [ 'parent_id' ] ) )
$post_data [ 'post_parent' ] = ( int ) $post_data [ 'parent_id' ];
2008-09-11 00:47:03 +02:00
if ( isset ( $post_data [ 'trackback_url' ]) )
$post_data [ 'to_ping' ] = $post_data [ 'trackback_url' ];
2010-01-27 15:34:11 +01:00
if ( ! isset ( $post_data [ 'user_ID' ]) )
$post_data [ 'user_ID' ] = $GLOBALS [ 'user_ID' ];
2008-09-11 00:47:03 +02:00
if ( ! empty ( $post_data [ 'post_author_override' ] ) ) {
$post_data [ 'post_author' ] = ( int ) $post_data [ 'post_author_override' ];
2008-05-08 19:25:07 +02:00
} else {
2008-09-11 00:47:03 +02:00
if ( ! empty ( $post_data [ 'post_author' ] ) ) {
$post_data [ 'post_author' ] = ( int ) $post_data [ 'post_author' ];
2007-05-25 09:16:21 +02:00
} else {
2008-09-11 00:47:03 +02:00
$post_data [ 'post_author' ] = ( int ) $post_data [ 'user_ID' ];
2007-05-25 09:16:21 +02:00
}
2008-05-08 19:25:07 +02:00
}
2007-05-25 09:16:21 +02:00
2012-11-30 15:03:47 +01:00
if ( ! $update && isset ( $post_data [ 'user_ID' ] ) && ( $post_data [ 'post_author' ] != $post_data [ 'user_ID' ] )
&& ! current_user_can ( $ptype -> cap -> edit_others_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.' ) );
2007-05-25 09:16:21 +02:00
}
// What to do based on which button they pressed
2008-09-11 00:47:03 +02:00
if ( isset ( $post_data [ 'saveasdraft' ]) && '' != $post_data [ 'saveasdraft' ] )
$post_data [ 'post_status' ] = 'draft' ;
if ( isset ( $post_data [ 'saveasprivate' ]) && '' != $post_data [ 'saveasprivate' ] )
$post_data [ 'post_status' ] = 'private' ;
2010-01-27 15:34:11 +01:00
if ( isset ( $post_data [ 'publish' ]) && ( '' != $post_data [ 'publish' ] ) && ( ! isset ( $post_data [ 'post_status' ]) || $post_data [ 'post_status' ] != 'private' ) )
2008-09-11 00:47:03 +02:00
$post_data [ 'post_status' ] = 'publish' ;
if ( isset ( $post_data [ 'advanced' ]) && '' != $post_data [ 'advanced' ] )
$post_data [ 'post_status' ] = 'draft' ;
2008-09-14 14:58:00 +02:00
if ( isset ( $post_data [ 'pending' ]) && '' != $post_data [ 'pending' ] )
$post_data [ 'post_status' ] = 'pending' ;
2007-05-25 09:16:21 +02:00
2010-01-27 15:34:11 +01:00
if ( isset ( $post_data [ 'ID' ] ) )
$post_id = $post_data [ 'ID' ];
else
$post_id = false ;
$previous_status = $post_id ? get_post_field ( 'post_status' , $post_id ) : false ;
2008-06-02 23:01:42 +02:00
2008-08-09 07:36:14 +02:00
// Posts 'submitted for approval' present are submitted to $_POST the same as if they were being published.
2008-06-02 23:01:42 +02:00
// Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts.
2010-05-12 22:45:18 +02:00
if ( isset ( $post_data [ 'post_status' ]) && ( 'publish' == $post_data [ 'post_status' ] && ! current_user_can ( $ptype -> cap -> publish_posts )) )
2010-04-18 06:26:39 +02:00
if ( $previous_status != 'publish' || ! current_user_can ( 'edit_post' , $post_id ) )
2008-09-14 14:58:00 +02:00
$post_data [ 'post_status' ] = 'pending' ;
2007-05-25 09:16:21 +02:00
2008-09-14 14:58:00 +02:00
if ( ! isset ( $post_data [ 'post_status' ]) )
$post_data [ 'post_status' ] = $previous_status ;
2008-11-02 03:12:26 +01:00
2008-09-11 00:47:03 +02:00
if ( ! isset ( $post_data [ 'comment_status' ] ))
2011-11-24 17:06:17 +01:00
$post_data [ 'comment_status' ] = 'closed' ;
2007-05-25 09:16:21 +02:00
2008-09-11 00:47:03 +02:00
if ( ! isset ( $post_data [ 'ping_status' ] ))
2011-11-24 17:06:17 +01:00
$post_data [ 'ping_status' ] = 'closed' ;
2007-05-25 09:16:21 +02:00
2008-05-08 19:25:07 +02:00
foreach ( array ( 'aa' , 'mm' , 'jj' , 'hh' , 'mn' ) as $timeunit ) {
2008-09-11 00:47:03 +02:00
if ( ! empty ( $post_data [ 'hidden_' . $timeunit ] ) && $post_data [ 'hidden_' . $timeunit ] != $post_data [ $timeunit ] ) {
$post_data [ 'edit_date' ] = '1' ;
2008-03-17 00:05:16 +01:00
break ;
}
}
2008-09-11 00:47:03 +02:00
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' ];
2008-07-03 17:55:45 +02:00
$aa = ( $aa <= 0 ) ? date ( 'Y' ) : $aa ;
$mm = ( $mm <= 0 ) ? date ( 'n' ) : $mm ;
2007-05-25 09:16:21 +02:00
$jj = ( $jj > 31 ) ? 31 : $jj ;
2008-07-03 17:55:45 +02:00
$jj = ( $jj <= 0 ) ? date ( 'j' ) : $jj ;
2007-05-25 09:16:21 +02:00
$hh = ( $hh > 23 ) ? $hh - 24 : $hh ;
$mn = ( $mn > 59 ) ? $mn - 60 : $mn ;
$ss = ( $ss > 59 ) ? $ss - 60 : $ss ;
2012-09-20 12:46:50 +02:00
$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' ] );
2012-09-19 23:43:35 +02:00
if ( ! $valid_date ) {
2012-09-20 12:46:50 +02:00
return new WP_Error ( 'invalid_date' , __ ( 'Whoops, the provided date is invalid.' ) );
2012-09-19 23:43:35 +02:00
}
2008-09-11 00:47:03 +02:00
$post_data [ 'post_date_gmt' ] = get_gmt_from_date ( $post_data [ 'post_date' ] );
2007-05-25 09:16:21 +02:00
}
2008-09-11 07:50:14 +02:00
return $post_data ;
2008-05-08 19:25:07 +02:00
}
2008-10-02 03:03:26 +02:00
/**
* Update an existing post with values provided in $_POST .
*
2010-12-01 20:24:38 +01:00
* @ since 1.5 . 0
2008-10-02 03:03:26 +02:00
*
* @ param array $post_data Optional .
* @ return int Post ID .
*/
2008-09-11 00:47:03 +02:00
function edit_post ( $post_data = null ) {
2013-03-01 17:28:40 +01:00
if ( empty ( $post_data ) )
$post_data = & $_POST ;
2008-05-08 19:25:07 +02:00
2011-06-27 17:56:42 +02:00
// Clear out any data in internal vars.
2011-06-28 23:47:35 +02:00
unset ( $post_data [ 'filter' ] );
2011-06-27 17:56:42 +02:00
2008-09-11 00:47:03 +02:00
$post_ID = ( int ) $post_data [ 'post_ID' ];
2011-02-16 19:58:06 +01:00
$post = get_post ( $post_ID );
$post_data [ 'post_type' ] = $post -> post_type ;
2011-05-23 01:19:42 +02:00
$post_data [ 'post_mime_type' ] = $post -> post_mime_type ;
2008-05-08 19:25:07 +02:00
2010-03-17 13:35:48 +01:00
$ptype = get_post_type_object ( $post_data [ 'post_type' ]);
2010-05-12 22:45:18 +02:00
if ( ! current_user_can ( $ptype -> cap -> edit_post , $post_ID ) ) {
2010-03-17 13:35:48 +01:00
if ( 'page' == $post_data [ 'post_type' ] )
2008-05-08 19:25:07 +02:00
wp_die ( __ ( 'You are not allowed to edit this page.' ));
2010-03-17 13:35:48 +01:00
else
2008-05-08 19:25:07 +02:00
wp_die ( __ ( 'You are not allowed to edit this post.' ));
}
2008-09-11 07:50:14 +02:00
$post_data = _wp_translate_postdata ( true , $post_data );
if ( is_wp_error ( $post_data ) )
wp_die ( $post_data -> get_error_message () );
2012-11-10 19:25:04 +01:00
if ( ( empty ( $post_data [ 'action' ] ) || 'autosave' != $post_data [ 'action' ] ) && 'auto-draft' == $post_data [ 'post_status' ] ) {
2010-12-07 08:12:55 +01:00
$post_data [ 'post_status' ] = 'draft' ;
2012-11-10 19:25:04 +01:00
}
2008-05-08 19:25:07 +02:00
2008-11-15 00:01:16 +01:00
if ( isset ( $post_data [ 'visibility' ]) ) {
switch ( $post_data [ 'visibility' ] ) {
case 'public' :
2008-12-07 10:04:11 +01:00
$post_data [ 'post_password' ] = '' ;
2008-11-15 00:01:16 +01:00
break ;
case 'password' :
unset ( $post_data [ 'sticky' ] );
break ;
case 'private' :
$post_data [ 'post_status' ] = 'private' ;
$post_data [ 'post_password' ] = '' ;
unset ( $post_data [ 'sticky' ] );
break ;
}
2008-11-12 19:36:48 +01:00
}
2010-11-04 08:41:07 +01:00
// Post Formats
2011-09-19 18:31:33 +02:00
if ( isset ( $post_data [ 'post_format' ] ) ) {
2013-02-18 20:11:24 +01:00
set_post_format ( $post_ID , $post_data [ 'post_format' ] );
}
if ( isset ( $post_data [ '_wp_format_url' ] ) ) {
2013-03-01 18:58:43 +01:00
update_post_meta ( $post_ID , '_wp_format_url' , wp_slash ( esc_url_raw ( wp_unslash ( $post_data [ '_wp_format_url' ] ) ) ) );
2013-02-18 20:11:24 +01:00
}
2013-03-29 12:07:09 +01:00
$format_keys = array ( 'quote' , 'quote_source' , 'image' , 'gallery' , 'audio' , 'video' );
2013-02-18 20:11:24 +01:00
foreach ( $format_keys as $key ) {
if ( isset ( $post_data [ '_wp_format_' . $key ] ) )
update_post_meta ( $post_ID , '_wp_format_' . $key , wp_filter_post_kses ( $post_data [ '_wp_format_' . $key ] ) );
2010-11-04 08:41:07 +01:00
}
2007-05-25 09:16:21 +02:00
// Meta Stuff
2008-09-11 00:47:03 +02:00
if ( isset ( $post_data [ 'meta' ]) && $post_data [ 'meta' ] ) {
2010-12-20 13:38:21 +01:00
foreach ( $post_data [ 'meta' ] as $key => $value ) {
if ( ! $meta = get_post_meta_by_id ( $key ) )
continue ;
if ( $meta -> post_id != $post_ID )
continue ;
2011-07-21 00:04:35 +02:00
if ( is_protected_meta ( $value [ 'key' ], 'post' ) || ! current_user_can ( 'edit_post_meta' , $post_ID , $value [ 'key' ] ) )
2011-05-23 01:19:42 +02:00
continue ;
2007-05-25 09:16:21 +02:00
update_meta ( $key , $value [ 'key' ], $value [ 'value' ] );
2010-12-20 13:38:21 +01:00
}
2007-05-25 09:16:21 +02:00
}
2008-09-11 00:47:03 +02:00
if ( isset ( $post_data [ 'deletemeta' ]) && $post_data [ 'deletemeta' ] ) {
2010-12-20 13:38:21 +01:00
foreach ( $post_data [ 'deletemeta' ] as $key => $value ) {
if ( ! $meta = get_post_meta_by_id ( $key ) )
continue ;
if ( $meta -> post_id != $post_ID )
continue ;
2011-07-21 00:04:35 +02:00
if ( is_protected_meta ( $meta -> meta_key , 'post' ) || ! current_user_can ( 'delete_post_meta' , $post_ID , $meta -> meta_key ) )
2011-05-23 01:19:42 +02:00
continue ;
2007-05-25 09:16:21 +02:00
delete_meta ( $key );
2010-12-20 13:38:21 +01:00
}
2007-05-25 09:16:21 +02:00
}
2012-09-22 00:52:54 +02:00
// Attachment stuff
2012-12-06 04:50:31 +01:00
if ( 'attachment' == $post_data [ 'post_type' ] ) {
if ( isset ( $post_data [ '_wp_attachment_image_alt' ] ) ) {
2013-03-01 18:58:43 +01:00
$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 );
2013-03-01 17:28:40 +01:00
// update_meta expects slashed
2013-03-01 18:58:43 +01:00
update_post_meta ( $post_ID , '_wp_attachment_image_alt' , wp_slash ( $image_alt ) );
2012-12-06 04:50:31 +01:00
}
2012-09-22 00:52:54 +02:00
}
2012-11-21 19:53:00 +01:00
2012-12-06 06:34:17 +01:00
$attachment_data = isset ( $post_data [ 'attachments' ][ $post_ID ] ) ? $post_data [ 'attachments' ][ $post_ID ] : array ();
$post_data = apply_filters ( 'attachment_fields_to_save' , $post_data , $attachment_data );
2012-09-22 00:52:54 +02:00
}
2007-05-25 09:16:21 +02:00
add_meta ( $post_ID );
2013-03-01 17:28:40 +01:00
update_post_meta ( $post_ID , '_edit_last' , $GLOBALS [ 'current_user' ] -> ID );
2010-04-24 06:24:38 +02:00
2008-09-11 00:47:03 +02:00
wp_update_post ( $post_data );
2007-05-25 09:16:21 +02:00
// Now that we have an ID we can fix any attachment anchor hrefs
_fix_attachment_links ( $post_ID );
2011-09-27 08:11:30 +02:00
wp_set_post_lock ( $post_ID );
2008-03-04 01:05:30 +01:00
2010-10-27 10:48:55 +02:00
if ( current_user_can ( $ptype -> cap -> edit_others_posts ) ) {
if ( ! empty ( $post_data [ 'sticky' ] ) )
stick_post ( $post_ID );
2008-08-06 23:31:40 +02:00
else
2010-10-27 10:48:55 +02:00
unstick_post ( $post_ID );
2008-08-06 23:31:40 +02:00
}
2008-08-05 07:48:21 +02:00
2007-05-25 09:16:21 +02:00
return $post_ID ;
}
2008-10-02 03:03:26 +02:00
/**
2009-12-22 13:25:15 +01:00
* Process the post data for the bulk editing of posts .
2008-10-02 03:03:26 +02:00
*
* Updates all bulk edited posts / pages , adding ( but not removing ) tags and
* categories . Skips pages when they would be their own parent or child .
*
2009-12-22 13:25:15 +01:00
* @ since 2.7 . 0
2008-10-02 03:03:26 +02:00
*
2009-12-22 13:25:15 +01:00
* @ param array $post_data Optional , the array of post data to process if not provided will use $_POST superglobal .
2008-10-02 03:03:26 +02:00
* @ return array
*/
2008-09-25 15:42:34 +02:00
function bulk_edit_posts ( $post_data = null ) {
2008-09-30 12:30:56 +02:00
global $wpdb ;
2008-09-25 15:42:34 +02:00
if ( empty ( $post_data ) )
$post_data = & $_POST ;
2010-03-17 13:35:48 +01:00
if ( isset ( $post_data [ 'post_type' ]) )
$ptype = get_post_type_object ( $post_data [ 'post_type' ]);
else
$ptype = get_post_type_object ( 'post' );
2010-05-12 22:45:18 +02:00
if ( ! current_user_can ( $ptype -> cap -> edit_posts ) ) {
2010-03-17 13:35:48 +01:00
if ( 'page' == $ptype -> name )
wp_die ( __ ( 'You are not allowed to edit pages.' ));
else
wp_die ( __ ( 'You are not allowed to edit posts.' ));
2008-09-25 15:42:34 +02:00
}
2009-08-12 12:57:15 +02:00
if ( - 1 == $post_data [ '_status' ] ) {
$post_data [ 'post_status' ] = null ;
unset ( $post_data [ 'post_status' ]);
} else {
$post_data [ 'post_status' ] = $post_data [ '_status' ];
}
unset ( $post_data [ '_status' ]);
2008-12-26 23:35:08 +01:00
$post_IDs = array_map ( 'intval' , ( array ) $post_data [ 'post' ] );
2008-09-25 15:42:34 +02:00
2010-03-01 16:48:01 +01:00
$reset = array ( 'post_author' , 'post_status' , 'post_password' , 'post_parent' , 'page_template' , 'comment_status' , 'ping_status' , 'keep_private' , 'tax_input' , 'post_category' , 'sticky' );
2008-09-30 12:30:56 +02:00
foreach ( $reset as $field ) {
if ( isset ( $post_data [ $field ]) && ( '' == $post_data [ $field ] || - 1 == $post_data [ $field ] ) )
unset ( $post_data [ $field ]);
}
2008-09-25 15:42:34 +02:00
if ( isset ( $post_data [ 'post_category' ]) ) {
if ( is_array ( $post_data [ 'post_category' ]) && ! empty ( $post_data [ 'post_category' ]) )
2009-08-24 21:39:08 +02:00
$new_cats = array_map ( 'absint' , $post_data [ 'post_category' ] );
2008-09-25 15:42:34 +02:00
else
unset ( $post_data [ 'post_category' ]);
}
2010-03-17 17:27:25 +01:00
2010-03-01 16:48:01 +01:00
$tax_input = array ();
if ( isset ( $post_data [ 'tax_input' ])) {
foreach ( $post_data [ 'tax_input' ] as $tax_name => $terms ) {
if ( empty ( $terms ) )
continue ;
2011-09-19 19:02:58 +02:00
if ( is_taxonomy_hierarchical ( $tax_name ) ) {
2012-02-07 19:06:12 +01:00
$tax_input [ $tax_name ] = array_map ( 'absint' , $terms );
2011-09-19 19:02:58 +02:00
} else {
2012-02-07 19:06:12 +01:00
$comma = _x ( ',' , 'tag delimiter' );
if ( ',' !== $comma )
$terms = str_replace ( $comma , ',' , $terms );
$tax_input [ $tax_name ] = explode ( ',' , trim ( $terms , " \n \t \r \0 \x0B , " ) );
2010-03-01 16:48:01 +01:00
}
}
2008-09-25 15:42:34 +02:00
}
2008-09-30 12:30:56 +02:00
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 ++ ) {
$children [] = $parent ;
foreach ( $pages as $page ) {
if ( $page -> ID == $parent ) {
$parent = $page -> post_parent ;
break ;
}
}
}
2008-09-25 15:42:34 +02:00
}
2008-09-30 12:30:56 +02:00
$updated = $skipped = $locked = array ();
2008-09-25 15:42:34 +02:00
foreach ( $post_IDs as $post_ID ) {
2010-05-28 17:49:13 +02:00
$post_type_object = get_post_type_object ( get_post_type ( $post_ID ) );
2008-09-25 15:42:34 +02:00
2010-05-28 17:49:13 +02:00
if ( ! isset ( $post_type_object ) || ( isset ( $children ) && in_array ( $post_ID , $children ) ) || ! current_user_can ( $post_type_object -> cap -> edit_post , $post_ID ) ) {
2008-09-25 15:42:34 +02:00
$skipped [] = $post_ID ;
continue ;
}
2008-11-02 03:12:26 +01:00
2008-09-30 12:30:56 +02:00
if ( wp_check_post_lock ( $post_ID ) ) {
$locked [] = $post_ID ;
continue ;
}
2010-03-17 17:27:25 +01:00
2011-06-28 23:47:35 +02:00
$post = get_post ( $post_ID );
$tax_names = get_object_taxonomies ( $post );
2010-03-01 16:48:01 +01:00
foreach ( $tax_names as $tax_name ) {
2010-05-12 21:12:18 +02:00
$taxonomy_obj = get_taxonomy ( $tax_name );
2011-12-14 18:36:38 +01:00
if ( isset ( $tax_input [ $tax_name ]) && current_user_can ( $taxonomy_obj -> cap -> assign_terms ) )
2010-05-12 21:12:18 +02:00
$new_terms = $tax_input [ $tax_name ];
2010-05-26 04:42:15 +02:00
else
2010-05-12 21:12:18 +02:00
$new_terms = array ();
2010-05-26 04:42:15 +02:00
2010-05-12 21:12:18 +02:00
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 );
2008-09-25 15:42:34 +02:00
}
2010-05-26 04:42:15 +02:00
2010-05-18 17:03:54 +02:00
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' ] );
}
2008-09-25 15:42:34 +02:00
2011-06-28 23:47:35 +02:00
$post_data [ 'post_mime_type' ] = $post -> post_mime_type ;
$post_data [ 'guid' ] = $post -> guid ;
2008-09-25 15:42:34 +02:00
$post_data [ 'ID' ] = $post_ID ;
$updated [] = wp_update_post ( $post_data );
2008-11-11 03:58:24 +01:00
2010-10-27 10:48:55 +02:00
if ( isset ( $post_data [ 'sticky' ] ) && current_user_can ( $ptype -> cap -> edit_others_posts ) ) {
2008-11-11 03:58:24 +01:00
if ( 'sticky' == $post_data [ 'sticky' ] )
stick_post ( $post_ID );
else
unstick_post ( $post_ID );
}
2008-09-25 15:42:34 +02:00
}
2008-09-30 12:30:56 +02:00
return array ( 'updated' => $updated , 'skipped' => $skipped , 'locked' => $locked );
2008-09-25 15:42:34 +02:00
}
2010-11-22 18:17:26 +01:00
/**
* Default post information to use when populating the " Write Post " form .
*
2010-12-20 10:25:21 +01:00
* @ since 2.0 . 0
2010-11-22 18:17:26 +01:00
*
* @ param string $post_type A post type string , defaults to 'post' .
2012-08-23 22:34:41 +02:00
* @ return WP_Post Post object containing all the default post data as attributes
2010-11-22 18:17:26 +01:00
*/
function get_default_post_to_edit ( $post_type = 'post' , $create_in_db = false ) {
global $wpdb ;
2007-05-25 09:16:21 +02:00
2010-11-22 18:17:26 +01:00
$post_title = '' ;
if ( ! empty ( $_REQUEST [ 'post_title' ] ) )
2013-03-01 18:00:25 +01:00
$post_title = esc_html ( wp_unslash ( $_REQUEST [ 'post_title' ] ));
2010-11-22 18:17:26 +01:00
$post_content = '' ;
if ( ! empty ( $_REQUEST [ 'content' ] ) )
2013-03-01 18:00:25 +01:00
$post_content = esc_html ( wp_unslash ( $_REQUEST [ 'content' ] ));
2010-11-22 18:17:26 +01:00
$post_excerpt = '' ;
if ( ! empty ( $_REQUEST [ 'excerpt' ] ) )
2013-03-01 18:00:25 +01:00
$post_excerpt = esc_html ( wp_unslash ( $_REQUEST [ 'excerpt' ] ));
2010-11-22 18:17:26 +01:00
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 );
2010-12-19 20:22:31 +01:00
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' ) );
2010-11-22 18:17:26 +01:00
} else {
2011-09-30 23:35:05 +02:00
$post = new stdClass ;
2010-11-22 18:17:26 +01:00
$post -> ID = 0 ;
$post -> post_author = '' ;
$post -> post_date = '' ;
$post -> post_date_gmt = '' ;
$post -> post_password = '' ;
$post -> post_type = $post_type ;
$post -> post_status = 'draft' ;
$post -> to_ping = '' ;
$post -> pinged = '' ;
$post -> comment_status = get_option ( 'default_comment_status' );
$post -> ping_status = get_option ( 'default_ping_status' );
$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 ;
2012-08-23 22:01:10 +02:00
$post = new WP_Post ( $post );
2010-11-22 18:17:26 +01:00
}
$post -> post_content = apply_filters ( 'default_content' , $post_content , $post );
$post -> post_title = apply_filters ( 'default_title' , $post_title , $post );
$post -> post_excerpt = apply_filters ( 'default_excerpt' , $post_excerpt , $post );
$post -> post_name = '' ;
return $post ;
}
2007-05-25 09:16:21 +02:00
2008-10-02 03:03:26 +02:00
/**
2009-03-05 23:16:29 +01:00
* Determine if a post exists based on title , content , and date
2008-10-02 03:03:26 +02:00
*
2010-12-01 20:24:38 +01:00
* @ since 2.0 . 0
2008-10-02 03:03:26 +02:00
*
2009-03-05 23:16:29 +01:00
* @ param string $title Post title
* @ param string $content Optional post content
* @ param string $date Optional post date
* @ return int Post ID if post exists , 0 otherwise .
2008-10-02 03:03:26 +02:00
*/
2009-03-05 23:16:29 +01:00
function post_exists ( $title , $content = '' , $date = '' ) {
2007-05-25 09:16:21 +02:00
global $wpdb ;
2013-03-01 18:00:25 +01:00
$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' ) );
2008-10-09 02:19:11 +02:00
2009-03-05 23:16:29 +01:00
$query = " SELECT ID FROM $wpdb->posts WHERE 1=1 " ;
$args = array ();
2007-05-25 09:16:21 +02:00
2009-03-05 23:16:29 +01:00
if ( ! empty ( $date ) ) {
$query .= ' AND post_date = %s' ;
$args [] = $post_date ;
}
if ( ! empty ( $title ) ) {
$query .= ' AND post_title = %s' ;
$args [] = $post_title ;
}
if ( ! empty ( $content ) ) {
$query .= 'AND post_content = %s' ;
$args [] = $post_content ;
}
2009-03-18 03:43:45 +01:00
2009-03-05 23:16:29 +01:00
if ( ! empty ( $args ) )
2012-11-07 00:27:21 +01:00
return ( int ) $wpdb -> get_var ( $wpdb -> prepare ( $query , $args ) );
2007-05-25 09:16:21 +02:00
return 0 ;
}
2008-10-02 03:03:26 +02:00
/**
* Creates a new post from the " Write Post " form using $_POST information .
*
2010-12-01 20:24:38 +01:00
* @ since 2.1 . 0
2008-10-02 03:03:26 +02:00
*
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function wp_write_post () {
global $user_ID ;
2010-03-17 13:35:48 +01:00
if ( isset ( $_POST [ 'post_type' ]) )
$ptype = get_post_type_object ( $_POST [ 'post_type' ]);
else
$ptype = get_post_type_object ( 'post' );
2010-05-12 22:45:18 +02:00
if ( ! current_user_can ( $ptype -> cap -> edit_posts ) ) {
2010-03-17 13:35:48 +01:00
if ( 'page' == $ptype -> name )
2010-04-30 05:17:49 +02:00
return new WP_Error ( 'edit_pages' , __ ( 'You are not allowed to create pages on this site.' ) );
2010-03-17 13:35:48 +01:00
else
2010-04-30 05:17:49 +02:00
return new WP_Error ( 'edit_posts' , __ ( 'You are not allowed to create posts or drafts on this site.' ) );
2007-05-25 09:16:21 +02:00
}
2011-05-23 01:19:42 +02:00
$_POST [ 'post_mime_type' ] = '' ;
2011-06-28 23:47:35 +02:00
// Clear out any data in internal vars.
unset ( $_POST [ 'filter' ] );
2011-06-27 17:56:42 +02:00
// Edit don't write if we have a post id.
2011-09-29 23:47:52 +02:00
if ( isset ( $_POST [ 'post_ID' ] ) )
2011-06-27 17:56:42 +02:00
return edit_post ();
2008-05-08 19:25:07 +02:00
$translated = _wp_translate_postdata ( false );
if ( is_wp_error ( $translated ) )
return $translated ;
2007-05-25 09:16:21 +02:00
2008-11-15 00:01:16 +01:00
if ( isset ( $_POST [ 'visibility' ]) ) {
switch ( $_POST [ 'visibility' ] ) {
case 'public' :
$_POST [ 'post_password' ] = '' ;
break ;
case 'password' :
unset ( $_POST [ 'sticky' ] );
break ;
case 'private' :
$_POST [ 'post_status' ] = 'private' ;
$_POST [ 'post_password' ] = '' ;
unset ( $_POST [ 'sticky' ] );
break ;
}
2008-11-12 19:36:48 +01:00
}
2007-05-25 09:16:21 +02:00
// Create the post.
2013-03-01 17:28:40 +01:00
$post_ID = wp_insert_post ( $_POST );
2007-09-18 18:32:22 +02:00
if ( is_wp_error ( $post_ID ) )
return $post_ID ;
2007-05-25 09:16:21 +02:00
2007-08-29 19:24:42 +02:00
if ( empty ( $post_ID ) )
return 0 ;
2007-05-25 09:16:21 +02:00
add_meta ( $post_ID );
2013-03-01 17:28:40 +01:00
add_post_meta ( $post_ID , '_edit_last' , $GLOBALS [ 'current_user' ] -> ID );
2010-04-24 06:24:38 +02:00
2007-05-25 09:16:21 +02:00
// Now that we have an ID we can fix any attachment anchor hrefs
_fix_attachment_links ( $post_ID );
2011-09-27 08:11:30 +02:00
wp_set_post_lock ( $post_ID );
2008-03-04 01:05:30 +01:00
2007-05-25 09:16:21 +02:00
return $post_ID ;
}
2008-10-02 03:03:26 +02:00
/**
2008-10-10 20:21:16 +02:00
* Calls wp_write_post () and handles the errors .
2008-10-02 03:03:26 +02:00
*
2010-12-01 20:24:38 +01:00
* @ since 2.0 . 0
2011-10-24 21:13:23 +02:00
2011-09-29 23:47:52 +02:00
* @ uses wp_write_post ()
* @ uses is_wp_error ()
* @ uses wp_die ()
2008-10-02 03:03:26 +02:00
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function write_post () {
$result = wp_write_post ();
2010-01-18 21:34:48 +01:00
if ( is_wp_error ( $result ) )
2007-05-25 09:16:21 +02:00
wp_die ( $result -> get_error_message () );
else
return $result ;
}
//
// Post Meta
//
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
2010-12-01 20:24:38 +01:00
* @ since 1.2 . 0
2008-10-02 03:03:26 +02:00
*
* @ param unknown_type $post_ID
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function add_meta ( $post_ID ) {
global $wpdb ;
$post_ID = ( int ) $post_ID ;
2013-03-01 18:00:25 +01:00
$metakeyselect = isset ( $_POST [ 'metakeyselect' ]) ? wp_unslash ( trim ( $_POST [ 'metakeyselect' ] ) ) : '' ;
$metakeyinput = isset ( $_POST [ 'metakeyinput' ]) ? wp_unslash ( trim ( $_POST [ 'metakeyinput' ] ) ) : '' ;
2013-03-01 17:28:40 +01:00
$metavalue = isset ( $_POST [ 'metavalue' ]) ? $_POST [ 'metavalue' ] : '' ;
2011-07-21 21:32:12 +02:00
if ( is_string ( $metavalue ) )
2009-12-08 01:48:39 +01:00
$metavalue = trim ( $metavalue );
2007-05-25 09:16:21 +02:00
2011-07-21 21:32:12 +02:00
if ( ( '0' === $metavalue || ! empty ( $metavalue ) ) && ( ( ( '#NONE#' != $metakeyselect ) && ! empty ( $metakeyselect ) ) || ! empty ( $metakeyinput ) ) ) {
2007-09-04 01:32:58 +02:00
// We have a key/value pair. If both the select and the
2007-05-25 09:16:21 +02:00
// input for the key have data, the input takes precedence:
2011-07-21 21:32:12 +02:00
if ( '#NONE#' != $metakeyselect )
2007-05-25 09:16:21 +02:00
$metakey = $metakeyselect ;
2011-07-21 21:32:12 +02:00
if ( $metakeyinput )
2007-05-25 09:16:21 +02:00
$metakey = $metakeyinput ; // default
2011-07-21 00:04:35 +02:00
if ( is_protected_meta ( $metakey , 'post' ) || ! current_user_can ( 'add_post_meta' , $post_ID , $metakey ) )
2007-06-18 18:28:11 +02:00
return false ;
2013-03-01 17:28:40 +01:00
$metakey = esc_sql ( $metakey );
return add_post_meta ( $post_ID , $metakey , $metavalue );
2007-05-25 09:16:21 +02:00
}
2011-07-21 00:04:35 +02:00
2007-05-25 09:16:21 +02:00
return false ;
} // add_meta
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
2010-12-01 20:24:38 +01:00
* @ since 1.2 . 0
2008-10-02 03:03:26 +02:00
*
* @ param unknown_type $mid
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function delete_meta ( $mid ) {
2011-08-03 18:48:37 +02:00
return delete_metadata_by_mid ( 'post' , $mid );
2007-05-25 09:16:21 +02:00
}
2008-10-02 03:03:26 +02:00
/**
* Get a list of previously defined keys .
*
2010-12-01 20:24:38 +01:00
* @ since 1.2 . 0
2008-10-02 03:03:26 +02:00
*
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function get_meta_keys () {
global $wpdb ;
$keys = $wpdb -> get_col ( "
SELECT meta_key
FROM $wpdb -> postmeta
GROUP BY meta_key
ORDER BY meta_key " );
return $keys ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
2010-12-01 20:24:38 +01:00
* @ since 2.1 . 0
2008-10-02 03:03:26 +02:00
*
* @ param unknown_type $mid
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function get_post_meta_by_id ( $mid ) {
2011-08-03 18:48:37 +02:00
return get_metadata_by_mid ( 'post' , $mid );
2007-05-25 09:16:21 +02:00
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* Some postmeta stuff .
*
2010-12-01 20:24:38 +01:00
* @ since 1.2 . 0
2008-10-02 03:03:26 +02:00
*
* @ param unknown_type $postid
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function has_meta ( $postid ) {
global $wpdb ;
2008-04-14 18:13:25 +02:00
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 );
2007-05-25 09:16:21 +02:00
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
2010-12-01 20:24:38 +01:00
* @ since 1.2 . 0
2008-10-02 03:03:26 +02:00
*
* @ param unknown_type $meta_id
2013-03-01 17:28:40 +01:00
* @ param unknown_type $meta_key Expect Slashed
* @ param unknown_type $meta_value Expect Slashed
2008-10-02 03:03:26 +02:00
* @ return unknown
*/
2008-05-22 02:01:00 +02:00
function update_meta ( $meta_id , $meta_key , $meta_value ) {
2013-03-01 18:00:25 +01:00
$meta_key = wp_unslash ( $meta_key );
$meta_value = wp_unslash ( $meta_value );
2013-03-01 17:28:40 +01:00
2011-08-03 18:48:37 +02:00
return update_metadata_by_mid ( 'post' , $meta_id , $meta_value , $meta_key );
2007-05-25 09:16:21 +02:00
}
//
// Private
//
2008-10-02 03:03:26 +02:00
/**
* Replace hrefs of attachment anchors with up - to - date permalinks .
*
2010-12-01 20:24:38 +01:00
* @ since 2.3 . 0
2008-10-02 03:03:26 +02:00
* @ access private
*
* @ param unknown_type $post_ID
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function _fix_attachment_links ( $post_ID ) {
2012-08-23 22:01:10 +02:00
$post = get_post ( $post_ID , ARRAY_A );
2012-03-28 18:02:12 +02:00
$content = $post [ 'post_content' ];
2012-05-03 18:41:59 +02:00
2012-03-28 18:02:12 +02:00
// quick sanity check, don't run if no pretty permalinks or post is not published
if ( ! get_option ( 'permalink_structure' ) || $post [ 'post_status' ] != 'publish' )
return ;
2007-05-25 09:16:21 +02:00
2012-03-28 18:02:12 +02:00
// Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero)
if ( ! strpos ( $content , '?attachment_id=' ) || ! preg_match_all ( '/<a ([^>]+)>[\s\S]+?<\/a>/' , $content , $link_matches ) )
2007-05-25 09:16:21 +02:00
return ;
2012-03-28 18:02:12 +02:00
$site_url = get_bloginfo ( 'url' );
$site_url = substr ( $site_url , ( int ) strpos ( $site_url , '://' ) ); // remove the http(s)
$replace = '' ;
2007-05-25 09:16:21 +02:00
2012-03-28 18:02:12 +02:00
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 ) )
continue ;
2007-05-25 09:16:21 +02:00
2012-03-28 18:02:12 +02:00
$quote = $url_match [ 1 ]; // the quote (single or double)
$url_id = ( int ) $url_match [ 2 ];
$rel_id = ( int ) $rel_match [ 1 ];
2007-05-25 09:16:21 +02:00
2012-03-28 18:02:12 +02:00
if ( ! $url_id || ! $rel_id || $url_id != $rel_id || strpos ( $url_match [ 0 ], $site_url ) === false )
continue ;
2007-05-25 09:16:21 +02:00
2012-03-28 18:02:12 +02:00
$link = $link_matches [ 0 ][ $key ];
$replace = str_replace ( $url_match [ 0 ], 'href=' . $quote . get_attachment_link ( $url_id ) . $quote , $link );
2007-05-25 09:16:21 +02:00
2012-03-28 18:02:12 +02:00
$content = str_replace ( $link , $replace , $content );
}
2007-05-25 09:16:21 +02:00
2012-03-28 18:02:12 +02:00
if ( $replace ) {
$post [ 'post_content' ] = $content ;
2013-03-01 17:28:40 +01:00
// Escape data pulled from DB.
$post = add_magic_quotes ( $post );
2007-05-25 09:16:21 +02:00
2012-03-28 18:02:12 +02:00
return wp_update_post ( $post );
}
2009-11-17 20:25:01 +01:00
}
2008-10-02 03:03:26 +02:00
/**
* Move child posts to a new parent .
*
2010-12-01 20:24:38 +01:00
* @ since 2.3 . 0
2008-10-02 03:03:26 +02:00
* @ access private
*
* @ param unknown_type $old_ID
* @ param unknown_type $new_ID
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function _relocate_children ( $old_ID , $new_ID ) {
global $wpdb ;
$old_ID = ( int ) $old_ID ;
$new_ID = ( int ) $new_ID ;
2009-11-30 22:41:52 +01:00
$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' );
}
2007-05-25 09:16:21 +02:00
}
2008-10-02 03:03:26 +02:00
/**
2009-12-22 13:25:15 +01:00
* Get all the possible statuses for a post_type
2008-10-02 03:03:26 +02:00
*
2009-12-22 13:25:15 +01:00
* @ since 2.5 . 0
2008-10-02 03:03:26 +02:00
*
2009-12-22 13:25:15 +01:00
* @ param string $type The post_type you want the statuses for
* @ return array As array of all the statuses for the supplied post type
2008-10-02 03:03:26 +02:00
*/
2008-02-12 06:51:53 +01:00
function get_available_post_statuses ( $type = 'post' ) {
2008-04-09 22:09:45 +02:00
$stati = wp_count_posts ( $type );
2008-02-12 06:51:53 +01:00
2008-04-09 22:09:45 +02:00
return array_keys ( get_object_vars ( $stati ));
2008-02-12 06:51:53 +01:00
}
2008-10-02 03:03:26 +02:00
/**
2009-12-22 13:25:15 +01:00
* Run the wp query to fetch the posts for listing on the edit posts page
2008-10-02 03:03:26 +02:00
*
2009-12-22 13:25:15 +01:00
* @ since 2.5 . 0
2008-10-02 03:03:26 +02:00
*
2009-12-22 13:25:15 +01:00
* @ param array | bool $q Array of query variables to use to build the query or false to use $_GET superglobal .
* @ return array
2008-10-02 03:03:26 +02:00
*/
2007-10-24 01:02:24 +02:00
function wp_edit_posts_query ( $q = false ) {
if ( false === $q )
$q = $_GET ;
2009-12-22 13:25:15 +01:00
$q [ 'm' ] = isset ( $q [ 'm' ]) ? ( int ) $q [ 'm' ] : 0 ;
2008-08-14 19:00:37 +02:00
$q [ 'cat' ] = isset ( $q [ 'cat' ]) ? ( int ) $q [ 'cat' ] : 0 ;
2010-01-13 19:49:56 +01:00
$post_stati = get_post_stati ();
2008-02-19 07:13:20 +01:00
2010-01-15 17:58:36 +01:00
if ( isset ( $q [ 'post_type' ]) && in_array ( $q [ 'post_type' ], get_post_types () ) )
2010-01-12 16:23:10 +01:00
$post_type = $q [ 'post_type' ];
else
$post_type = 'post' ;
$avail_post_stati = get_available_post_statuses ( $post_type );
2007-10-10 00:49:42 +02:00
2010-01-13 19:49:56 +01:00
if ( isset ( $q [ 'post_status' ]) && in_array ( $q [ 'post_status' ], $post_stati ) ) {
2010-01-12 16:23:10 +01:00
$post_status = $q [ 'post_status' ];
$perm = 'readable' ;
2008-02-29 22:49:49 +01:00
}
2007-10-10 00:49:42 +02:00
2010-08-11 23:54:51 +02:00
if ( isset ( $q [ 'orderby' ]) )
$orderby = $q [ 'orderby' ];
elseif ( isset ( $q [ 'post_status' ]) && in_array ( $q [ 'post_status' ], array ( 'pending' , 'draft' )) )
2007-10-10 00:49:42 +02:00
$orderby = 'modified' ;
2010-08-11 23:54:51 +02:00
if ( isset ( $q [ 'order' ]) )
$order = $q [ 'order' ];
elseif ( isset ( $q [ 'post_status' ]) && 'pending' == $q [ 'post_status' ] )
$order = 'ASC' ;
2007-10-10 00:49:42 +02:00
2010-01-15 17:58:36 +01:00
$per_page = 'edit_' . $post_type . '_per_page' ;
$posts_per_page = ( int ) get_user_option ( $per_page );
2009-12-12 00:14:43 +01:00
if ( empty ( $posts_per_page ) || $posts_per_page < 1 )
2010-07-19 18:28:26 +02:00
$posts_per_page = 20 ;
2010-01-15 17:58:36 +01:00
2010-07-21 19:27:04 +02:00
$posts_per_page = apply_filters ( $per_page , $posts_per_page );
$posts_per_page = apply_filters ( 'edit_posts_per_page' , $posts_per_page , $post_type );
2010-01-15 17:58:36 +01:00
$query = compact ( 'post_type' , 'post_status' , 'perm' , 'order' , 'orderby' , 'posts_per_page' );
// Hierarchical types require special args.
2010-08-11 23:54:51 +02:00
if ( is_post_type_hierarchical ( $post_type ) && ! isset ( $orderby ) ) {
2010-01-15 17:58:36 +01:00
$query [ 'orderby' ] = 'menu_order title' ;
$query [ 'order' ] = 'asc' ;
$query [ 'posts_per_page' ] = - 1 ;
$query [ 'posts_per_archive_page' ] = - 1 ;
}
2009-03-09 23:14:09 +01:00
2010-10-27 10:27:45 +02:00
if ( ! empty ( $q [ 'show_sticky' ] ) )
$query [ 'post__in' ] = ( array ) get_option ( 'sticky_posts' );
2010-01-15 17:58:36 +01:00
wp ( $query );
2007-10-10 00:49:42 +02:00
2010-01-13 19:49:56 +01:00
return $avail_post_stati ;
2007-10-10 00:49:42 +02:00
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
2010-12-01 20:24:38 +01:00
* @ since 2.5 . 0
2008-10-02 03:03:26 +02:00
*
* @ param unknown_type $type
* @ return unknown
*/
2008-02-19 07:13:20 +01:00
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 ;
}
2008-10-02 03:03:26 +02:00
/**
2012-06-29 17:09:14 +02:00
* Executes a query for attachments . An array of WP_Query arguments
* can be passed in , which will override the arguments set by this function .
2012-08-28 21:08:28 +02:00
*
2010-12-01 20:24:38 +01:00
* @ since 2.5 . 0
2012-06-29 17:09:14 +02:00
* @ uses apply_filters () Calls 'upload_per_page' on posts_per_page argument
2008-10-02 03:03:26 +02:00
*
2012-06-29 17:09:14 +02:00
* @ param array | bool $q Array of query variables to use to build the query or false to use $_GET superglobal .
* @ return array
2008-10-02 03:03:26 +02:00
*/
2008-02-19 07:13:20 +01:00
function wp_edit_attachments_query ( $q = false ) {
if ( false === $q )
$q = $_GET ;
2008-08-08 19:05:10 +02:00
$q [ 'm' ] = isset ( $q [ 'm' ] ) ? ( int ) $q [ 'm' ] : 0 ;
$q [ 'cat' ] = isset ( $q [ 'cat' ] ) ? ( int ) $q [ 'cat' ] : 0 ;
2008-02-19 07:13:20 +01:00
$q [ 'post_type' ] = 'attachment' ;
2011-05-23 01:25:28 +02:00
$post_type = get_post_type_object ( 'attachment' );
2011-05-26 07:41:34 +02:00
$states = 'inherit' ;
2011-05-23 01:25:28 +02:00
if ( current_user_can ( $post_type -> cap -> read_private_posts ) )
2011-05-26 07:41:34 +02:00
$states .= ',private' ;
2011-05-23 01:25:28 +02:00
$q [ 'post_status' ] = isset ( $q [ 'status' ] ) && 'trash' == $q [ 'status' ] ? 'trash' : $states ;
2010-01-07 01:01:52 +01:00
$media_per_page = ( int ) get_user_option ( 'upload_per_page' );
2009-12-12 00:14:43 +01:00
if ( empty ( $media_per_page ) || $media_per_page < 1 )
2009-03-27 23:47:47 +01:00
$media_per_page = 20 ;
2009-12-12 00:14:43 +01:00
$q [ 'posts_per_page' ] = apply_filters ( 'upload_per_page' , $media_per_page );
2008-02-19 07:13:20 +01:00
2009-10-26 18:56:28 +01:00
$post_mime_types = get_post_mime_types ();
2008-02-19 07:13:20 +01:00
$avail_post_mime_types = get_available_post_mime_types ( 'attachment' );
if ( isset ( $q [ 'post_mime_type' ]) && ! array_intersect ( ( array ) $q [ 'post_mime_type' ], array_keys ( $post_mime_types ) ) )
unset ( $q [ 'post_mime_type' ]);
2010-08-11 23:54:51 +02:00
if ( isset ( $q [ 'detached' ]) )
add_filter ( 'posts_where' , '_edit_attachments_query_helper' );
2010-10-27 10:27:45 +02:00
wp ( $q );
2008-02-19 07:13:20 +01:00
2010-08-11 23:54:51 +02:00
if ( isset ( $q [ 'detached' ]) )
remove_filter ( 'posts_where' , '_edit_attachments_query_helper' );
2008-02-19 07:13:20 +01:00
return array ( $post_mime_types , $avail_post_mime_types );
}
2010-08-11 23:54:51 +02:00
function _edit_attachments_query_helper ( $where ) {
2012-01-09 16:55:30 +01:00
global $wpdb ;
return $where .= " AND { $wpdb -> posts } .post_parent < 1 " ;
2010-08-11 23:54:51 +02:00
}
2008-10-02 03:03:26 +02:00
/**
2011-05-11 18:57:00 +02:00
* Returns the list of classes to be used by a metabox
2008-10-02 03:03:26 +02:00
*
2009-12-22 13:25:15 +01:00
* @ uses get_user_option ()
2010-12-01 20:24:38 +01:00
* @ since 2.5 . 0
2008-10-02 03:03:26 +02:00
*
* @ param unknown_type $id
* @ param unknown_type $page
* @ return unknown
*/
2008-02-08 20:57:50 +01:00
function postbox_classes ( $id , $page ) {
2011-05-11 18:57:00 +02:00
if ( isset ( $_GET [ 'edit' ] ) && $_GET [ 'edit' ] == $id ) {
$classes = array ( '' );
} elseif ( $closed = get_user_option ( 'closedpostboxes_' . $page ) ) {
2009-12-22 13:25:15 +01:00
if ( ! is_array ( $closed ) ) {
2011-05-11 18:57:00 +02:00
$classes = array ( '' );
2011-05-11 19:05:35 +02:00
} else {
$classes = in_array ( $id , $closed ) ? array ( 'closed' ) : array ( '' );
2009-12-22 13:25:15 +01:00
}
2008-01-14 01:20:52 +01:00
} else {
2011-05-11 18:57:00 +02:00
$classes = array ( '' );
2008-01-14 01:20:52 +01:00
}
2011-05-11 18:57:00 +02:00
$classes = apply_filters ( " postbox_classes_ { $page } _ { $id } " , $classes );
return implode ( ' ' , $classes );
2008-01-09 18:46:13 +01:00
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
2010-12-01 20:24:38 +01:00
* @ since 2.5 . 0
2008-10-02 03:03:26 +02:00
*
2010-01-15 23:11:12 +01:00
* @ param int | object $id Post ID or post object .
* @ param string $title ( optional ) Title
* @ param string $name ( optional ) Name
* @ return array With two entries of type string
2008-10-02 03:03:26 +02:00
*/
2009-09-14 04:06:33 +02:00
function get_sample_permalink ( $id , $title = null , $name = null ) {
2012-08-23 22:01:10 +02:00
$post = get_post ( $id );
2010-03-28 07:23:49 +02:00
if ( ! $post -> ID )
2008-02-22 18:43:56 +01:00
return array ( '' , '' );
2010-03-28 07:23:49 +02:00
$ptype = get_post_type_object ( $post -> post_type );
2008-01-17 17:51:32 +01:00
$original_status = $post -> post_status ;
$original_date = $post -> post_date ;
$original_name = $post -> post_name ;
2008-03-03 22:02:53 +01:00
2008-03-05 23:09:28 +01:00
// Hack: get_permalink would return ugly permalink for
// drafts, so we will fake, that our post is published
2009-12-22 13:25:15 +01:00
if ( in_array ( $post -> post_status , array ( 'draft' , 'pending' )) ) {
2008-01-17 17:51:32 +01:00
$post -> post_status = 'publish' ;
2009-11-26 12:29:54 +01:00
$post -> post_name = sanitize_title ( $post -> post_name ? $post -> post_name : $post -> post_title , $post -> ID );
2008-01-17 17:51:32 +01:00
}
2008-03-05 23:09:28 +01:00
// 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
2010-03-28 07:23:49 +02:00
if ( ! is_null ( $name ) )
2009-11-26 12:29:54 +01:00
$post -> post_name = sanitize_title ( $name ? $name : $title , $post -> ID );
2008-03-02 23:15:30 +01:00
2010-04-18 03:46:28 +02:00
$post -> post_name = wp_unique_post_slug ( $post -> post_name , $post -> ID , $post -> post_status , $post -> post_type , $post -> post_parent );
2009-03-18 03:43:45 +01:00
$post -> filter = 'sample' ;
2008-12-17 00:50:39 +01:00
2008-01-17 17:51:32 +01:00
$permalink = get_permalink ( $post , true );
2008-03-02 23:15:30 +01:00
2010-04-18 11:18:20 +02:00
// Replace custom post_type Token with generic pagename token for ease of use.
$permalink = str_replace ( " % $post->post_type % " , '%pagename%' , $permalink );
2010-03-28 07:23:49 +02:00
2008-03-02 23:15:30 +01:00
// Handle page hierarchy
2010-03-28 07:23:49 +02:00
if ( $ptype -> hierarchical ) {
2010-05-03 22:10:26 +02:00
$uri = get_page_uri ( $post );
2008-03-15 22:27:10 +01:00
$uri = untrailingslashit ( $uri );
$uri = strrev ( stristr ( strrev ( $uri ), '/' ) );
2008-03-02 23:15:30 +01:00
$uri = untrailingslashit ( $uri );
2011-06-01 22:30:29 +02:00
$uri = apply_filters ( 'editable_slug' , $uri );
2008-03-02 23:15:30 +01:00
if ( ! empty ( $uri ) )
2010-03-28 07:23:49 +02:00
$uri .= '/' ;
2010-11-14 16:50:02 +01:00
$permalink = str_replace ( '%pagename%' , " { $uri } %pagename% " , $permalink );
2008-03-02 23:15:30 +01:00
}
2008-05-05 19:08:13 +02:00
$permalink = array ( $permalink , apply_filters ( 'editable_slug' , $post -> post_name ));
2008-01-17 17:51:32 +01:00
$post -> post_status = $original_status ;
$post -> post_date = $original_date ;
$post -> post_name = $original_name ;
2008-12-17 00:50:39 +01:00
unset ( $post -> filter );
2008-01-17 17:51:32 +01:00
return $permalink ;
}
2008-10-02 03:03:26 +02:00
/**
2012-10-07 05:44:30 +02:00
* Returns the HTML of the sample permalink slug editor .
2010-01-15 23:11:12 +01:00
*
2010-12-01 20:24:38 +01:00
* @ since 2.5 . 0
2008-10-02 03:03:26 +02:00
*
2010-01-15 23:11:12 +01:00
* @ param int | object $id Post ID or post object .
2012-10-07 05:44:30 +02:00
* @ param string $new_title Optional . New title .
* @ param string $new_slug Optional . New slug .
* @ return string The HTML of the sample permalink slug editor .
2008-10-02 03:03:26 +02:00
*/
2012-11-19 02:28:32 +01:00
function get_sample_permalink_html ( $id , $new_title = null , $new_slug = null ) {
2010-05-04 20:18:35 +02:00
global $wpdb ;
2012-08-23 22:01:10 +02:00
$post = get_post ( $id );
2010-05-05 09:37:51 +02:00
2008-03-03 22:02:53 +01:00
list ( $permalink , $post_name ) = get_sample_permalink ( $post -> ID , $new_title , $new_slug );
2009-09-14 04:06:33 +02:00
2012-09-22 00:52:54 +02:00
if ( 'publish' == get_post_status ( $post ) ) {
2010-05-11 21:52:50 +02:00
$ptype = get_post_type_object ( $post -> post_type );
$view_post = $ptype -> labels -> view_item ;
2009-09-14 04:06:33 +02:00
$title = __ ( 'Click to edit this part of the permalink' );
} else {
$title = __ ( 'Temporary permalink. Click to edit this part.' );
}
2009-03-18 03:43:45 +01:00
2009-01-29 13:11:52 +01:00
if ( false === strpos ( $permalink , '%postname%' ) && false === strpos ( $permalink , '%pagename%' ) ) {
2012-07-22 04:33:53 +02:00
$return = '<strong>' . __ ( 'Permalink:' ) . " </strong> \n " . '<span id="sample-permalink" tabindex="-1">' . $permalink . " </span> \n " ;
2010-12-01 18:16:22 +01:00
if ( '' == get_option ( 'permalink_structure' ) && current_user_can ( 'manage_options' ) && ! ( 'page' == get_option ( 'show_on_front' ) && $id == get_option ( 'page_on_front' ) ) )
2012-09-21 21:34:23 +02:00
$return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button button-small" target="_blank">' . __ ( 'Change Permalinks' ) . " </a></span> \n " ;
2012-11-19 02:28:32 +01:00
if ( isset ( $view_post ) )
2012-09-21 21:34:23 +02:00
$return .= " <span id='view-post-btn'><a href=' $permalink ' class='button button-small'> $view_post </a></span> \n " ;
2009-01-29 13:11:52 +01:00
2009-08-10 22:49:09 +02:00
$return = apply_filters ( 'get_sample_permalink_html' , $return , $id , $new_title , $new_slug );
2009-01-29 13:11:52 +01:00
return $return ;
2008-01-17 17:51:32 +01:00
}
2009-01-29 13:11:52 +01:00
2009-09-14 04:06:33 +02:00
if ( function_exists ( 'mb_strlen' ) ) {
if ( mb_strlen ( $post_name ) > 30 ) {
2008-11-30 20:09:13 +01:00
$post_name_abridged = mb_substr ( $post_name , 0 , 14 ) . '…' . mb_substr ( $post_name , - 14 );
} else {
$post_name_abridged = $post_name ;
}
2008-02-12 00:19:09 +01:00
} else {
2009-09-14 04:06:33 +02:00
if ( strlen ( $post_name ) > 30 ) {
2008-11-30 20:09:13 +01:00
$post_name_abridged = substr ( $post_name , 0 , 14 ) . '…' . substr ( $post_name , - 14 );
} else {
$post_name_abridged = $post_name ;
}
2008-01-17 17:51:32 +01:00
}
2009-01-29 13:11:52 +01:00
2009-03-10 03:14:42 +01:00
$post_name_html = '<span id="editable-post-name" title="' . $title . '">' . $post_name_abridged . '</span>' ;
2008-02-21 21:19:34 +01:00
$display_link = str_replace ( array ( '%pagename%' , '%postname%' ), $post_name_html , $permalink );
2009-01-29 13:11:52 +01:00
$view_link = str_replace ( array ( '%pagename%' , '%postname%' ), $post_name , $permalink );
2012-11-19 02:28:32 +01:00
$return = '<strong>' . __ ( 'Permalink:' ) . " </strong> \n " ;
2012-07-22 04:33:53 +02:00
$return .= '<span id="sample-permalink" tabindex="-1">' . $display_link . " </span> \n " ;
2010-02-04 17:45:55 +01:00
$return .= '‎' ; // Fix bi-directional text display defect in RTL languages.
2012-09-21 21:34:23 +02:00
$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 " ;
2009-03-10 03:14:42 +01:00
$return .= '<span id="editable-post-name-full">' . $post_name . " </span> \n " ;
2012-11-19 02:28:32 +01:00
if ( isset ( $view_post ) )
2012-09-21 21:34:23 +02:00
$return .= " <span id='view-post-btn'><a href=' $view_link ' class='button button-small'> $view_post </a></span> \n " ;
2009-01-29 13:11:52 +01:00
2009-08-10 22:49:09 +02:00
$return = apply_filters ( 'get_sample_permalink_html' , $return , $id , $new_title , $new_slug );
2008-02-21 18:08:06 +01:00
return $return ;
2008-02-05 07:47:27 +01:00
}
2008-01-17 17:51:32 +01:00
2009-10-19 22:23:35 +02:00
/**
2009-12-10 07:14:36 +01:00
* Output HTML for the post thumbnail meta - box .
2009-10-19 22:23:35 +02:00
*
* @ since 2.9 . 0
*
* @ param int $thumbnail_id ID of the attachment used for thumbnail
2012-09-04 18:29:28 +02:00
* @ param mixed $post The post ID or object associated with the thumbnail , defaults to global $post .
2009-10-19 22:23:35 +02:00
* @ return string html
*/
2012-09-04 18:29:28 +02:00
function _wp_post_thumbnail_html ( $thumbnail_id = null , $post = null ) {
global $content_width , $_wp_additional_image_sizes ;
2012-02-10 18:41:37 +01:00
2012-09-04 18:29:28 +02:00
$post = get_post ( $post );
2012-02-10 18:41:37 +01:00
2012-09-04 18:29:28 +02:00
$upload_iframe_src = esc_url ( get_upload_iframe_src ( 'image' , $post -> ID ) );
2012-04-25 22:24:20 +02:00
$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' ) );
2009-10-19 22:23:35 +02:00
if ( $thumbnail_id && get_post ( $thumbnail_id ) ) {
2009-12-08 22:08:19 +01:00
$old_content_width = $content_width ;
$content_width = 266 ;
2009-12-10 07:14:36 +01:00
if ( ! isset ( $_wp_additional_image_sizes [ 'post-thumbnail' ] ) )
2009-12-08 22:08:19 +01:00
$thumbnail_html = wp_get_attachment_image ( $thumbnail_id , array ( $content_width , $content_width ) );
else
2009-12-10 07:14:36 +01:00
$thumbnail_html = wp_get_attachment_image ( $thumbnail_id , 'post-thumbnail' );
2009-10-19 22:23:35 +02:00
if ( ! empty ( $thumbnail_html ) ) {
2012-09-04 18:29:28 +02:00
$ajax_nonce = wp_create_nonce ( 'set_post_thumbnail-' . $post -> ID );
2012-04-25 22:24:20 +02:00
$content = sprintf ( $set_thumbnail_link , $upload_iframe_src , $thumbnail_html );
2010-05-19 00:08:49 +02:00
$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>' ;
2009-10-19 22:23:35 +02:00
}
2009-12-08 22:08:19 +01:00
$content_width = $old_content_width ;
2009-10-19 22:23:35 +02:00
}
2012-09-04 18:29:28 +02:00
return apply_filters ( 'admin_post_thumbnail_html' , $content , $post -> ID );
2009-10-19 22:23:35 +02:00
}
2008-10-02 03:03:26 +02:00
/**
2009-09-13 10:34:24 +02:00
* Check to see if the post is currently being edited by another user .
2008-10-02 03:03:26 +02:00
*
2009-09-13 10:34:24 +02:00
* @ since 2.5 . 0
2008-10-02 03:03:26 +02:00
*
2009-09-13 10:34:24 +02:00
* @ param int $post_id ID of the post to check for editing
2008-10-02 03:03:26 +02:00
* @ return bool | int False : not locked or locked by current user . Int : user ID of user with lock .
*/
2008-02-29 10:51:36 +01:00
function wp_check_post_lock ( $post_id ) {
if ( ! $post = get_post ( $post_id ) )
return false ;
2010-12-13 22:23:46 +01:00
if ( ! $lock = get_post_meta ( $post -> ID , '_edit_lock' , true ) )
return false ;
2008-02-29 10:51:36 +01:00
2010-12-13 22:23:46 +01:00
$lock = explode ( ':' , $lock );
$time = $lock [ 0 ];
$user = isset ( $lock [ 1 ] ) ? $lock [ 1 ] : get_post_meta ( $post -> ID , '_edit_last' , true );
2011-01-06 05:11:14 +01:00
2013-03-12 04:22:30 +01:00
$time_window = apply_filters ( 'wp_check_post_lock_window' , 120 );
2008-02-29 10:51:36 +01:00
2010-12-13 22:23:46 +01:00
if ( $time && $time > time () - $time_window && $user != get_current_user_id () )
return $user ;
2008-02-29 10:51:36 +01:00
return false ;
}
2008-10-02 03:03:26 +02:00
/**
2009-09-13 10:34:24 +02:00
* Mark the post as currently being edited by the current user
2008-10-02 03:03:26 +02:00
*
2009-09-13 10:34:24 +02:00
* @ since 2.5 . 0
2008-10-02 03:03:26 +02:00
*
2009-09-13 10:34:24 +02:00
* @ param int $post_id ID of the post to being edited
2011-09-27 22:52:07 +02:00
* @ return bool | array Returns false if the post doesn ' t exist of there is no current user , or
* an array of the lock time and the user ID .
2008-10-02 03:03:26 +02:00
*/
2008-02-29 10:51:36 +01:00
function wp_set_post_lock ( $post_id ) {
if ( ! $post = get_post ( $post_id ) )
return false ;
2010-12-13 22:23:46 +01:00
if ( 0 == ( $user_id = get_current_user_id ()) )
2008-02-29 10:51:36 +01:00
return false ;
2008-03-02 21:17:30 +01:00
2008-02-29 10:51:36 +01:00
$now = time ();
2010-12-13 22:23:46 +01:00
$lock = " $now : $user_id " ;
2008-02-29 10:51:36 +01:00
2013-03-01 17:28:40 +01:00
update_post_meta ( $post -> ID , '_edit_lock' , $lock );
2011-09-27 22:52:07 +02:00
return array ( $now , $user_id );
2008-02-29 10:51:36 +01:00
}
2009-09-13 10:52:39 +02:00
/**
2013-03-12 04:22:30 +01:00
* Outputs the HTML for the notice to say that someone else is editing or has taken over editing of this post .
2009-09-14 16:03:32 +02:00
*
2009-10-20 19:02:22 +02:00
* @ since 2.8 . 5
2009-09-13 10:52:39 +02:00
* @ return none
*/
function _admin_notice_post_locked () {
2013-03-15 22:09:20 +01:00
if ( ! $post = get_post () )
return ;
2009-09-14 16:03:32 +02:00
2013-03-15 22:09:20 +01:00
if ( $user = wp_check_post_lock ( $post -> ID ) ) {
2013-03-12 04:22:30 +01:00
$user = get_userdata ( $user );
2013-03-15 22:09:20 +01:00
$locked = apply_filters ( 'show_post_locked_dialog' , true , $post , $user );
2013-03-12 04:22:30 +01:00
} else {
$locked = false ;
}
2013-03-15 22:09:20 +01:00
$class = $locked ? '' : ' class="hidden"' ;
2013-03-12 04:22:30 +01:00
?>
2013-03-15 22:09:20 +01:00
< div id = " notification-dialog-wrap " < ? php echo $class ; ?> >
2013-03-12 04:22:30 +01:00
< div id = " notification-dialog-background " ></ div >
< div id = " notification-dialog " >
< ? php
if ( $locked ) {
2013-03-15 22:09:20 +01:00
$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 );
}
$preview_link = apply_filters ( 'preview_post_link' , $preview_link );
2013-03-21 01:57:27 +01:00
$override = apply_filters ( 'override_post_lock' , true , $post , $user );
$tab_last = $override ? '' : ' wp-tab-last' ;
2013-03-15 22:09:20 +01:00
2013-03-12 04:22:30 +01:00
?>
< div class = " post-locked-message " >
< div class = " post-locked-avatar " >< ? php echo get_avatar ( $user -> ID , 64 ); ?> </div>
2013-03-21 01:57:27 +01:00
< p class = " currently-editing wp-tab-first " tabindex = " 0 " >< ? php esc_html_e ( sprintf ( __ ( 'This content is currently locked. If you take over, %s will be blocked from continuing to edit.' ), $user -> display_name ) ); ?> </p>
2013-03-12 04:22:30 +01:00
< p >
< a class = " button " href = " <?php echo esc_url( wp_get_referer() ); ?> " >< ? php _e ( 'Go back' ); ?> </a>
2013-03-21 01:57:27 +01:00
< a class = " button<?php echo $tab_last ; ?> " href = " <?php echo esc_url( $preview_link ); ?> " >< ? php _e ( 'Preview' ); ?> </a>
2013-03-12 04:22:30 +01:00
< ? php
2013-03-15 22:09:20 +01:00
// Allow plugins to prevent some users overriding the post lock
2013-03-21 01:57:27 +01:00
if ( $override ) {
2013-03-12 04:22:30 +01:00
?>
2013-03-21 01:57:27 +01:00
< 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>
2013-03-12 04:22:30 +01:00
< ? php
}
?>
</ p >
</ div >
< ? php
} else {
?>
< div class = " post-taken-over " >
< div class = " post-locked-avatar " ></ div >
2013-03-21 01:57:27 +01:00
< p class = " currently-editing wp-tab-first " tabindex = " 0 " ></ p >
< p >< a class = " button button-primary wp-tab-last " href = " <?php echo esc_url( admin_url('edit.php') ); ?> " >< ? php _e ( 'Go to All Posts' ); ?> </a></p>
2013-03-12 04:22:30 +01:00
</ div >
< ? php
2009-09-13 23:18:55 +02:00
}
2009-09-14 16:03:32 +02:00
2013-03-12 04:22:30 +01:00
?>
</ div >
</ div >
< ? php
2009-09-13 10:52:39 +02:00
}
2008-05-08 19:25:07 +02:00
/**
2008-10-02 03:03:26 +02:00
* Creates autosave data for the specified post from $_POST data .
2008-05-08 19:25:07 +02:00
*
* @ package WordPress
2008-10-02 03:03:26 +02:00
* @ subpackage Post_Revisions
* @ since 2.6 . 0
2008-05-08 19:25:07 +02:00
*
* @ uses _wp_translate_postdata ()
2008-05-30 00:21:36 +02:00
* @ uses _wp_post_revision_fields ()
2010-01-15 23:11:12 +01:00
*
2009-12-22 13:25:15 +01:00
* @ return unknown
2008-05-08 19:25:07 +02:00
*/
2008-05-30 00:21:36 +02:00
function wp_create_post_autosave ( $post_id ) {
2008-05-08 19:25:07 +02:00
$translated = _wp_translate_postdata ( true );
if ( is_wp_error ( $translated ) )
return $translated ;
2013-03-16 22:15:43 +01:00
$post_author = get_current_user_id ();
// Store one autosave per author. If there is already an autosave, overwrite it.
if ( $old_autosave = wp_get_post_autosave ( $post_id , $post_author ) ) {
2013-03-01 17:28:40 +01:00
$new_autosave = _wp_post_revision_fields ( $_POST , true );
2008-05-08 19:25:07 +02:00
$new_autosave [ 'ID' ] = $old_autosave -> ID ;
2013-03-16 22:15:43 +01:00
$new_autosave [ 'post_author' ] = $post_author ;
2013-03-29 13:08:42 +01:00
2013-04-07 01:18:52 +02:00
// Auto-save revisioned meta fields.
2013-03-29 13:08:42 +01:00
foreach ( _wp_post_revision_meta_keys () as $meta_key ) {
2013-04-07 01:18:52 +02:00
if ( isset ( $_POST [ $meta_key ] ) && get_post_meta ( $new_autosave [ 'ID' ], $meta_key , true ) != $_POST [ $meta_key ] ) {
// Use the underlying delete_metadata and add_metadata vs delete_post_meta
// and add_post_meta to make sure we're working with the actual revision meta.
delete_metadata ( 'post' , $new_autosave [ 'ID' ], $meta_key );
if ( ! empty ( $_POST [ $meta_key ] ) )
add_metadata ( 'post' , $new_autosave [ 'ID' ], $meta_key , $_POST [ $meta_key ] );
}
}
// Save the post format if different
if ( isset ( $_POST [ 'post_format' ] ) && get_post_meta ( $new_autosave [ 'ID' ], '_revision_post_format' , true ) != $_POST [ 'post_format' ] ) {
delete_metadata ( 'post' , $new_autosave [ 'ID' ], '_revision_post_format' );
2013-03-29 13:08:42 +01:00
2013-04-07 01:18:52 +02:00
if ( ! empty ( $_POST [ 'post_format' ] ) )
add_metadata ( 'post' , $new_autosave [ 'ID' ], '_revision_post_format' , $_POST [ 'post_format' ] );
2013-03-29 13:08:42 +01:00
}
2008-05-08 19:25:07 +02:00
return wp_update_post ( $new_autosave );
}
2009-04-29 04:47:41 +02:00
// _wp_put_post_revision() expects unescaped.
2013-03-01 18:00:25 +01:00
$_POST = wp_unslash ( $_POST );
2009-04-29 04:47:41 +02:00
2008-05-08 19:25:07 +02:00
// Otherwise create the new autosave as a special post revision
2008-05-30 00:21:36 +02:00
return _wp_put_post_revision ( $_POST , true );
2008-05-08 19:25:07 +02:00
}
2008-08-20 23:42:31 +02:00
/**
2008-10-31 23:47:07 +01:00
* Save draft or manually autosave for showing preview .
*
* @ package WordPress
2009-12-22 13:25:15 +01:00
* @ since 2.7 . 0
2008-12-09 19:03:31 +01:00
*
2011-09-29 23:47:52 +02:00
* @ uses get_post_status ()
2008-10-31 23:47:07 +01:00
* @ uses edit_post ()
* @ uses get_post ()
* @ uses current_user_can ()
2011-09-29 23:47:52 +02:00
* @ uses wp_die ()
2008-10-31 23:47:07 +01:00
* @ uses wp_create_post_autosave ()
2011-09-29 23:47:52 +02:00
* @ uses add_query_arg ()
* @ uses wp_create_nonce ()
2008-12-09 19:03:31 +01:00
*
2008-11-04 14:00:12 +01:00
* @ return str URL to redirect to show the preview
2008-10-31 23:47:07 +01:00
*/
function post_preview () {
2008-11-02 14:56:32 +01:00
$post_ID = ( int ) $_POST [ 'post_ID' ];
2010-05-14 20:30:43 +02:00
$status = get_post_status ( $post_ID );
if ( 'auto-draft' == $status )
2008-11-13 01:01:03 +01:00
wp_die ( __ ( 'Preview not available. Please save as a draft first.' ) );
2008-12-09 19:03:31 +01:00
2008-11-02 14:56:32 +01:00
if ( isset ( $_POST [ 'catslist' ]) )
$_POST [ 'post_category' ] = explode ( " , " , $_POST [ 'catslist' ]);
2008-12-09 19:03:31 +01:00
2008-11-02 14:56:32 +01:00
if ( isset ( $_POST [ 'tags_input' ]) )
$_POST [ 'tags_input' ] = explode ( " , " , $_POST [ 'tags_input' ]);
2008-12-09 19:03:31 +01:00
2008-11-02 14:56:32 +01:00
if ( $_POST [ 'post_type' ] == 'page' || empty ( $_POST [ 'post_category' ]) )
2008-10-31 23:47:07 +01:00
unset ( $_POST [ 'post_category' ]);
2008-11-02 14:56:32 +01:00
$_POST [ 'ID' ] = $post_ID ;
$post = get_post ( $post_ID );
2008-10-31 23:47:07 +01:00
2008-11-02 14:56:32 +01:00
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.' ));
}
2008-10-31 23:47:07 +01:00
2013-03-16 22:15:43 +01:00
$user_id = get_current_user_id ();
if ( 'draft' == $post -> post_status && $user_id == $post -> post_author ) {
2008-11-02 14:56:32 +01:00
$id = edit_post ();
2011-12-14 00:45:31 +01:00
} else { // Non drafts are not overwritten. The autosave is stored in a special post revision.
2008-11-02 14:56:32 +01:00
$id = wp_create_post_autosave ( $post -> ID );
if ( ! is_wp_error ( $id ) )
2008-10-31 23:47:07 +01:00
$id = $post -> ID ;
}
2008-11-04 14:00:12 +01:00
if ( is_wp_error ( $id ) )
wp_die ( $id -> get_error_message () );
2013-03-16 22:15:43 +01:00
if ( $_POST [ 'post_status' ] == 'draft' && $user_id == $post -> post_author ) {
2008-11-04 14:00:12 +01:00
$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 ) );
}
2013-03-01 17:46:25 +01:00
return apply_filters ( 'preview_post_link' , $url );
2008-10-31 23:47:07 +01:00
}