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 ?
2008-10-02 03:03:26 +02:00
* @ param post_data array 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' ];
2008-11-10 19:54:18 +01:00
$post_data [ 'post_content' ] = isset ( $post_data [ 'content' ]) ? $post_data [ 'content' ] : '' ;
$post_data [ 'post_excerpt' ] = isset ( $post_data [ 'excerpt' ]) ? $post_data [ 'excerpt' ] : '' ;
2008-09-11 00:47:03 +02:00
$post_data [ 'post_parent' ] = isset ( $post_data [ 'parent_id' ]) ? $post_data [ 'parent_id' ] : '' ;
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
2010-04-18 06:26:39 +02:00
$ptype = get_post_type_object ( $post_data [ 'post_type' ] );
2008-09-11 00:47:03 +02:00
if ( isset ( $post_data [ 'user_ID' ]) && ( $post_data [ 'post_author' ] != $post_data [ 'user_ID' ]) ) {
2010-04-18 06:26:39 +02:00
if ( ! current_user_can ( $ptype -> edit_others_cap ) ) {
if ( 'page' == $post_data [ 'post_type' ] ) {
2008-05-08 19:25:07 +02:00
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.' )
);
2010-04-18 06:26:39 +02:00
} else {
2008-05-08 19:25:07 +02:00
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.' )
);
}
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-04-18 06:26:39 +02:00
if ( isset ( $post_data [ 'post_status' ]) && ( 'publish' == $post_data [ 'post_status' ] && ! current_user_can ( $ptype -> publish_cap )) )
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' ] ))
$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' ] ))
$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 ;
2008-09-11 00:47:03 +02:00
$post_data [ 'post_date' ] = sprintf ( " %04d-%02d-%02d %02d:%02d:%02d " , $aa , $mm , $jj , $hh , $mn , $ss );
$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 .
*
* @ since unknown
*
* @ param array $post_data Optional .
* @ return int Post ID .
*/
2008-09-11 00:47:03 +02:00
function edit_post ( $post_data = null ) {
if ( empty ( $post_data ) )
$post_data = & $_POST ;
2008-05-08 19:25:07 +02:00
2008-09-11 00:47:03 +02:00
$post_ID = ( int ) $post_data [ 'post_ID' ];
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' ]);
if ( ! current_user_can ( $ptype -> edit_cap , $post_ID ) ) {
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.' ));
}
// Autosave shouldn't save too soon after a real save
2008-09-11 00:47:03 +02:00
if ( 'autosave' == $post_data [ 'action' ] ) {
2008-05-08 19:25:07 +02:00
$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 ;
}
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 () );
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
}
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' ] ) {
foreach ( $post_data [ 'meta' ] as $key => $value )
2007-05-25 09:16:21 +02:00
update_meta ( $key , $value [ 'key' ], $value [ 'value' ] );
}
2008-09-11 00:47:03 +02:00
if ( isset ( $post_data [ 'deletemeta' ]) && $post_data [ 'deletemeta' ] ) {
foreach ( $post_data [ 'deletemeta' ] as $key => $value )
2007-05-25 09:16:21 +02:00
delete_meta ( $key );
}
add_meta ( $post_ID );
2010-04-24 06:24:38 +02:00
update_post_meta ( $post_ID , '_edit_last' , $GLOBALS [ 'current_user' ] -> ID );
2008-09-11 00:47:03 +02:00
wp_update_post ( $post_data );
2007-05-25 09:16:21 +02:00
// Reunite any orphaned attachments with their parent
if ( ! $draft_ids = get_user_option ( 'autosave_draft_ids' ) )
$draft_ids = array ();
if ( $draft_temp_id = ( int ) array_search ( $post_ID , $draft_ids ) )
_relocate_children ( $draft_temp_id , $post_ID );
// Now that we have an ID we can fix any attachment anchor hrefs
_fix_attachment_links ( $post_ID );
2008-03-04 01:05:30 +01:00
wp_set_post_lock ( $post_ID , $GLOBALS [ 'current_user' ] -> ID );
2008-08-06 23:31:40 +02:00
if ( current_user_can ( 'edit_others_posts' ) ) {
2008-09-11 00:47:03 +02:00
if ( ! empty ( $post_data [ 'sticky' ]) )
2008-08-06 23:31:40 +02:00
stick_post ( $post_ID );
else
unstick_post ( $post_ID );
}
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-03-30 15:16:28 +02:00
if ( ! current_user_can ( $ptype -> edit_type_cap ) ) {
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 ;
2010-04-18 17:54:45 +02:00
if ( is_taxonomy_hierarchical ( $tax_name ) )
2010-03-17 17:27:25 +01:00
$tax_input [ $tax_name ] = array_map ( 'absint' , $terms );
2010-03-01 16:48:01 +01:00
else {
$tax_input [ $tax_name ] = preg_replace ( '/\s*,\s*/' , ',' , rtrim ( trim ( $terms ), ' ,' ) );
$tax_input [ $tax_name ] = explode ( ',' , $tax_input [ $tax_name ]);
}
}
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 ) {
2008-09-30 12:30:56 +02:00
if ( isset ( $children ) && in_array ( $post_ID , $children ) ) {
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
2010-03-01 16:48:01 +01:00
$tax_names = get_object_taxonomies ( get_post ( $post_ID ) );
2010-03-17 17:27:25 +01:00
2010-03-01 16:48:01 +01:00
if ( isset ( $new_cats ) && in_array ( 'category' , $tax_names ) ) {
2008-09-25 15:42:34 +02:00
$cats = ( array ) wp_get_post_categories ( $post_ID );
$post_data [ 'post_category' ] = array_unique ( array_merge ( $cats , $new_cats ) );
}
2010-03-17 17:27:25 +01:00
2010-03-01 16:48:01 +01:00
foreach ( $tax_names as $tax_name ) {
if ( isset ( $tax_input [ $tax_name ]) ) {
2010-04-18 17:54:45 +02:00
if ( is_taxonomy_hierarchical ( $tax_name ) )
2010-03-01 16:48:01 +01:00
$terms = ( array ) wp_get_object_terms ( $post_ID , $tax_name , array ( 'fields' => 'ids' ) );
else
$terms = ( array ) wp_get_object_terms ( $post_ID , $tax_name , array ( 'fields' => 'names' ) );
$post_data [ 'tax_input' ][ $tax_name ] = array_merge ( $terms , $tax_input [ $tax_name ] );
}
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
2009-08-12 12:57:15 +02:00
if ( isset ( $post_data [ 'sticky' ] ) && current_user_can ( '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
}
2008-10-02 03:03:26 +02:00
/**
* Default post information to use when populating the " Write Post " form .
*
* @ since unknown
*
2010-01-12 01:14:27 +01:00
*@ param string A post type string , defaults to 'post' .
2009-12-22 13:25:15 +01:00
* @ return object stdClass object containing all the default post data as attributes
2008-10-02 03:03:26 +02:00
*/
2010-02-06 11:07:57 +01:00
function get_default_post_to_edit ( $post_type = 'post' , $create_in_db = false ) {
global $wpdb ;
2009-10-14 07:53:49 +02:00
$post_title = '' ;
2007-05-25 09:16:21 +02:00
if ( ! empty ( $_REQUEST [ 'post_title' ] ) )
2009-05-18 17:11:07 +02:00
$post_title = esc_html ( stripslashes ( $_REQUEST [ 'post_title' ] ));
2007-05-25 09:16:21 +02:00
2008-02-22 18:43:56 +01:00
$post_content = '' ;
2007-05-25 09:16:21 +02:00
if ( ! empty ( $_REQUEST [ 'content' ] ) )
2009-05-18 17:11:07 +02:00
$post_content = esc_html ( stripslashes ( $_REQUEST [ 'content' ] ));
2007-05-25 09:16:21 +02:00
2009-10-14 07:53:49 +02:00
$post_excerpt = '' ;
2007-05-25 09:16:21 +02:00
if ( ! empty ( $_REQUEST [ 'excerpt' ] ) )
2009-05-18 17:11:07 +02:00
$post_excerpt = esc_html ( stripslashes ( $_REQUEST [ 'excerpt' ] ));
2007-05-25 09:16:21 +02:00
2010-02-06 11:07:57 +01:00
if ( $create_in_db ) {
// Cleanup old auto-drafts more than 7 days old
$old_posts = $wpdb -> get_col ( " SELECT ID FROM $wpdb->posts WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) > post_date " );
foreach ( ( array ) $old_posts as $delete )
wp_delete_post ( $delete , true ); // Force delete
$post = get_post ( wp_insert_post ( array ( 'post_title' => __ ( 'Auto Draft' ), 'post_type' => $post_type , 'post_status' => 'auto-draft' ) ) );
} else {
$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 ;
}
2010-02-10 23:20:36 +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 );
2008-02-22 18:43:56 +01:00
$post -> post_name = '' ;
2007-05-25 09:16:21 +02:00
return $post ;
}
2008-10-02 03:03:26 +02:00
/**
2009-12-22 13:25:15 +01:00
* Get the default page information to use .
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
* @ return object stdClass object containing all the default post data as attributes
2008-10-02 03:03:26 +02:00
*/
2008-02-02 20:22:14 +01:00
function get_default_page_to_edit () {
2008-09-17 02:40:10 +02:00
$page = get_default_post_to_edit ();
$page -> post_type = 'page' ;
return $page ;
2008-02-02 20:22:14 +01:00
}
2008-10-02 03:03:26 +02:00
/**
* Get an existing post and format it for editing .
*
* @ since unknown
*
* @ param unknown_type $id
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function get_post_to_edit ( $id ) {
2007-07-11 21:57:43 +02:00
$post = get_post ( $id , OBJECT , 'edit' );
2007-05-25 11:41:04 +02:00
2007-05-25 09:16:21 +02:00
if ( $post -> post_type == 'page' )
$post -> page_template = get_post_meta ( $id , '_wp_page_template' , true );
return $post ;
}
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
*
* @ since unknown
*
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 ;
2009-03-05 23:16:29 +01:00
$post_title = stripslashes ( sanitize_post_field ( 'post_title' , $title , 0 , 'db' ) );
2009-03-18 03:43:45 +01:00
$post_content = stripslashes ( sanitize_post_field ( 'post_content' , $content , 0 , 'db' ) );
2009-03-05 23:16:29 +01:00
$post_date = stripslashes ( 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 ) )
return $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 .
*
* @ since unknown
*
* @ 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-03-30 15:16:28 +02:00
if ( ! current_user_can ( $ptype -> edit_type_cap ) ) {
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
}
// Check for autosave collisions
2010-02-06 11:07:57 +01:00
// Does this need to be updated? ~ Mark
2007-05-25 09:16:21 +02:00
$temp_id = false ;
if ( isset ( $_POST [ 'temp_ID' ]) ) {
$temp_id = ( int ) $_POST [ 'temp_ID' ];
if ( ! $draft_ids = get_user_option ( 'autosave_draft_ids' ) )
$draft_ids = array ();
foreach ( $draft_ids as $temp => $real )
if ( time () + $temp > 86400 ) // 1 day: $temp is equal to -1 * time( then )
unset ( $draft_ids [ $temp ]);
2010-02-08 19:02:23 +01:00
2007-05-25 09:16:21 +02:00
if ( isset ( $draft_ids [ $temp_id ]) ) { // Edit, don't write
$_POST [ 'post_ID' ] = $draft_ids [ $temp_id ];
unset ( $_POST [ 'temp_ID' ]);
update_user_option ( $user_ID , 'autosave_draft_ids' , $draft_ids );
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.
$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 );
2010-04-24 06:24:38 +02:00
add_post_meta ( $post_ID , '_edit_last' , $GLOBALS [ 'current_user' ] -> ID );
2007-05-25 09:16:21 +02:00
// Reunite any orphaned attachments with their parent
2010-02-06 11:07:57 +01:00
// Does this need to be udpated? ~ Mark
2007-05-25 09:16:21 +02:00
if ( ! $draft_ids = get_user_option ( 'autosave_draft_ids' ) )
$draft_ids = array ();
if ( $draft_temp_id = ( int ) array_search ( $post_ID , $draft_ids ) )
_relocate_children ( $draft_temp_id , $post_ID );
if ( $temp_id && $temp_id != $draft_temp_id )
_relocate_children ( $temp_id , $post_ID );
// Update autosave collision detection
if ( $temp_id ) {
$draft_ids [ $temp_id ] = $post_ID ;
update_user_option ( $user_ID , 'autosave_draft_ids' , $draft_ids );
}
// Now that we have an ID we can fix any attachment anchor hrefs
_fix_attachment_links ( $post_ID );
2008-03-04 01:05:30 +01:00
wp_set_post_lock ( $post_ID , $GLOBALS [ 'current_user' ] -> ID );
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
*
* @ since unknown
*
* @ 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 }}
*
* @ since unknown
*
* @ 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 ;
2007-06-20 00:42:25 +02:00
$protected = array ( '_wp_attached_file' , '_wp_attachment_metadata' , '_wp_old_slug' , '_wp_page_template' );
2007-06-18 18:28:11 +02:00
2008-11-08 12:18:05 +01:00
$metakeyselect = isset ( $_POST [ 'metakeyselect' ]) ? stripslashes ( trim ( $_POST [ 'metakeyselect' ] ) ) : '' ;
$metakeyinput = isset ( $_POST [ 'metakeyinput' ]) ? stripslashes ( trim ( $_POST [ 'metakeyinput' ] ) ) : '' ;
2009-12-08 01:48:39 +01:00
$metavalue = isset ( $_POST [ 'metavalue' ]) ? maybe_serialize ( stripslashes_deep ( $_POST [ 'metavalue' ] ) ) : '' ;
if ( is_string ( $metavalue ) )
$metavalue = trim ( $metavalue );
2007-05-25 09:16:21 +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:
if ( '#NONE#' != $metakeyselect )
$metakey = $metakeyselect ;
if ( $metakeyinput )
$metakey = $metakeyinput ; // default
2007-06-18 18:28:11 +02:00
if ( in_array ( $metakey , $protected ) )
return false ;
2007-10-12 23:12:34 +02:00
wp_cache_delete ( $post_ID , 'post_meta' );
2010-02-28 08:12:05 +01:00
$wpdb -> insert ( $wpdb -> postmeta , array ( 'post_id' => $post_ID , 'meta_key' => $metakey , 'meta_value' => $metavalue ) );
2009-09-24 19:10:28 +02:00
do_action ( 'added_postmeta' , $wpdb -> insert_id , $post_ID , $metakey , $metavalue );
2009-09-24 19:19:13 +02:00
2007-05-25 09:16:21 +02:00
return $wpdb -> insert_id ;
}
return false ;
} // add_meta
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $mid
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function delete_meta ( $mid ) {
global $wpdb ;
$mid = ( int ) $mid ;
2008-04-14 18:13:25 +02:00
$post_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT post_id FROM $wpdb->postmeta WHERE meta_id = %d " , $mid ) );
2007-10-12 23:12:34 +02:00
2009-09-24 19:10:28 +02:00
do_action ( 'delete_postmeta' , $mid );
2009-12-11 17:44:41 +01:00
wp_cache_delete ( $post_id , 'post_meta' );
2009-09-24 19:10:28 +02:00
$rval = $wpdb -> query ( $wpdb -> prepare ( " DELETE FROM $wpdb->postmeta WHERE meta_id = %d " , $mid ) );
do_action ( 'deleted_postmeta' , $mid );
return $rval ;
2007-05-25 09:16:21 +02:00
}
2008-10-02 03:03:26 +02:00
/**
* Get a list of previously defined keys .
*
* @ since unknown
*
* @ 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 }}
*
* @ since unknown
*
* @ param unknown_type $mid
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function get_post_meta_by_id ( $mid ) {
global $wpdb ;
$mid = ( int ) $mid ;
2008-04-14 18:13:25 +02:00
$meta = $wpdb -> get_row ( $wpdb -> prepare ( " SELECT * FROM $wpdb->postmeta WHERE meta_id = %d " , $mid ) );
2007-05-25 09:16:21 +02:00
if ( is_serialized_string ( $meta -> meta_value ) )
$meta -> meta_value = maybe_unserialize ( $meta -> meta_value );
return $meta ;
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* Some postmeta stuff .
*
* @ since unknown
*
* @ 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 }}
*
* @ since unknown
*
* @ param unknown_type $meta_id
2010-02-28 08:12:05 +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 ) {
2007-05-25 09:16:21 +02:00
global $wpdb ;
2007-06-18 18:28:11 +02:00
2007-06-20 00:42:25 +02:00
$protected = array ( '_wp_attached_file' , '_wp_attachment_metadata' , '_wp_old_slug' , '_wp_page_template' );
2007-06-18 18:28:11 +02:00
2010-02-28 08:12:05 +01:00
$meta_key = stripslashes ( $meta_key );
2008-05-22 02:01:00 +02:00
if ( in_array ( $meta_key , $protected ) )
2007-06-18 18:28:11 +02:00
return false ;
2009-04-16 23:55:35 +02:00
if ( '' === trim ( $meta_value ) )
return false ;
2008-05-22 02:01:00 +02:00
$post_id = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT post_id FROM $wpdb->postmeta WHERE meta_id = %d " , $meta_id ) );
2007-10-12 23:12:34 +02:00
2009-12-08 01:48:39 +01:00
$meta_value = maybe_serialize ( stripslashes_deep ( $meta_value ) );
2008-05-22 02:01:00 +02:00
$meta_id = ( int ) $meta_id ;
2008-08-09 07:36:14 +02:00
2008-05-22 02:01:00 +02:00
$data = compact ( 'meta_key' , 'meta_value' );
$where = compact ( 'meta_id' );
2009-09-24 19:10:28 +02:00
do_action ( 'update_postmeta' , $meta_id , $post_id , $meta_key , $meta_value );
$rval = $wpdb -> update ( $wpdb -> postmeta , $data , $where );
2009-12-11 17:44:41 +01:00
wp_cache_delete ( $post_id , 'post_meta' );
2009-09-24 19:10:28 +02:00
do_action ( 'updated_postmeta' , $meta_id , $post_id , $meta_key , $meta_value );
return $rval ;
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 .
*
* @ since unknown
* @ access private
*
* @ param unknown_type $post_ID
* @ return unknown
*/
2007-05-25 09:16:21 +02:00
function _fix_attachment_links ( $post_ID ) {
2009-11-17 20:25:01 +01:00
global $_fix_attachment_link_id ;
2007-05-25 09:16:21 +02:00
$post = & get_post ( $post_ID , ARRAY_A );
$search = " #<a[^>]+rel=('| \" )[^' \" ]*attachment[^>]*>#ie " ;
// See if we have any rel="attachment" links
if ( 0 == preg_match_all ( $search , $post [ 'post_content' ], $anchor_matches , PREG_PATTERN_ORDER ) )
return ;
$i = 0 ;
$search = " #[ \ s]+rel=( \" |')(.*?)wp-att-( \ d+) \\ 1#i " ;
foreach ( $anchor_matches [ 0 ] as $anchor ) {
if ( 0 == preg_match ( $search , $anchor , $id_matches ) )
continue ;
$id = ( int ) $id_matches [ 3 ];
// While we have the attachment ID, let's adopt any orphans.
$attachment = & get_post ( $id , ARRAY_A );
if ( ! empty ( $attachment ) && ! is_object ( get_post ( $attachment [ 'post_parent' ] ) ) ) {
$attachment [ 'post_parent' ] = $post_ID ;
// Escape data pulled from DB.
2009-12-22 13:25:15 +01:00
$attachment = add_magic_quotes ( $attachment );
wp_update_post ( $attachment );
2007-05-25 09:16:21 +02:00
}
$post_search [ $i ] = $anchor ;
2009-11-17 20:25:01 +01:00
$_fix_attachment_link_id = $id ;
$post_replace [ $i ] = preg_replace_callback ( " #href=( \" |')[^' \" ]* \\ 1# " , '_fix_attachment_links_replace_cb' , $anchor );
2007-05-25 09:16:21 +02:00
++ $i ;
}
$post [ 'post_content' ] = str_replace ( $post_search , $post_replace , $post [ 'post_content' ] );
// Escape data pulled from DB.
$post = add_magic_quotes ( $post );
return wp_update_post ( $post );
}
2009-11-17 20:25:01 +01:00
function _fix_attachment_links_replace_cb ( $match ) {
global $_fix_attachment_link_id ;
2009-11-20 20:46:10 +01:00
return stripslashes ( 'href=' . $match [ 1 ] ) . get_attachment_link ( $_fix_attachment_link_id ) . stripslashes ( $match [ 1 ] );
2009-11-17 20:25:01 +01:00
}
2008-10-02 03:03:26 +02:00
/**
* Move child posts to a new parent .
*
* @ since unknown
* @ 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
2008-08-14 19:00:37 +02:00
if ( isset ( $q [ 'post_status' ]) && 'pending' === $q [ 'post_status' ] ) {
2007-10-10 00:49:42 +02:00
$order = 'ASC' ;
$orderby = 'modified' ;
2008-08-14 19:00:37 +02:00
} elseif ( isset ( $q [ 'post_status' ]) && 'draft' === $q [ 'post_status' ] ) {
2007-10-10 00:49:42 +02:00
$order = 'DESC' ;
$orderby = 'modified' ;
} else {
$order = 'DESC' ;
$orderby = 'date' ;
}
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 )
2009-03-27 23:47:47 +01:00
$posts_per_page = 15 ;
2010-01-15 17:58:36 +01:00
$posts_per_page = apply_filters ( $per_page , $posts_per_page );
$query = compact ( 'post_type' , 'post_status' , 'perm' , 'order' , 'orderby' , 'posts_per_page' );
// Hierarchical types require special args.
2010-04-18 17:54:45 +02:00
if ( is_post_type_hierarchical ( $post_type ) ) {
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-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
}
2009-10-26 18:56:28 +01:00
/**
* 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 );
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ 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
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
* @ param unknown_type $q
* @ return unknown
*/
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' ;
2009-09-13 19:58:55 +02:00
$q [ 'post_status' ] = isset ( $q [ 'status' ] ) && 'trash' == $q [ 'status' ] ? 'trash' : 'inherit' ;
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' ]);
wp ( $q );
return array ( $post_mime_types , $avail_post_mime_types );
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
2009-12-22 13:25:15 +01:00
* @ uses get_user_option ()
2008-10-02 03:03:26 +02:00
* @ since unknown
*
* @ param unknown_type $id
* @ param unknown_type $page
* @ return unknown
*/
2008-02-08 20:57:50 +01:00
function postbox_classes ( $id , $page ) {
2008-10-09 01:32:34 +02:00
if ( isset ( $_GET [ 'edit' ] ) && $_GET [ 'edit' ] == $id )
return '' ;
2010-02-20 03:01:46 +01:00
2010-01-07 01:01:52 +01:00
if ( $closed = get_user_option ( 'closedpostboxes_' . $page ) ) {
2009-12-22 13:25:15 +01:00
if ( ! is_array ( $closed ) ) {
return '' ;
}
2008-12-27 13:18:38 +01:00
return in_array ( $id , $closed ) ? 'closed' : '' ;
2008-01-14 01:20:52 +01:00
} else {
2008-10-31 21:59:22 +01:00
return '' ;
2008-01-14 01:20:52 +01:00
}
2008-01-09 18:46:13 +01:00
}
2008-10-02 03:03:26 +02:00
/**
* { @ internal Missing Short Description }}
*
* @ since unknown
*
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 ) {
2008-01-17 17:51:32 +01: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 );
if ( ! empty ( $uri ) )
2010-03-28 07:23:49 +02:00
$uri .= '/' ;
2008-03-02 23:15:30 +01:00
$permalink = str_replace ( '%pagename%' , " ${ uri } %pagename% " , $permalink );
}
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
/**
2009-11-26 12:29:54 +01:00
* sample permalink html
2008-10-02 03:03:26 +02:00
*
2009-11-26 12:29:54 +01:00
* intended to be used for the inplace editor of the permalink post slug on in the post ( and page ? ) editor .
2010-01-15 23:11:12 +01:00
*
2008-10-02 03:03:26 +02:00
* @ since unknown
*
2010-01-15 23:11:12 +01:00
* @ 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 .
2008-10-02 03:03:26 +02:00
*/
2009-02-08 14:38:02 +01:00
function get_sample_permalink_html ( $id , $new_title = null , $new_slug = null ) {
2010-05-04 20:18:35 +02:00
global $wpdb ;
2008-01-17 17:51:32 +01:00
$post = & get_post ( $id );
2010-05-04 20:18:35 +02:00
$orig_permalink = sanitize_title ( $post -> post_title );
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
if ( 'publish' == $post -> post_status ) {
2010-03-28 07:23:49 +02:00
if ( 'post' == $post -> post_type ) {
$view_post = __ ( 'View Post' );
} elseif ( 'page' == $post -> post_type ) {
$view_post = __ ( 'View Page' );
} else {
$ptype = get_post_type_object ( $post -> post_type );
$view_post = sprintf ( __ ( 'View %s' ), $ptype -> singular_label );
}
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%' ) ) {
$return = '<strong>' . __ ( 'Permalink:' ) . " </strong> \n " . '<span id="sample-permalink">' . $permalink . " </span> \n " ;
2009-09-10 03:21:03 +02:00
if ( current_user_can ( 'manage_options' ) && ! ( 'page' == get_option ( 'show_on_front' ) && $id == get_option ( 'page_on_front' ) ) )
2009-06-08 23:42:35 +02:00
$return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button" target="_blank">' . __ ( 'Change Permalinks' ) . " </a></span> \n " ;
2009-01-29 13:11:52 +01:00
if ( isset ( $view_post ) )
$return .= " <span id='view-post-btn'><a href=' $permalink ' class='button' target='_blank'> $view_post </a></span> \n " ;
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
2010-05-04 20:18:35 +02:00
if ( $orig_permalink != $post_name_abridged && ! $post -> post_name ) {
//check if post is trashed
$orig_ID = $wpdb -> get_var ( $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_status='trash'; " , $orig_permalink ));
if ( $orig_ID ) {
?>
< div id = " message " class = " error " >
< ? php _e ( 'There was a permalink conflict with an item in the trash. <a href="edit.php?post_status=trash&post_type=' . $post -> post_type . '">View Trash</a>' ); ?>
</ div >
< ? php
}
}
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 );
2010-02-04 17:45:55 +01:00
$return = '<strong>' . __ ( 'Permalink:' ) . " </strong> \n " ;
$return .= '<span id="sample-permalink">' . $display_link . " </span> \n " ;
$return .= '‎' ; // Fix bi-directional text display defect in RTL languages.
2009-10-13 12:02:42 +02:00
$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 " ;
2009-03-10 03:14:42 +01:00
$return .= '<span id="editable-post-name-full">' . $post_name . " </span> \n " ;
2009-01-29 13:11:52 +01:00
if ( isset ( $view_post ) )
$return .= " <span id='view-post-btn'><a href=' $view_link ' class='button' target='_blank'> $view_post </a></span> \n " ;
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
* @ return string html
*/
2009-12-10 07:14:36 +01:00
function _wp_post_thumbnail_html ( $thumbnail_id = NULL ) {
2009-12-08 22:08:19 +01:00
global $content_width , $_wp_additional_image_sizes ;
2010-04-06 13:20:47 +02:00
2010-04-16 23:45:16 +02:00
$set_thumbnail_link = '<p class="hide-if-no-js"><a title="' . esc_attr__ ( 'Set featured image' ) . '" href="' . get_upload_iframe_src ( 'image' ) . '" id="set-post-thumbnail" class="thickbox">%s</a></p>' ;
2010-04-06 13:20:47 +02:00
$content = sprintf ( $set_thumbnail_link , 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 ) ) {
2010-04-06 13:20:47 +02:00
$content = sprintf ( $set_thumbnail_link , $thumbnail_html );
2010-04-02 08:12:49 +02:00
$content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail" onclick="WPRemoveThumbnail();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
}
2009-12-10 07:14:36 +01:00
return apply_filters ( 'admin_post_thumbnail_html' , $content );
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 ) {
global $current_user ;
if ( ! $post = get_post ( $post_id ) )
return false ;
$lock = get_post_meta ( $post -> ID , '_edit_lock' , true );
$last = get_post_meta ( $post -> ID , '_edit_last' , true );
2008-03-06 07:07:53 +01:00
$time_window = apply_filters ( 'wp_check_post_lock_window' , AUTOSAVE_INTERVAL * 2 );
2008-02-29 10:51:36 +01:00
if ( $lock && $lock > time () - $time_window && $last != $current_user -> ID )
return $last ;
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
* @ return bool Returns false if the post doesn ' t exist of there is no current user
2008-10-02 03:03:26 +02:00
*/
2008-02-29 10:51:36 +01:00
function wp_set_post_lock ( $post_id ) {
global $current_user ;
if ( ! $post = get_post ( $post_id ) )
return false ;
if ( ! $current_user || ! $current_user -> ID )
return false ;
2008-03-02 21:17:30 +01:00
2008-02-29 10:51:36 +01:00
$now = time ();
2010-05-03 22:26:11 +02:00
update_post_meta ( $post -> ID , '_edit_lock' , $now );
2008-02-29 10:51:36 +01:00
}
2009-09-13 10:52:39 +02:00
/**
* Outputs the notice message to say that someone else is editing this post at the moment .
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 () {
global $post ;
$last_user = get_userdata ( get_post_meta ( $post -> ID , '_edit_last' , true ) );
$last_user_name = $last_user ? $last_user -> display_name : __ ( 'Somebody' );
2009-09-14 16:03:32 +02:00
2009-09-13 23:18:55 +02:00
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.' );
}
2009-09-14 16:03:32 +02:00
2009-09-13 23:18:55 +02:00
$message = sprintf ( $message , esc_html ( $last_user_name ) );
2009-09-14 16:03:32 +02:00
echo " <div class='error'><p> $message </p></div> " ;
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 ;
// Only store one autosave. If there is already an autosave, overwrite it.
2008-05-30 00:21:36 +02:00
if ( $old_autosave = wp_get_post_autosave ( $post_id ) ) {
$new_autosave = _wp_post_revision_fields ( $_POST , true );
2008-05-08 19:25:07 +02:00
$new_autosave [ 'ID' ] = $old_autosave -> ID ;
2009-08-19 04:30:42 +02:00
$current_user = wp_get_current_user ();
$new_autosave [ 'post_author' ] = $current_user -> ID ;
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.
$_POST = stripslashes_deep ( $_POST );
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
*
2008-10-31 23:47:07 +01:00
* @ uses wp_write_post ()
* @ uses edit_post ()
* @ uses get_post ()
* @ uses current_user_can ()
* @ uses wp_create_post_autosave ()
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' ];
if ( $post_ID < 1 )
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
2008-11-02 14:56:32 +01:00
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 ) )
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 () );
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 ) );
}
return $url ;
2008-10-31 23:47:07 +01:00
}
/**
* Adds the TinyMCE editor used on the Write and Edit screens .
2008-12-09 19:03:31 +01:00
*
2008-08-20 23:42:31 +02:00
* @ package WordPress
2009-12-22 13:25:15 +01:00
* @ since 2.7 . 0
2009-05-18 22:29:26 +02:00
*
* TinyMCE is loaded separately from other Javascript by using wp - tinymce . php . It outputs concatenated
* and optionaly pre - compressed version of the core and all default plugins . Additional plugins are loaded
* directly by TinyMCE using non - blocking method . Custom plugins can be refreshed by adding a query string
* to the URL when queueing them with the mce_external_plugins filter .
*
* @ param bool $teeny optional Output a trimmed down version used in Press This .
2009-09-29 11:46:13 +02:00
* @ param mixed $settings optional An array that can add to or overwrite the default TinyMCE settings .
2008-08-20 23:42:31 +02:00
*/
2009-09-29 11:46:13 +02:00
function wp_tiny_mce ( $teeny = false , $settings = false ) {
2010-02-27 08:36:35 +01:00
global $concatenate_scripts , $compress_scripts , $tinymce_version , $editor_styles ;
2009-03-18 03:43:45 +01:00
2008-10-02 18:30:14 +02:00
if ( ! user_can_richedit () )
2008-08-20 23:42:31 +02:00
return ;
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
$baseurl = includes_url ( 'js/tinymce' );
$mce_locale = ( '' == get_locale () ) ? 'en' : strtolower ( substr ( get_locale (), 0 , 2 ) ); // only ISO 639-1
2008-08-20 23:42:31 +02:00
2008-10-02 18:30:14 +02:00
/*
The following filter allows localization scripts to change the languages displayed in the spellchecker ' s drop - down menu .
By default it uses Google ' s spellchecker API , but can be configured to use PSpell / ASpell if installed on the server .
The + sign marks the default language . More information :
http :// wiki . moxiecode . com / index . php / TinyMCE : Plugins / spellchecker
*/
$mce_spellchecker_languages = apply_filters ( 'mce_spellchecker_languages' , '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv' );
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
if ( $teeny ) {
2009-09-29 11:46:13 +02:00
$plugins = apply_filters ( 'teeny_mce_plugins' , array ( 'safari' , 'inlinepopups' , 'media' , 'fullscreen' , 'wordpress' ) );
2008-10-02 18:30:14 +02:00
$ext_plugins = '' ;
} else {
2009-05-23 00:08:17 +02:00
$plugins = array ( 'safari' , 'inlinepopups' , 'spellchecker' , 'paste' , 'wordpress' , 'media' , 'fullscreen' , 'wpeditimage' , 'wpgallery' , 'tabfocus' );
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
/*
The following filter takes an associative array of external plugins for TinyMCE in the form 'plugin_name' => 'url' .
It adds the plugin 's name to TinyMCE' s plugins init and the call to PluginManager to load the plugin .
The url should be absolute and should include the js file name to be loaded . Example :
array ( 'myplugin' => 'http://my-site.com/wp-content/plugins/myfolder/mce_plugin.js' )
If the plugin uses a button , it should be added with one of the " $mce_buttons " filters .
*/
$mce_external_plugins = apply_filters ( 'mce_external_plugins' , array ());
2008-11-02 03:12:26 +01:00
2009-01-16 13:58:38 +01:00
$ext_plugins = '' ;
2008-10-02 18:30:14 +02:00
if ( ! empty ( $mce_external_plugins ) ) {
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
/*
The following filter loads external language files for TinyMCE plugins .
It takes an associative array 'plugin_name' => 'path' , where path is the
include path to the file . The language file should follow the same format as
/ tinymce / langs / wp - langs . php and should define a variable $strings that
2008-10-26 08:32:58 +01:00
holds all translated strings .
When this filter is not used , the function will try to load { mce_locale } . js .
If that is not found , en . js will be tried next .
2008-10-02 18:30:14 +02:00
*/
$mce_external_languages = apply_filters ( 'mce_external_languages' , array ());
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
$loaded_langs = array ();
$strings = '' ;
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
if ( ! empty ( $mce_external_languages ) ) {
foreach ( $mce_external_languages as $name => $path ) {
2008-12-14 02:12:00 +01:00
if ( @ is_file ( $path ) && @ is_readable ( $path ) ) {
2008-10-02 18:30:14 +02:00
include_once ( $path );
2008-12-14 02:12:00 +01:00
$ext_plugins .= $strings . " \n " ;
2008-10-02 18:30:14 +02:00
$loaded_langs [] = $name ;
}
}
}
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
foreach ( $mce_external_plugins as $name => $url ) {
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
if ( is_ssl () ) $url = str_replace ( 'http://' , 'https://' , $url );
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
$plugins [] = '-' . $name ;
2008-11-02 03:12:26 +01:00
2008-10-26 08:32:58 +01:00
$plugurl = dirname ( $url );
2008-11-02 03:12:26 +01:00
$strings = $str1 = $str2 = '' ;
2008-10-26 08:32:58 +01:00
if ( ! in_array ( $name , $loaded_langs ) ) {
2008-11-03 19:21:00 +01:00
$path = str_replace ( WP_PLUGIN_URL , '' , $plugurl );
2008-11-02 03:12:26 +01:00
$path = WP_PLUGIN_DIR . $path . '/langs/' ;
2008-10-26 08:32:58 +01:00
if ( function_exists ( 'realpath' ) )
2008-11-03 20:16:29 +01:00
$path = trailingslashit ( realpath ( $path ) );
2008-10-26 08:32:58 +01:00
2008-12-14 02:12:00 +01:00
if ( @ is_file ( $path . $mce_locale . '.js' ) )
$strings .= @ file_get_contents ( $path . $mce_locale . '.js' ) . " \n " ;
2008-10-26 08:32:58 +01:00
2008-12-14 02:12:00 +01:00
if ( @ is_file ( $path . $mce_locale . '_dlg.js' ) )
$strings .= @ file_get_contents ( $path . $mce_locale . '_dlg.js' ) . " \n " ;
2008-11-02 03:12:26 +01:00
if ( 'en' != $mce_locale && empty ( $strings ) ) {
2008-12-14 02:12:00 +01:00
if ( @ is_file ( $path . 'en.js' ) ) {
2008-11-02 03:12:26 +01:00
$str1 = @ file_get_contents ( $path . 'en.js' );
2008-12-14 02:12:00 +01:00
$strings .= preg_replace ( '/([\'"])en\./' , '$1' . $mce_locale . '.' , $str1 , 1 ) . " \n " ;
2008-11-02 03:12:26 +01:00
}
2008-12-14 02:12:00 +01:00
if ( @ is_file ( $path . 'en_dlg.js' ) ) {
2008-11-02 03:12:26 +01:00
$str2 = @ file_get_contents ( $path . 'en_dlg.js' );
2008-12-14 02:12:00 +01:00
$strings .= preg_replace ( '/([\'"])en\./' , '$1' . $mce_locale . '.' , $str2 , 1 ) . " \n " ;
2008-11-02 03:12:26 +01:00
}
2008-10-26 08:32:58 +01:00
}
2008-11-02 03:12:26 +01:00
if ( ! empty ( $strings ) )
2008-10-26 08:32:58 +01:00
$ext_plugins .= " \n " . $strings . " \n " ;
2008-10-02 18:30:14 +02:00
}
2008-10-26 08:32:58 +01:00
$ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . " \n " ;
2008-10-02 18:30:14 +02:00
$ext_plugins .= 'tinymce.PluginManager.load("' . $name . '", "' . $url . '");' . " \n " ;
}
}
}
2008-10-26 08:32:58 +01:00
2008-10-02 18:30:14 +02:00
$plugins = implode ( $plugins , ',' );
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
if ( $teeny ) {
$mce_buttons = apply_filters ( 'teeny_mce_buttons' , array ( 'bold, italic, underline, blockquote, separator, strikethrough, bullist, numlist,justifyleft, justifycenter, justifyright, undo, redo, link, unlink, fullscreen' ) );
$mce_buttons = implode ( $mce_buttons , ',' );
$mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = '' ;
} else {
$mce_buttons = apply_filters ( 'mce_buttons' , array ( 'bold' , 'italic' , 'strikethrough' , '|' , 'bullist' , 'numlist' , 'blockquote' , '|' , 'justifyleft' , 'justifycenter' , 'justifyright' , '|' , 'link' , 'unlink' , 'wp_more' , '|' , 'spellchecker' , 'fullscreen' , 'wp_adv' ));
$mce_buttons = implode ( $mce_buttons , ',' );
2008-11-02 03:12:26 +01:00
2010-02-04 21:00:18 +01:00
$mce_buttons_2 = array ( 'formatselect' , 'underline' , 'justifyfull' , 'forecolor' , '|' , 'pastetext' , 'pasteword' , 'removeformat' , '|' , 'media' , 'charmap' , '|' , 'outdent' , 'indent' , '|' , 'undo' , 'redo' , 'wp_help' );
if ( is_multisite () )
unset ( $mce_buttons_2 [ array_search ( 'media' , $mce_buttons_2 ) ] );
$mce_buttons_2 = apply_filters ( 'mce_buttons_2' , $mce_buttons_2 );
2008-10-02 18:30:14 +02:00
$mce_buttons_2 = implode ( $mce_buttons_2 , ',' );
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
$mce_buttons_3 = apply_filters ( 'mce_buttons_3' , array ());
$mce_buttons_3 = implode ( $mce_buttons_3 , ',' );
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
$mce_buttons_4 = apply_filters ( 'mce_buttons_4' , array ());
$mce_buttons_4 = implode ( $mce_buttons_4 , ',' );
}
2010-03-19 22:15:00 +01:00
$no_captions = ( bool ) apply_filters ( 'disable_captions' , '' );
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
// TinyMCE init settings
$initArray = array (
2009-05-04 12:34:50 +02:00
'mode' => 'specific_textareas' ,
'editor_selector' => 'theEditor' ,
2008-10-02 18:30:14 +02:00
'width' => '100%' ,
'theme' => 'advanced' ,
'skin' => 'wp_theme' ,
2009-12-23 16:16:53 +01:00
'theme_advanced_buttons1' => $mce_buttons ,
'theme_advanced_buttons2' => $mce_buttons_2 ,
'theme_advanced_buttons3' => $mce_buttons_3 ,
'theme_advanced_buttons4' => $mce_buttons_4 ,
'language' => $mce_locale ,
'spellchecker_languages' => $mce_spellchecker_languages ,
2008-10-02 18:30:14 +02:00
'theme_advanced_toolbar_location' => 'top' ,
'theme_advanced_toolbar_align' => 'left' ,
'theme_advanced_statusbar_location' => 'bottom' ,
'theme_advanced_resizing' => true ,
'theme_advanced_resize_horizontal' => false ,
'dialog_type' => 'modal' ,
'relative_urls' => false ,
'remove_script_host' => false ,
'convert_urls' => false ,
'apply_source_formatting' => false ,
'remove_linebreaks' => true ,
'gecko_spellcheck' => true ,
'entities' => '38,amp,60,lt,62,gt' ,
2008-10-28 11:59:26 +01:00
'accessibility_focus' => true ,
2009-03-15 17:55:49 +01:00
'tabfocus_elements' => 'major-publishing-actions' ,
'media_strict' => false ,
2009-09-26 10:33:16 +02:00
'paste_remove_styles' => true ,
'paste_remove_spans' => true ,
'paste_strip_class_attributes' => 'all' ,
2008-10-02 18:30:14 +02:00
'wpeditimage_disable_captions' => $no_captions ,
2009-12-23 16:16:53 +01:00
'plugins' => $plugins
2008-08-20 23:42:31 +02:00
);
2008-11-02 03:12:26 +01:00
2010-02-27 08:36:35 +01:00
if ( ! empty ( $editor_styles ) && is_array ( $editor_styles ) ) {
$mce_css = array ();
$style_uri = get_stylesheet_directory_uri ();
if ( TEMPLATEPATH == STYLESHEETPATH ) {
foreach ( $editor_styles as $file )
$mce_css [] = " $style_uri / $file " ;
} else {
$style_dir = get_stylesheet_directory ();
$template_uri = get_template_directory_uri ();
$template_dir = get_template_directory ();
foreach ( $editor_styles as $file ) {
if ( file_exists ( " $style_dir / $file " ) )
$mce_css [] = " $style_uri / $file " ;
if ( file_exists ( " $template_dir / $file " ) )
$mce_css [] = " $template_uri / $file " ;
}
}
$mce_css = implode ( ',' , $mce_css );
} else {
$mce_css = '' ;
}
$mce_css = trim ( apply_filters ( 'mce_css' , $mce_css ), ' ,' );
2009-01-09 14:05:16 +01:00
if ( ! empty ( $mce_css ) )
2009-12-23 16:16:53 +01:00
$initArray [ 'content_css' ] = $mce_css ;
2009-01-09 14:05:16 +01:00
2009-09-29 11:46:13 +02:00
if ( is_array ( $settings ) )
$initArray = array_merge ( $initArray , $settings );
2008-10-02 18:30:14 +02:00
// For people who really REALLY know what they're doing with TinyMCE
// You can modify initArray to add, remove, change elements of the config before tinyMCE.init
// Setting "valid_elements", "invalid_elements" and "extended_valid_elements" can be done through "tiny_mce_before_init".
// Best is to use the default cleanup by not specifying valid_elements, as TinyMCE contains full set of XHTML 1.0.
if ( $teeny ) {
$initArray = apply_filters ( 'teeny_mce_before_init' , $initArray );
} else {
$initArray = apply_filters ( 'tiny_mce_before_init' , $initArray );
}
2009-06-04 01:00:57 +02:00
if ( empty ( $initArray [ 'theme_advanced_buttons3' ]) && ! empty ( $initArray [ 'theme_advanced_buttons4' ]) ) {
$initArray [ 'theme_advanced_buttons3' ] = $initArray [ 'theme_advanced_buttons4' ];
$initArray [ 'theme_advanced_buttons4' ] = '' ;
}
2009-01-16 13:58:38 +01:00
if ( ! isset ( $concatenate_scripts ) )
script_concat_settings ();
2008-10-02 18:30:14 +02:00
2009-01-16 13:58:38 +01:00
$language = $initArray [ 'language' ];
$zip = $compress_scripts ? 1 : 0 ;
2009-05-25 01:47:49 +02:00
2009-05-18 22:29:26 +02:00
/**
* Deprecated
2009-05-25 01:47:49 +02:00
*
2009-05-18 22:29:26 +02:00
* The tiny_mce_version filter is not needed since external plugins are loaded directly by TinyMCE .
* These plugins can be refreshed by appending query string to the URL passed to mce_external_plugins filter .
2009-05-25 01:47:49 +02:00
* If the plugin has a popup dialog , a query string can be added to the button action that opens it ( in the plugin ' s code ) .
2009-05-18 22:29:26 +02:00
*/
$version = apply_filters ( 'tiny_mce_version' , '' );
$version = 'ver=' . $tinymce_version . $version ;
2008-08-20 23:42:31 +02:00
2008-10-02 18:30:14 +02:00
if ( 'en' != $language )
include_once ( ABSPATH . WPINC . '/js/tinymce/langs/wp-langs.php' );
$mce_options = '' ;
foreach ( $initArray as $k => $v )
$mce_options .= $k . ':"' . $v . '", ' ;
2008-11-02 03:12:26 +01:00
2008-10-02 18:30:14 +02:00
$mce_options = rtrim ( trim ( $mce_options ), '\n\r,' ); ?>
2008-08-20 23:42:31 +02:00
< script type = " text/javascript " >
2008-11-01 06:03:05 +01:00
/* <![CDATA[ */
2008-10-02 18:30:14 +02:00
tinyMCEPreInit = {
base : " <?php echo $baseurl ; ?> " ,
suffix : " " ,
2009-05-18 22:29:26 +02:00
query : " <?php echo $version ; ?> " ,
2008-10-02 18:30:14 +02:00
mceInit : { < ? php echo $mce_options ; ?> },
2009-01-16 13:58:38 +01:00
load_ext : function ( url , lang ){ var sl = tinymce . ScriptLoader ; sl . markDone ( url + '/langs/' + lang + '.js' ); sl . markDone ( url + '/langs/' + lang + '_dlg.js' );}
2008-10-02 18:30:14 +02:00
};
2008-11-01 06:03:05 +01:00
/* ]]> */
2008-10-02 18:30:14 +02:00
</ script >
2009-01-16 13:58:38 +01:00
< ? php
2009-01-20 21:31:31 +01:00
if ( $concatenate_scripts )
2009-05-18 22:29:26 +02:00
echo " <script type='text/javascript' src=' $baseurl /wp-tinymce.php?c= $zip & $version '></script> \n " ;
2009-01-20 21:31:31 +01:00
else
2009-05-18 22:29:26 +02:00
echo " <script type='text/javascript' src=' $baseurl /tiny_mce.js? $version '></script> \n " ;
2009-01-16 13:58:38 +01:00
2009-01-20 21:31:31 +01:00
if ( 'en' != $language && isset ( $lang ) )
echo " <script type='text/javascript'> \n $lang\n </script> \n " ;
else
2009-05-18 22:29:26 +02:00
echo " <script type='text/javascript' src=' $baseurl /langs/wp-langs-en.js? $version '></script> \n " ;
2009-01-16 13:58:38 +01:00
?>
2008-10-02 18:30:14 +02:00
< script type = " text/javascript " >
2009-05-17 22:19:51 +02:00
/* <![CDATA[ */
2009-01-20 21:31:31 +01:00
< ? php if ( $ext_plugins ) echo " $ext_plugins\n " ; ?>
2009-01-16 13:58:38 +01:00
< ? php if ( $concatenate_scripts ) { ?>
2008-10-02 18:30:14 +02:00
tinyMCEPreInit . go ();
2009-01-16 13:58:38 +01:00
< ? php } else { ?>
( function (){ var t = tinyMCEPreInit , sl = tinymce . ScriptLoader , ln = t . mceInit . language , th = t . mceInit . theme , pl = t . mceInit . plugins ; sl . markDone ( t . base + '/langs/' + ln + '.js' ); sl . markDone ( t . base + '/themes/' + th + '/langs/' + ln + '.js' ); sl . markDone ( t . base + '/themes/' + th + '/langs/' + ln + '_dlg.js' ); tinymce . each ( pl . split ( ',' ), function ( n ){ if ( n && n . charAt ( 0 ) != '-' ){ sl . markDone ( t . base + '/plugins/' + n + '/langs/' + ln + '.js' ); sl . markDone ( t . base + '/plugins/' + n + '/langs/' + ln + '_dlg.js' );}});})();
< ? php } ?>
2008-10-02 18:30:14 +02:00
tinyMCE . init ( tinyMCEPreInit . mceInit );
2009-05-17 22:19:51 +02:00
/* ]]> */
2008-08-20 23:42:31 +02:00
</ script >
< ? php
}