Wordpress 3.0
[autoinstalls/wordpress.git] / wp-admin / admin-ajax.php
1 <?php
2 /**
3  * WordPress AJAX Process Execution.
4  *
5  * @package WordPress
6  * @subpackage Administration
7  */
8
9 /**
10  * Executing AJAX process.
11  *
12  * @since unknown
13  */
14 define('DOING_AJAX', true);
15 define('WP_ADMIN', true);
16
17 require_once('../wp-load.php');
18
19 if ( ! isset( $_REQUEST['action'] ) )
20         die('-1');
21
22 require_once('./includes/admin.php');
23 @header('Content-Type: text/html; charset=' . get_option('blog_charset'));
24 send_nosniff_header();
25
26 do_action('admin_init');
27
28 if ( ! is_user_logged_in() ) {
29
30         if ( isset( $_POST['action'] ) && $_POST['action'] == 'autosave' ) {
31                 $id = isset($_POST['post_ID'])? (int) $_POST['post_ID'] : 0;
32
33                 if ( ! $id )
34                         die('-1');
35
36                 $message = sprintf( __('<strong>ALERT: You are logged out!</strong> Could not save draft. <a href="%s" target="_blank">Please log in again.</a>'), wp_login_url() );
37                 $x = new WP_Ajax_Response( array(
38                         'what' => 'autosave',
39                         'id' => $id,
40                         'data' => $message
41                 ) );
42                 $x->send();
43         }
44
45         if ( !empty( $_REQUEST['action'] ) )
46                 do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );
47
48         die('-1');
49 }
50
51 if ( isset( $_GET['action'] ) ) :
52 switch ( $action = $_GET['action'] ) :
53 case 'ajax-tag-search' :
54         if ( !current_user_can( 'edit_posts' ) )
55                 die('-1');
56
57         $s = $_GET['q']; // is this slashed already?
58
59         if ( isset($_GET['tax']) )
60                 $taxonomy = sanitize_title($_GET['tax']);
61         else
62                 die('0');
63
64         if ( false !== strpos( $s, ',' ) ) {
65                 $s = explode( ',', $s );
66                 $s = $s[count( $s ) - 1];
67         }
68         $s = trim( $s );
69         if ( strlen( $s ) < 2 )
70                 die; // require 2 chars for matching
71
72         $results = $wpdb->get_col( "SELECT t.name FROM $wpdb->term_taxonomy AS tt INNER JOIN $wpdb->terms AS t ON tt.term_id = t.term_id WHERE tt.taxonomy = '$taxonomy' AND t.name LIKE ('%" . $s . "%')" );
73
74         echo join( $results, "\n" );
75         die;
76         break;
77 case 'wp-compression-test' :
78         if ( !current_user_can( 'manage_options' ) )
79                 die('-1');
80
81         if ( ini_get('zlib.output_compression') || 'ob_gzhandler' == ini_get('output_handler') ) {
82                 update_site_option('can_compress_scripts', 0);
83                 die('0');
84         }
85
86         if ( isset($_GET['test']) ) {
87                 header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
88                 header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
89                 header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
90                 header( 'Pragma: no-cache' );
91                 header('Content-Type: application/x-javascript; charset=UTF-8');
92                 $force_gzip = ( defined('ENFORCE_GZIP') && ENFORCE_GZIP );
93                 $test_str = '"wpCompressionTest Lorem ipsum dolor sit amet consectetuer mollis sapien urna ut a. Eu nonummy condimentum fringilla tempor pretium platea vel nibh netus Maecenas. Hac molestie amet justo quis pellentesque est ultrices interdum nibh Morbi. Cras mattis pretium Phasellus ante ipsum ipsum ut sociis Suspendisse Lorem. Ante et non molestie. Porta urna Vestibulum egestas id congue nibh eu risus gravida sit. Ac augue auctor Ut et non a elit massa id sodales. Elit eu Nulla at nibh adipiscing mattis lacus mauris at tempus. Netus nibh quis suscipit nec feugiat eget sed lorem et urna. Pellentesque lacus at ut massa consectetuer ligula ut auctor semper Pellentesque. Ut metus massa nibh quam Curabitur molestie nec mauris congue. Volutpat molestie elit justo facilisis neque ac risus Ut nascetur tristique. Vitae sit lorem tellus et quis Phasellus lacus tincidunt nunc Fusce. Pharetra wisi Suspendisse mus sagittis libero lacinia Integer consequat ac Phasellus. Et urna ac cursus tortor aliquam Aliquam amet tellus volutpat Vestibulum. Justo interdum condimentum In augue congue tellus sollicitudin Quisque quis nibh."';
94
95                  if ( 1 == $_GET['test'] ) {
96                         echo $test_str;
97                         die;
98                  } elseif ( 2 == $_GET['test'] ) {
99                         if ( !isset($_SERVER['HTTP_ACCEPT_ENCODING']) )
100                                 die('-1');
101                         if ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && function_exists('gzdeflate') && ! $force_gzip ) {
102                                 header('Content-Encoding: deflate');
103                                 $out = gzdeflate( $test_str, 1 );
104                         } elseif ( false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode') ) {
105                                 header('Content-Encoding: gzip');
106                                 $out = gzencode( $test_str, 1 );
107                         } else {
108                                 die('-1');
109                         }
110                         echo $out;
111                         die;
112                 } elseif ( 'no' == $_GET['test'] ) {
113                         update_site_option('can_compress_scripts', 0);
114                 } elseif ( 'yes' == $_GET['test'] ) {
115                         update_site_option('can_compress_scripts', 1);
116                 }
117         }
118
119         die('0');
120         break;
121 case 'imgedit-preview' :
122         $post_id = intval($_GET['postid']);
123         if ( empty($post_id) || !current_user_can('edit_post', $post_id) )
124                 die('-1');
125
126         check_ajax_referer( "image_editor-$post_id" );
127
128         include_once( ABSPATH . 'wp-admin/includes/image-edit.php' );
129         if ( ! stream_preview_image($post_id) )
130                 die('-1');
131
132         die();
133         break;
134 case 'menu-quick-search':
135         if ( ! current_user_can( 'edit_theme_options' ) )
136                 die('-1');
137
138         require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
139
140         _wp_ajax_menu_quick_search( $_REQUEST );
141
142         exit;
143         break;
144 case 'oembed-cache' :
145         $return = ( $wp_embed->cache_oembed( $_GET['post'] ) ) ? '1' : '0';
146         die( $return );
147         break;
148 default :
149         do_action( 'wp_ajax_' . $_GET['action'] );
150         die('0');
151         break;
152 endswitch;
153 endif;
154
155 /**
156  * Sends back current comment total and new page links if they need to be updated.
157  *
158  * Contrary to normal success AJAX response ("1"), die with time() on success.
159  *
160  * @since 2.7
161  *
162  * @param int $comment_id
163  * @return die
164  */
165 function _wp_ajax_delete_comment_response( $comment_id ) {
166         $total = (int) @$_POST['_total'];
167         $per_page = (int) @$_POST['_per_page'];
168         $page = (int) @$_POST['_page'];
169         $url = esc_url_raw( @$_POST['_url'] );
170         // JS didn't send us everything we need to know. Just die with success message
171         if ( !$total || !$per_page || !$page || !$url )
172                 die( (string) time() );
173
174         if ( --$total < 0 ) // Take the total from POST and decrement it (since we just deleted one)
175                 $total = 0;
176
177         if ( 0 != $total % $per_page && 1 != mt_rand( 1, $per_page ) ) // Only do the expensive stuff on a page-break, and about 1 other time per page
178                 die( (string) time() );
179
180         $post_id = 0;
181         $status = 'total_comments'; // What type of comment count are we looking for?
182         $parsed = parse_url( $url );
183         if ( isset( $parsed['query'] ) ) {
184                 parse_str( $parsed['query'], $query_vars );
185                 if ( !empty( $query_vars['comment_status'] ) )
186                         $status = $query_vars['comment_status'];
187                 if ( !empty( $query_vars['p'] ) )
188                         $post_id = (int) $query_vars['p'];
189         }
190
191         $comment_count = wp_count_comments($post_id);
192         $time = time(); // The time since the last comment count
193
194         if ( isset( $comment_count->$status ) ) // We're looking for a known type of comment count
195                 $total = $comment_count->$status;
196         // else use the decremented value from above
197
198         $page_links = paginate_links( array(
199                 'base' => add_query_arg( 'apage', '%#%', $url ),
200                 'format' => '',
201                 'prev_text' => __('&laquo;'),
202                 'next_text' => __('&raquo;'),
203                 'total' => ceil($total / $per_page),
204                 'current' => $page
205         ) );
206         $x = new WP_Ajax_Response( array(
207                 'what' => 'comment',
208                 'id' => $comment_id, // here for completeness - not used
209                 'supplemental' => array(
210                         'pageLinks' => $page_links,
211                         'total' => $total,
212                         'time' => $time
213                 )
214         ) );
215         $x->send();
216 }
217
218 function _wp_ajax_add_hierarchical_term() {
219         $action = $_POST['action'];
220         $taxonomy = get_taxonomy(substr($action, 4));
221         check_ajax_referer( $action, '_ajax_nonce-add-' . $taxonomy->name );
222         if ( !current_user_can( $taxonomy->cap->edit_terms ) )
223                 die('-1');
224         $names = explode(',', $_POST['new'.$taxonomy->name]);
225         $parent = isset($_POST['new'.$taxonomy->name.'_parent']) ? (int) $_POST['new'.$taxonomy->name.'_parent'] : 0;
226         if ( 0 > $parent )
227                 $parent = 0;
228         if ( $taxonomy->name == 'category' )
229                 $post_category = isset($_POST['post_category']) ? (array) $_POST['post_category'] : array();
230         else
231                 $post_category = ( isset($_POST['tax_input']) && isset($_POST['tax_input'][$taxonomy->name]) ) ? (array) $_POST['tax_input'][$taxonomy->name] : array();
232         $checked_categories = array_map( 'absint', (array) $post_category );
233         $popular_ids = wp_popular_terms_checklist($taxonomy->name, 0, 10, false);
234
235         foreach ( $names as $cat_name ) {
236                 $cat_name = trim($cat_name);
237                 $category_nicename = sanitize_title($cat_name);
238                 if ( '' === $category_nicename )
239                         continue;
240                 if ( !($cat_id = term_exists($cat_name, $taxonomy->name, $parent)) ) {
241                         $new_term = wp_insert_term($cat_name, $taxonomy->name, array('parent' => $parent));
242                         $cat_id = $new_term['term_id'];
243                 }
244                 $checked_categories[] = $cat_id;
245                 if ( $parent ) // Do these all at once in a second
246                         continue;
247                 $category = get_term( $cat_id, $taxonomy->name );
248                 ob_start();
249                         wp_terms_checklist( 0, array( 'taxonomy' => $taxonomy->name, 'descendants_and_self' => $cat_id, 'selected_cats' => $checked_categories, 'popular_cats' => $popular_ids ));
250                 $data = ob_get_contents();
251                 ob_end_clean();
252                 $add = array(
253                         'what' => $taxonomy->name,
254                         'id' => $cat_id,
255                         'data' => str_replace( array("\n", "\t"), '', $data),
256                         'position' => -1
257                 );
258         }
259
260         if ( $parent ) { // Foncy - replace the parent and all its children
261                 $parent = get_term( $parent, $taxonomy->name );
262                 $term_id = $parent->term_id;
263
264                 while ( $parent->parent ) { // get the top parent
265                         $parent = &get_term( $parent->parent, $taxonomy->name );
266                         if ( is_wp_error( $parent ) )
267                                 break;
268                         $term_id = $parent->term_id;
269                 }
270
271                 ob_start();
272                         wp_terms_checklist( 0, array('taxonomy' => $taxonomy->name, 'descendants_and_self' => $term_id, 'selected_cats' => $checked_categories, 'popular_cats' => $popular_ids));
273                 $data = ob_get_contents();
274                 ob_end_clean();
275                 $add = array(
276                         'what' => $taxonomy->name,
277                         'id' => $term_id,
278                         'data' => str_replace( array("\n", "\t"), '', $data),
279                         'position' => -1
280                 );
281         }
282
283         ob_start();
284                 wp_dropdown_categories( array(
285                         'taxonomy' => $taxonomy->name, 'hide_empty' => 0, 'name' => 'new'.$taxonomy->name.'_parent', 'orderby' => 'name',
286                         'hierarchical' => 1, 'show_option_none' => '&mdash; '.$taxonomy->labels->parent_item.' &mdash;'
287                 ) );
288         $sup = ob_get_contents();
289         ob_end_clean();
290         $add['supplemental'] = array( 'newcat_parent' => $sup );
291
292         $x = new WP_Ajax_Response( $add );
293         $x->send();
294 }
295
296 $id = isset($_POST['id'])? (int) $_POST['id'] : 0;
297 switch ( $action = $_POST['action'] ) :
298 case 'delete-comment' : // On success, die with time() instead of 1
299         if ( !$comment = get_comment( $id ) )
300                 die( (string) time() );
301         if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) )
302                 die('-1');
303
304         check_ajax_referer( "delete-comment_$id" );
305         $status = wp_get_comment_status( $comment->comment_ID );
306
307         if ( isset($_POST['trash']) && 1 == $_POST['trash'] ) {
308                 if ( 'trash' == $status )
309                         die( (string) time() );
310                 $r = wp_trash_comment( $comment->comment_ID );
311         } elseif ( isset($_POST['untrash']) && 1 == $_POST['untrash'] ) {
312                 if ( 'trash' != $status )
313                         die( (string) time() );
314                 $r = wp_untrash_comment( $comment->comment_ID );
315         } elseif ( isset($_POST['spam']) && 1 == $_POST['spam'] ) {
316                 if ( 'spam' == $status )
317                         die( (string) time() );
318                 $r = wp_spam_comment( $comment->comment_ID );
319         } elseif ( isset($_POST['unspam']) && 1 == $_POST['unspam'] ) {
320                 if ( 'spam' != $status )
321                         die( (string) time() );
322                 $r = wp_unspam_comment( $comment->comment_ID );
323         } elseif ( isset($_POST['delete']) && 1 == $_POST['delete'] ) {
324                 $r = wp_delete_comment( $comment->comment_ID );
325         } else {
326                 die('-1');
327         }
328
329         if ( $r ) // Decide if we need to send back '1' or a more complicated response including page links and comment counts
330                 _wp_ajax_delete_comment_response( $comment->comment_ID );
331         die( '0' );
332         break;
333 case 'delete-tag' :
334         $tag_id = (int) $_POST['tag_ID'];
335         check_ajax_referer( "delete-tag_$tag_id" );
336
337         $taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag';
338         $tax = get_taxonomy($taxonomy);
339
340         if ( !current_user_can( $tax->cap->delete_terms ) )
341                 die('-1');
342
343         $tag = get_term( $tag_id, $taxonomy );
344         if ( !$tag || is_wp_error( $tag ) )
345                 die('1');
346
347         if ( wp_delete_term($tag_id, $taxonomy))
348                 die('1');
349         else
350                 die('0');
351         break;
352 case 'delete-link-cat' :
353         check_ajax_referer( "delete-link-category_$id" );
354         if ( !current_user_can( 'manage_categories' ) )
355                 die('-1');
356
357         $cat = get_term( $id, 'link_category' );
358         if ( !$cat || is_wp_error( $cat ) )
359                 die('1');
360
361         $cat_name = get_term_field('name', $id, 'link_category');
362
363         $default = get_option('default_link_category');
364
365         // Don't delete the default cats.
366         if ( $id == $default ) {
367                 $x = new WP_AJAX_Response( array(
368                         'what' => 'link-cat',
369                         'id' => $id,
370                         'data' => new WP_Error( 'default-link-cat', sprintf(__("Can&#8217;t delete the <strong>%s</strong> category: this is the default one"), $cat_name) )
371                 ) );
372                 $x->send();
373         }
374
375         $r = wp_delete_term($id, 'link_category', array('default' => $default));
376         if ( !$r )
377                 die('0');
378         if ( is_wp_error($r) ) {
379                 $x = new WP_AJAX_Response( array(
380                         'what' => 'link-cat',
381                         'id' => $id,
382                         'data' => $r
383                 ) );
384                 $x->send();
385         }
386         die('1');
387         break;
388 case 'delete-link' :
389         check_ajax_referer( "delete-bookmark_$id" );
390         if ( !current_user_can( 'manage_links' ) )
391                 die('-1');
392
393         $link = get_bookmark( $id );
394         if ( !$link || is_wp_error( $link ) )
395                 die('1');
396
397         if ( wp_delete_link( $id ) )
398                 die('1');
399         else
400                 die('0');
401         break;
402 case 'delete-meta' :
403         check_ajax_referer( "delete-meta_$id" );
404         if ( !$meta = get_post_meta_by_id( $id ) )
405                 die('1');
406
407         if ( !current_user_can( 'edit_post', $meta->post_id ) )
408                 die('-1');
409         if ( delete_meta( $meta->meta_id ) )
410                 die('1');
411         die('0');
412         break;
413 case 'delete-post' :
414         check_ajax_referer( "{$action}_$id" );
415         if ( !current_user_can( 'delete_post', $id ) )
416                 die('-1');
417
418         if ( !get_post( $id ) )
419                 die('1');
420
421         if ( wp_delete_post( $id ) )
422                 die('1');
423         else
424                 die('0');
425         break;
426 case 'trash-post' :
427 case 'untrash-post' :
428         check_ajax_referer( "{$action}_$id" );
429         if ( !current_user_can( 'delete_post', $id ) )
430                 die('-1');
431
432         if ( !get_post( $id ) )
433                 die('1');
434
435         if ( 'trash-post' == $action )
436                 $done = wp_trash_post( $id );
437         else
438                 $done = wp_untrash_post( $id );
439
440         if ( $done )
441                 die('1');
442
443         die('0');
444         break;
445 case 'delete-page' :
446         check_ajax_referer( "{$action}_$id" );
447         if ( !current_user_can( 'delete_page', $id ) )
448                 die('-1');
449
450         if ( !get_page( $id ) )
451                 die('1');
452
453         if ( wp_delete_post( $id ) )
454                 die('1');
455         else
456                 die('0');
457         break;
458 case 'dim-comment' : // On success, die with time() instead of 1
459
460         if ( !$comment = get_comment( $id ) ) {
461                 $x = new WP_Ajax_Response( array(
462                         'what' => 'comment',
463                         'id' => new WP_Error('invalid_comment', sprintf(__('Comment %d does not exist'), $id))
464                 ) );
465                 $x->send();
466         }
467
468         if ( !current_user_can( 'edit_post', $comment->comment_post_ID ) && !current_user_can( 'moderate_comments' ) )
469                 die('-1');
470
471         $current = wp_get_comment_status( $comment->comment_ID );
472         if ( $_POST['new'] == $current )
473                 die( (string) time() );
474
475         check_ajax_referer( "approve-comment_$id" );
476         if ( in_array( $current, array( 'unapproved', 'spam' ) ) )
477                 $result = wp_set_comment_status( $comment->comment_ID, 'approve', true );
478         else
479                 $result = wp_set_comment_status( $comment->comment_ID, 'hold', true );
480
481         if ( is_wp_error($result) ) {
482                 $x = new WP_Ajax_Response( array(
483                         'what' => 'comment',
484                         'id' => $result
485                 ) );
486                 $x->send();
487         }
488
489         // Decide if we need to send back '1' or a more complicated response including page links and comment counts
490         _wp_ajax_delete_comment_response( $comment->comment_ID );
491         die( '0' );
492         break;
493 case 'add-link-category' : // On the Fly
494         check_ajax_referer( $action );
495         if ( !current_user_can( 'manage_categories' ) )
496                 die('-1');
497         $names = explode(',', $_POST['newcat']);
498         $x = new WP_Ajax_Response();
499         foreach ( $names as $cat_name ) {
500                 $cat_name = trim($cat_name);
501                 $slug = sanitize_title($cat_name);
502                 if ( '' === $slug )
503                         continue;
504                 if ( !$cat_id = term_exists( $cat_name, 'link_category' ) ) {
505                         $cat_id = wp_insert_term( $cat_name, 'link_category' );
506                 }
507                 $cat_id = $cat_id['term_id'];
508                 $cat_name = esc_html(stripslashes($cat_name));
509                 $x->add( array(
510                         'what' => 'link-category',
511                         'id' => $cat_id,
512                         'data' => "<li id='link-category-$cat_id'><label for='in-link-category-$cat_id' class='selectit'><input value='" . esc_attr($cat_id) . "' type='checkbox' checked='checked' name='link_category[]' id='in-link-category-$cat_id'/> $cat_name</label></li>",
513                         'position' => -1
514                 ) );
515         }
516         $x->send();
517         break;
518 case 'add-link-cat' : // From Blogroll -> Categories
519         check_ajax_referer( 'add-link-category' );
520         if ( !current_user_can( 'manage_categories' ) )
521                 die('-1');
522
523         if ( '' === trim($_POST['name']) ) {
524                 $x = new WP_Ajax_Response( array(
525                         'what' => 'link-cat',
526                         'id' => new WP_Error( 'name', __('You did not enter a category name.') )
527                 ) );
528                 $x->send();
529         }
530
531         $r = wp_insert_term($_POST['name'], 'link_category', $_POST );
532         if ( is_wp_error( $r ) ) {
533                 $x = new WP_AJAX_Response( array(
534                         'what' => 'link-cat',
535                         'id' => $r
536                 ) );
537                 $x->send();
538         }
539
540         extract($r, EXTR_SKIP);
541
542         if ( !$link_cat = link_cat_row( $term_id ) )
543                 die('0');
544
545         $x = new WP_Ajax_Response( array(
546                 'what' => 'link-cat',
547                 'id' => $term_id,
548                 'position' => -1,
549                 'data' => $link_cat
550         ) );
551         $x->send();
552         break;
553 case 'add-tag' : // From Manage->Tags
554         check_ajax_referer( 'add-tag' );
555
556         $taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag';
557         $tax = get_taxonomy($taxonomy);
558
559         $x = new WP_Ajax_Response();
560
561         if ( !current_user_can( $tax->cap->edit_terms ) )
562                 die('-1');
563
564         $tag = wp_insert_term($_POST['tag-name'], $taxonomy, $_POST );
565
566         if ( !$tag || is_wp_error($tag) || (!$tag = get_term( $tag['term_id'], $taxonomy )) ) {
567                 $message = __('An error has occured. Please reload the page and try again.');
568                 if ( is_wp_error($tag) && $tag->get_error_message() )
569                         $message = $tag->get_error_message();
570
571                 $x->add( array(
572                         'what' => 'taxonomy',
573                         'data' => new WP_Error('error', $message )
574                 ) );
575                 $x->send();
576         }
577
578         if ( isset($_POST['screen']) )
579                 set_current_screen($_POST['screen']);
580
581         $level = 0;
582         $tag_full_name = false;
583         $tag_full_name = $tag->name;
584         if ( is_taxonomy_hierarchical($taxonomy) ) {
585                 $_tag = $tag;
586                 while ( $_tag->parent  ) {
587                         $_tag = get_term( $_tag->parent, $taxonomy );
588                         $tag_full_name = $_tag->name . ' &#8212; ' . $tag_full_name;
589                         $level++;
590                 }
591                 $noparents = _tag_row( $tag, $level, $taxonomy );
592         }
593         $tag->name = $tag_full_name;
594         $parents = _tag_row( $tag, 0, $taxonomy);
595
596         $x->add( array(
597                 'what' => 'taxonomy',
598                 'supplemental' => compact('parents', 'noparents')
599                 ) );
600         $x->add( array(
601                 'what' => 'term',
602                 'position' => $level,
603                 'supplemental' => get_term( $tag->term_id, $taxonomy, ARRAY_A ) //Refetch as $tag has been contaminated by the full name.
604                 ) );
605         $x->send();
606         break;
607 case 'get-tagcloud' :
608         if ( !current_user_can( 'edit_posts' ) )
609                 die('-1');
610
611         if ( isset($_POST['tax']) )
612                 $taxonomy = sanitize_title($_POST['tax']);
613         else
614                 die('0');
615
616         $tags = get_terms( $taxonomy, array( 'number' => 45, 'orderby' => 'count', 'order' => 'DESC' ) );
617
618         if ( empty( $tags ) ) {
619                 $tax = get_taxonomy( $taxonomy );
620                 die( isset( $tax->no_tagcloud ) ? $tax->no_tagcloud : __('No tags found!') );
621         }
622
623         if ( is_wp_error($tags) )
624                 die($tags->get_error_message());
625
626         foreach ( $tags as $key => $tag ) {
627                 $tags[ $key ]->link = '#';
628                 $tags[ $key ]->id = $tag->term_id;
629         }
630
631         // We need raw tag names here, so don't filter the output
632         $return = wp_generate_tag_cloud( $tags, array('filter' => 0) );
633
634         if ( empty($return) )
635                 die('0');
636
637         echo $return;
638
639         exit;
640         break;
641 case 'add-comment' :
642         check_ajax_referer( $action );
643         if ( !current_user_can( 'edit_posts' ) )
644                 die('-1');
645         $search = isset($_POST['s']) ? $_POST['s'] : false;
646         $status = isset($_POST['comment_status']) ? $_POST['comment_status'] : 'all';
647         $per_page = isset($_POST['per_page']) ?  (int) $_POST['per_page'] + 8 : 28;
648         $start = isset($_POST['page']) ? ( intval($_POST['page']) * $per_page ) -1 : $per_page - 1;
649         if ( 1 > $start )
650                 $start = 27;
651
652         $mode = isset($_POST['mode']) ? $_POST['mode'] : 'detail';
653         $p = isset($_POST['p']) ? $_POST['p'] : 0;
654         $comment_type = isset($_POST['comment_type']) ? $_POST['comment_type'] : '';
655         list($comments, $total) = _wp_get_comment_list( $status, $search, $start, 1, $p, $comment_type );
656
657         if ( get_option('show_avatars') )
658                 add_filter( 'comment_author', 'floated_admin_avatar' );
659
660         if ( !$comments )
661                 die('1');
662         $x = new WP_Ajax_Response();
663         foreach ( (array) $comments as $comment ) {
664                 get_comment( $comment );
665                 ob_start();
666                         _wp_comment_row( $comment->comment_ID, $mode, $status, true, true );
667                         $comment_list_item = ob_get_contents();
668                 ob_end_clean();
669                 $x->add( array(
670                         'what' => 'comment',
671                         'id' => $comment->comment_ID,
672                         'data' => $comment_list_item
673                 ) );
674         }
675         $x->send();
676         break;
677 case 'get-comments' :
678         check_ajax_referer( $action );
679
680         $post_ID = (int) $_POST['post_ID'];
681         if ( !current_user_can( 'edit_post', $post_ID ) )
682                 die('-1');
683
684         $start = isset($_POST['start']) ? intval($_POST['start']) : 0;
685         $num = isset($_POST['num']) ? intval($_POST['num']) : 10;
686
687         list($comments, $total) = _wp_get_comment_list( false, false, $start, $num, $post_ID );
688
689         if ( !$comments )
690                 die('1');
691
692         $comment_list_item = '';
693         $x = new WP_Ajax_Response();
694         foreach ( (array) $comments as $comment ) {
695                 get_comment( $comment );
696                 ob_start();
697                         _wp_comment_row( $comment->comment_ID, 'single', false, false );
698                         $comment_list_item .= ob_get_contents();
699                 ob_end_clean();
700         }
701         $x->add( array(
702                 'what' => 'comments',
703                 'data' => $comment_list_item
704         ) );
705         $x->send();
706         break;
707 case 'replyto-comment' :
708         check_ajax_referer( $action, '_ajax_nonce-replyto-comment' );
709
710         $comment_post_ID = (int) $_POST['comment_post_ID'];
711         if ( !current_user_can( 'edit_post', $comment_post_ID ) )
712                 die('-1');
713
714         $status = $wpdb->get_var( $wpdb->prepare("SELECT post_status FROM $wpdb->posts WHERE ID = %d", $comment_post_ID) );
715
716         if ( empty($status) )
717                 die('1');
718         elseif ( in_array($status, array('draft', 'pending', 'trash') ) )
719                 die( __('Error: you are replying to a comment on a draft post.') );
720
721         $user = wp_get_current_user();
722         if ( $user->ID ) {
723                 $comment_author       = $wpdb->escape($user->display_name);
724                 $comment_author_email = $wpdb->escape($user->user_email);
725                 $comment_author_url   = $wpdb->escape($user->user_url);
726                 $comment_content      = trim($_POST['content']);
727                 if ( current_user_can('unfiltered_html') ) {
728                         if ( wp_create_nonce('unfiltered-html-comment_' . $comment_post_ID) != $_POST['_wp_unfiltered_html_comment'] ) {
729                                 kses_remove_filters(); // start with a clean slate
730                                 kses_init_filters(); // set up the filters
731                         }
732                 }
733         } else {
734                 die( __('Sorry, you must be logged in to reply to a comment.') );
735         }
736
737         if ( '' == $comment_content )
738                 die( __('Error: please type a comment.') );
739
740         $comment_parent = absint($_POST['comment_ID']);
741         $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');
742
743         $comment_id = wp_new_comment( $commentdata );
744         $comment = get_comment($comment_id);
745         if ( ! $comment ) die('1');
746
747         $modes = array( 'single', 'detail', 'dashboard' );
748         $mode = isset($_POST['mode']) && in_array( $_POST['mode'], $modes ) ? $_POST['mode'] : 'detail';
749         $position = ( isset($_POST['position']) && (int) $_POST['position']) ? (int) $_POST['position'] : '-1';
750         $checkbox = ( isset($_POST['checkbox']) && true == $_POST['checkbox'] ) ? 1 : 0;
751
752         if ( get_option('show_avatars') && 'single' != $mode )
753                 add_filter( 'comment_author', 'floated_admin_avatar' );
754
755         $x = new WP_Ajax_Response();
756
757         ob_start();
758                 if ( 'dashboard' == $mode ) {
759                         require_once( ABSPATH . 'wp-admin/includes/dashboard.php' );
760                         _wp_dashboard_recent_comments_row( $comment, false );
761                 } else {
762                         _wp_comment_row( $comment->comment_ID, $mode, false, $checkbox );
763                 }
764                 $comment_list_item = ob_get_contents();
765         ob_end_clean();
766
767         $x->add( array(
768                 'what' => 'comment',
769                 'id' => $comment->comment_ID,
770                 'data' => $comment_list_item,
771                 'position' => $position
772         ));
773
774         $x->send();
775         break;
776 case 'edit-comment' :
777         check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' );
778
779         $comment_post_ID = (int) $_POST['comment_post_ID'];
780         if ( ! current_user_can( 'edit_post', $comment_post_ID ) )
781                 die('-1');
782
783         if ( '' == $_POST['content'] )
784                 die( __('Error: please type a comment.') );
785
786         $comment_id = (int) $_POST['comment_ID'];
787         $_POST['comment_status'] = $_POST['status'];
788         edit_comment();
789
790         $mode = ( isset($_POST['mode']) && 'single' == $_POST['mode'] ) ? 'single' : 'detail';
791         $position = ( isset($_POST['position']) && (int) $_POST['position']) ? (int) $_POST['position'] : '-1';
792         $checkbox = ( isset($_POST['checkbox']) && true == $_POST['checkbox'] ) ? 1 : 0;
793         $comments_listing = isset($_POST['comments_listing']) ? $_POST['comments_listing'] : '';
794
795         if ( get_option('show_avatars') && 'single' != $mode )
796                 add_filter( 'comment_author', 'floated_admin_avatar' );
797
798         $x = new WP_Ajax_Response();
799
800         ob_start();
801                 _wp_comment_row( $comment_id, $mode, $comments_listing, $checkbox );
802                 $comment_list_item = ob_get_contents();
803         ob_end_clean();
804
805         $x->add( array(
806                 'what' => 'edit_comment',
807                 'id' => $comment->comment_ID,
808                 'data' => $comment_list_item,
809                 'position' => $position
810         ));
811
812         $x->send();
813         break;
814 case 'add-menu-item' :
815         if ( ! current_user_can( 'edit_theme_options' ) )
816                 die('-1');
817
818         check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' );
819
820         require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
821
822         $item_ids = wp_save_nav_menu_items( 0, $_POST['menu-item'] );
823         if ( is_wp_error( $item_ids ) )
824                 die('-1');
825
826         foreach ( (array) $item_ids as $menu_item_id ) {
827                 $menu_obj = get_post( $menu_item_id );
828                 if ( ! empty( $menu_obj->ID ) ) {
829                         $menu_obj = wp_setup_nav_menu_item( $menu_obj );
830                         $menu_obj->label = $menu_obj->title; // don't show "(pending)" in ajax-added items
831                         $menu_items[] = $menu_obj;
832                 }
833         }
834
835         if ( ! empty( $menu_items ) ) {
836                 $args = array(
837                         'after' => '',
838                         'before' => '',
839                         'link_after' => '',
840                         'link_before' => '',
841                         'walker' => new Walker_Nav_Menu_Edit,
842                 );
843                 echo walk_nav_menu_tree( $menu_items, 0, (object) $args );
844         }
845         break;
846 case 'add-meta' :
847         check_ajax_referer( 'add-meta', '_ajax_nonce-add-meta' );
848         $c = 0;
849         $pid = (int) $_POST['post_id'];
850         $post = get_post( $pid );
851
852         if ( isset($_POST['metakeyselect']) || isset($_POST['metakeyinput']) ) {
853                 if ( !current_user_can( 'edit_post', $pid ) )
854                         die('-1');
855                 if ( isset($_POST['metakeyselect']) && '#NONE#' == $_POST['metakeyselect'] && empty($_POST['metakeyinput']) )
856                         die('1');
857                 if ( $post->post_status == 'auto-draft' ) {
858                         $save_POST = $_POST; // Backup $_POST
859                         $_POST = array(); // Make it empty for edit_post()
860                         $_POST['action'] = 'draft'; // Warning fix
861                         $_POST['post_ID'] = $pid;
862                         $_POST['post_type'] = $post->post_type;
863                         $_POST['post_status'] = 'draft';
864                         $now = current_time('timestamp', 1);
865                         $_POST['post_title'] = sprintf('Draft created on %s at %s', date(get_option('date_format'), $now), date(get_option('time_format'), $now));
866
867                         if ( $pid = edit_post() ) {
868                                 if ( is_wp_error( $pid ) ) {
869                                         $x = new WP_Ajax_Response( array(
870                                                 'what' => 'meta',
871                                                 'data' => $pid
872                                         ) );
873                                         $x->send();
874                                 }
875                                 $_POST = $save_POST; // Now we can restore original $_POST again
876                                 if ( !$mid = add_meta( $pid ) )
877                                         die(__('Please provide a custom field value.'));
878                         } else {
879                                 die('0');
880                         }
881                 } else if ( !$mid = add_meta( $pid ) ) {
882                         die(__('Please provide a custom field value.'));
883                 }
884
885                 $meta = get_post_meta_by_id( $mid );
886                 $pid = (int) $meta->post_id;
887                 $meta = get_object_vars( $meta );
888                 $x = new WP_Ajax_Response( array(
889                         'what' => 'meta',
890                         'id' => $mid,
891                         'data' => _list_meta_row( $meta, $c ),
892                         'position' => 1,
893                         'supplemental' => array('postid' => $pid)
894                 ) );
895         } else { // Update?
896                 $mid = (int) array_pop(array_keys($_POST['meta']));
897                 $key = $_POST['meta'][$mid]['key'];
898                 $value = $_POST['meta'][$mid]['value'];
899                 if ( '' == trim($key) )
900                         die(__('Please provide a custom field name.'));
901                 if ( '' == trim($value) )
902                         die(__('Please provide a custom field value.'));
903                 if ( !$meta = get_post_meta_by_id( $mid ) )
904                         die('0'); // if meta doesn't exist
905                 if ( !current_user_can( 'edit_post', $meta->post_id ) )
906                         die('-1');
907                 if ( $meta->meta_value != stripslashes($value) || $meta->meta_key != stripslashes($key) ) {
908                         if ( !$u = update_meta( $mid, $key, $value ) )
909                                 die('0'); // We know meta exists; we also know it's unchanged (or DB error, in which case there are bigger problems).
910                 }
911
912                 $key = stripslashes($key);
913                 $value = stripslashes($value);
914                 $x = new WP_Ajax_Response( array(
915                         'what' => 'meta',
916                         'id' => $mid, 'old_id' => $mid,
917                         'data' => _list_meta_row( array(
918                                 'meta_key' => $key,
919                                 'meta_value' => $value,
920                                 'meta_id' => $mid
921                         ), $c ),
922                         'position' => 0,
923                         'supplemental' => array('postid' => $meta->post_id)
924                 ) );
925         }
926         $x->send();
927         break;
928 case 'add-user' :
929         check_ajax_referer( $action );
930         if ( !current_user_can('create_users') )
931                 die('-1');
932         require_once(ABSPATH . WPINC . '/registration.php');
933         if ( !$user_id = add_user() )
934                 die('0');
935         elseif ( is_wp_error( $user_id ) ) {
936                 $x = new WP_Ajax_Response( array(
937                         'what' => 'user',
938                         'id' => $user_id
939                 ) );
940                 $x->send();
941         }
942         $user_object = new WP_User( $user_id );
943
944         $x = new WP_Ajax_Response( array(
945                 'what' => 'user',
946                 'id' => $user_id,
947                 'data' => user_row( $user_object, '', $user_object->roles[0] ),
948                 'supplemental' => array(
949                         'show-link' => sprintf(__( 'User <a href="#%s">%s</a> added' ), "user-$user_id", $user_object->user_login),
950                         'role' => $user_object->roles[0]
951                 )
952         ) );
953         $x->send();
954         break;
955 case 'autosave' : // The name of this action is hardcoded in edit_post()
956         define( 'DOING_AUTOSAVE', true );
957
958         $nonce_age = check_ajax_referer( 'autosave', 'autosavenonce' );
959         global $current_user;
960
961         $_POST['post_category'] = explode(",", $_POST['catslist']);
962         if ( $_POST['post_type'] == 'page' || empty($_POST['post_category']) )
963                 unset($_POST['post_category']);
964
965         $do_autosave = (bool) $_POST['autosave'];
966         $do_lock = true;
967
968         $data = '';
969         /* translators: draft saved date format, see http://php.net/date */
970         $draft_saved_date_format = __('g:i:s a');
971         /* translators: %s: date and time */
972         $message = sprintf( __('Draft saved at %s.'), date_i18n( $draft_saved_date_format ) );
973
974         $supplemental = array();
975         if ( isset($login_grace_period) )
976                 $supplemental['session_expired'] = add_query_arg( 'interim-login', 1, wp_login_url() );
977
978         $id = $revision_id = 0;
979
980         $post_ID = (int) $_POST['post_ID'];
981         $_POST['ID'] = $post_ID;
982         $post = get_post($post_ID);
983         if ( 'auto-draft' == $post->post_status )
984                 $_POST['post_status'] = 'draft';
985
986         if ( $last = wp_check_post_lock( $post->ID ) ) {
987                 $do_autosave = $do_lock = false;
988
989                 $last_user = get_userdata( $last );
990                 $last_user_name = $last_user ? $last_user->display_name : __( 'Someone' );
991                 $data = new WP_Error( 'locked', sprintf(
992                         $_POST['post_type'] == 'page' ? __( 'Autosave disabled: %s is currently editing this page.' ) : __( 'Autosave disabled: %s is currently editing this post.' ),
993                         esc_html( $last_user_name )
994                 ) );
995
996                 $supplemental['disable_autosave'] = 'disable';
997         }
998
999         if ( 'page' == $post->post_type ) {
1000                 if ( !current_user_can('edit_page', $post_ID) )
1001                         die(__('You are not allowed to edit this page.'));
1002         } else {
1003                 if ( !current_user_can('edit_post', $post_ID) )
1004                         die(__('You are not allowed to edit this post.'));
1005         }
1006
1007         if ( $do_autosave ) {
1008                 // Drafts and auto-drafts are just overwritten by autosave
1009                 if ( 'auto-draft' == $post->post_status || 'draft' == $post->post_status ) {
1010                         $id = edit_post();
1011                 } else { // Non drafts are not overwritten.  The autosave is stored in a special post revision.
1012                         $revision_id = wp_create_post_autosave( $post->ID );
1013                         if ( is_wp_error($revision_id) )
1014                                 $id = $revision_id;
1015                         else
1016                                 $id = $post->ID;
1017                 }
1018                 $data = $message;
1019         } else {
1020                 if ( isset( $_POST['auto_draft'] ) && '1' == $_POST['auto_draft'] )
1021                         $id = 0; // This tells us it didn't actually save
1022                 else
1023                         $id = $post->ID;
1024         }
1025
1026         if ( $do_lock && ( isset( $_POST['auto_draft'] ) && ( $_POST['auto_draft'] != '1' ) ) && $id && is_numeric($id) )
1027                 wp_set_post_lock( $id );
1028
1029         if ( $nonce_age == 2 ) {
1030                 $supplemental['replace-autosavenonce'] = wp_create_nonce('autosave');
1031                 $supplemental['replace-getpermalinknonce'] = wp_create_nonce('getpermalink');
1032                 $supplemental['replace-samplepermalinknonce'] = wp_create_nonce('samplepermalink');
1033                 $supplemental['replace-closedpostboxesnonce'] = wp_create_nonce('closedpostboxes');
1034                 if ( $id ) {
1035                         if ( $_POST['post_type'] == 'post' )
1036                                 $supplemental['replace-_wpnonce'] = wp_create_nonce('update-post_' . $id);
1037                         elseif ( $_POST['post_type'] == 'page' )
1038                                 $supplemental['replace-_wpnonce'] = wp_create_nonce('update-page_' . $id);
1039                 }
1040         }
1041
1042         $x = new WP_Ajax_Response( array(
1043                 'what' => 'autosave',
1044                 'id' => $id,
1045                 'data' => $id ? $data : '',
1046                 'supplemental' => $supplemental
1047         ) );
1048         $x->send();
1049         break;
1050 case 'closed-postboxes' :
1051         check_ajax_referer( 'closedpostboxes', 'closedpostboxesnonce' );
1052         $closed = isset( $_POST['closed'] ) ? explode( ',', $_POST['closed']) : array();
1053         $closed = array_filter($closed);
1054
1055         $hidden = isset( $_POST['hidden'] ) ? explode( ',', $_POST['hidden']) : array();
1056         $hidden = array_filter($hidden);
1057
1058         $page = isset( $_POST['page'] ) ? $_POST['page'] : '';
1059
1060         if ( !preg_match( '/^[a-z_-]+$/', $page ) )
1061                 die('-1');
1062
1063         if ( ! $user = wp_get_current_user() )
1064                 die('-1');
1065
1066         if ( is_array($closed) )
1067                 update_user_option($user->ID, "closedpostboxes_$page", $closed, true);
1068
1069         if ( is_array($hidden) ) {
1070                 $hidden = array_diff( $hidden, array('submitdiv', 'linksubmitdiv', 'manage-menu', 'create-menu') ); // postboxes that are always shown
1071                 update_user_option($user->ID, "metaboxhidden_$page", $hidden, true);
1072         }
1073
1074         die('1');
1075         break;
1076 case 'hidden-columns' :
1077         check_ajax_referer( 'screen-options-nonce', 'screenoptionnonce' );
1078         $hidden = isset( $_POST['hidden'] ) ? $_POST['hidden'] : '';
1079         $hidden = explode( ',', $_POST['hidden'] );
1080         $page = isset( $_POST['page'] ) ? $_POST['page'] : '';
1081
1082         if ( !preg_match( '/^[a-z_-]+$/', $page ) )
1083                 die('-1');
1084
1085         if ( ! $user = wp_get_current_user() )
1086                 die('-1');
1087
1088         if ( is_array($hidden) )
1089                 update_user_option($user->ID, "manage{$page}columnshidden", $hidden, true);
1090
1091         die('1');
1092         break;
1093 case 'menu-get-metabox' :
1094         if ( ! current_user_can( 'edit_theme_options' ) )
1095                 die('-1');
1096
1097         require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
1098
1099         if ( isset( $_POST['item-type'] ) && 'post_type' == $_POST['item-type'] ) {
1100                 $type = 'posttype';
1101                 $callback = 'wp_nav_menu_item_post_type_meta_box';
1102                 $items = (array) get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
1103         } elseif ( isset( $_POST['item-type'] ) && 'taxonomy' == $_POST['item-type'] ) {
1104                 $type = 'taxonomy';
1105                 $callback = 'wp_nav_menu_item_taxonomy_meta_box';
1106                 $items = (array) get_taxonomies( array( 'show_ui' => true ), 'object' );
1107         }
1108
1109         if ( ! empty( $_POST['item-object'] ) && isset( $items[$_POST['item-object']] ) ) {
1110                 $item = apply_filters( 'nav_menu_meta_box_object', $items[ $_POST['item-object'] ] );
1111                 ob_start();
1112                 call_user_func_array($callback, array(
1113                         null,
1114                         array(
1115                                 'id' => 'add-' . $item->name,
1116                                 'title' => $item->labels->name,
1117                                 'callback' => $callback,
1118                                 'args' => $item,
1119                         )
1120                 ));
1121
1122                 $markup = ob_get_clean();
1123
1124                 echo json_encode(array(
1125                         'replace-id' => $type . '-' . $item->name,
1126                         'markup' => $markup,
1127                 ));
1128         }
1129
1130         exit;
1131         break;
1132 case 'menu-quick-search':
1133         if ( ! current_user_can( 'edit_theme_options' ) )
1134                 die('-1');
1135
1136         require_once ABSPATH . 'wp-admin/includes/nav-menu.php';
1137
1138         _wp_ajax_menu_quick_search( $_REQUEST );
1139
1140         exit;
1141         break;
1142 case 'menu-locations-save':
1143         if ( ! current_user_can( 'edit_theme_options' ) )
1144                 die('-1');
1145         check_ajax_referer( 'add-menu_item', 'menu-settings-column-nonce' );
1146         if ( ! isset( $_POST['menu-locations'] ) )
1147                 die('0');
1148         set_theme_mod( 'nav_menu_locations', $_POST['menu-locations'] );
1149         die('1');
1150         break;
1151 case 'meta-box-order':
1152         check_ajax_referer( 'meta-box-order' );
1153         $order = isset( $_POST['order'] ) ? (array) $_POST['order'] : false;
1154         $page_columns = isset( $_POST['page_columns'] ) ? (int) $_POST['page_columns'] : 0;
1155         $page = isset( $_POST['page'] ) ? $_POST['page'] : '';
1156
1157         if ( !preg_match( '/^[a-z_-]+$/', $page ) )
1158                 die('-1');
1159
1160         if ( ! $user = wp_get_current_user() )
1161                 die('-1');
1162
1163         if ( $order )
1164                 update_user_option($user->ID, "meta-box-order_$page", $order, true);
1165
1166         if ( $page_columns )
1167                 update_user_option($user->ID, "screen_layout_$page", $page_columns, true);
1168
1169         die('1');
1170         break;
1171 case 'get-permalink':
1172         check_ajax_referer( 'getpermalink', 'getpermalinknonce' );
1173         $post_id = isset($_POST['post_id'])? intval($_POST['post_id']) : 0;
1174         die(add_query_arg(array('preview' => 'true'), get_permalink($post_id)));
1175 break;
1176 case 'sample-permalink':
1177         check_ajax_referer( 'samplepermalink', 'samplepermalinknonce' );
1178         $post_id = isset($_POST['post_id'])? intval($_POST['post_id']) : 0;
1179         $title = isset($_POST['new_title'])? $_POST['new_title'] : '';
1180         $slug = isset($_POST['new_slug'])? $_POST['new_slug'] : null;
1181         die(get_sample_permalink_html($post_id, $title, $slug));
1182 break;
1183 case 'inline-save':
1184         check_ajax_referer( 'inlineeditnonce', '_inline_edit' );
1185
1186         if ( ! isset($_POST['post_ID']) || ! ( $post_ID = (int) $_POST['post_ID'] ) )
1187                 exit;
1188
1189         if ( 'page' == $_POST['post_type'] ) {
1190                 if ( ! current_user_can( 'edit_page', $post_ID ) )
1191                         die( __('You are not allowed to edit this page.') );
1192         } else {
1193                 if ( ! current_user_can( 'edit_post', $post_ID ) )
1194                         die( __('You are not allowed to edit this post.') );
1195         }
1196
1197         if ( isset($_POST['screen']) )
1198                 set_current_screen($_POST['screen']);
1199
1200         if ( $last = wp_check_post_lock( $post_ID ) ) {
1201                 $last_user = get_userdata( $last );
1202                 $last_user_name = $last_user ? $last_user->display_name : __( 'Someone' );
1203                 printf( $_POST['post_type'] == 'page' ? __( 'Saving is disabled: %s is currently editing this page.' ) : __( 'Saving is disabled: %s is currently editing this post.' ),        esc_html( $last_user_name ) );
1204                 exit;
1205         }
1206
1207         $data = &$_POST;
1208
1209         $post = get_post( $post_ID, ARRAY_A );
1210         $post = add_magic_quotes($post); //since it is from db
1211
1212         $data['content'] = $post['post_content'];
1213         $data['excerpt'] = $post['post_excerpt'];
1214
1215         // rename
1216         $data['user_ID'] = $GLOBALS['user_ID'];
1217
1218         if ( isset($data['post_parent']) )
1219                 $data['parent_id'] = $data['post_parent'];
1220
1221         // status
1222         if ( isset($data['keep_private']) && 'private' == $data['keep_private'] )
1223                 $data['post_status'] = 'private';
1224         else
1225                 $data['post_status'] = $data['_status'];
1226
1227         if ( empty($data['comment_status']) )
1228                 $data['comment_status'] = 'closed';
1229         if ( empty($data['ping_status']) )
1230                 $data['ping_status'] = 'closed';
1231
1232         // update the post
1233         edit_post();
1234
1235         $post = array();
1236         if ( 'page' == $_POST['post_type'] ) {
1237                 $post[] = get_post($_POST['post_ID']);
1238                 page_rows($post);
1239         } elseif ( 'post' == $_POST['post_type'] || in_array($_POST['post_type'], get_post_types( array('public' => true) ) ) ) {
1240                 $mode = $_POST['post_view'];
1241                 $post[] = get_post($_POST['post_ID']);
1242                 post_rows($post);
1243         }
1244
1245         exit;
1246         break;
1247 case 'inline-save-tax':
1248         check_ajax_referer( 'taxinlineeditnonce', '_inline_edit' );
1249
1250         $taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : false;
1251         if ( ! $taxonomy )
1252                 die( __('Cheatin&#8217; uh?') );
1253         $tax = get_taxonomy($taxonomy);
1254
1255         if ( ! current_user_can( $tax->cap->edit_terms ) )
1256                 die( __('Cheatin&#8217; uh?') );
1257
1258         if ( ! isset($_POST['tax_ID']) || ! ( $id = (int) $_POST['tax_ID'] ) )
1259                 die(-1);
1260
1261         switch ($_POST['tax_type']) {
1262                 case 'link-cat' :
1263                         $updated = wp_update_term($id, 'link_category', $_POST);
1264
1265                         if ( $updated && !is_wp_error($updated) )
1266                                 echo link_cat_row($updated['term_id']);
1267                         else
1268                                 die( __('Category not updated.') );
1269
1270                         break;
1271                 case 'tag' :
1272                         $taxonomy = !empty($_POST['taxonomy']) ? $_POST['taxonomy'] : 'post_tag';
1273
1274                         $tag = get_term( $id, $taxonomy );
1275                         $_POST['description'] = $tag->description;
1276
1277                         $updated = wp_update_term($id, $taxonomy, $_POST);
1278                         if ( $updated && !is_wp_error($updated) ) {
1279                                 $tag = get_term( $updated['term_id'], $taxonomy );
1280                                 if ( !$tag || is_wp_error( $tag ) ) {
1281                                         if ( is_wp_error($tag) && $tag->get_error_message() )
1282                                                 die( $tag->get_error_message() );
1283                                         die( __('Item not updated.') );
1284                                 }
1285
1286                                 set_current_screen( 'edit-' . $taxonomy );
1287
1288                                 echo _tag_row($tag, 0, $taxonomy);
1289                         } else {
1290                                 if ( is_wp_error($updated) && $updated->get_error_message() )
1291                                         die( $updated->get_error_message() );
1292                                 die( __('Item not updated.') );
1293                         }
1294
1295                         break;
1296         }
1297
1298         exit;
1299         break;
1300 case 'find_posts':
1301         check_ajax_referer( 'find-posts' );
1302
1303         if ( empty($_POST['ps']) )
1304                 exit;
1305
1306         if ( !empty($_POST['post_type']) && in_array( $_POST['post_type'], get_post_types() ) )
1307                 $what = $_POST['post_type'];
1308         else
1309                 $what = 'post';
1310
1311         $s = stripslashes($_POST['ps']);
1312         preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $s, $matches);
1313         $search_terms = array_map('_search_terms_tidy', $matches[0]);
1314
1315         $searchand = $search = '';
1316         foreach ( (array) $search_terms as $term ) {
1317                 $term = addslashes_gpc($term);
1318                 $search .= "{$searchand}(($wpdb->posts.post_title LIKE '%{$term}%') OR ($wpdb->posts.post_content LIKE '%{$term}%'))";
1319                 $searchand = ' AND ';
1320         }
1321         $term = $wpdb->escape($s);
1322         if ( count($search_terms) > 1 && $search_terms[0] != $s )
1323                 $search .= " OR ($wpdb->posts.post_title LIKE '%{$term}%') OR ($wpdb->posts.post_content LIKE '%{$term}%')";
1324
1325         $posts = $wpdb->get_results( "SELECT ID, post_title, post_status, post_date FROM $wpdb->posts WHERE post_type = '$what' AND post_status IN ('draft', 'publish') AND ($search) ORDER BY post_date_gmt DESC LIMIT 50" );
1326
1327         if ( ! $posts ) {
1328                 $posttype = get_post_type_object($what);
1329                 exit($posttype->labels->not_found);
1330         }
1331
1332         $html = '<table class="widefat" cellspacing="0"><thead><tr><th class="found-radio"><br /></th><th>'.__('Title').'</th><th>'.__('Date').'</th><th>'.__('Status').'</th></tr></thead><tbody>';
1333         foreach ( $posts as $post ) {
1334
1335                 switch ( $post->post_status ) {
1336                         case 'publish' :
1337                         case 'private' :
1338                                 $stat = __('Published');
1339                                 break;
1340                         case 'future' :
1341                                 $stat = __('Scheduled');
1342                                 break;
1343                         case 'pending' :
1344                                 $stat = __('Pending Review');
1345                                 break;
1346                         case 'draft' :
1347                                 $stat = __('Draft');
1348                                 break;
1349                 }
1350
1351                 if ( '0000-00-00 00:00:00' == $post->post_date ) {
1352                         $time = '';
1353                 } else {
1354                         /* translators: date format in table columns, see http://php.net/date */
1355                         $time = mysql2date(__('Y/m/d'), $post->post_date);
1356                 }
1357
1358                 $html .= '<tr class="found-posts"><td class="found-radio"><input type="radio" id="found-'.$post->ID.'" name="found_post_id" value="' . esc_attr($post->ID) . '"></td>';
1359                 $html .= '<td><label for="found-'.$post->ID.'">'.esc_html( $post->post_title ).'</label></td><td>'.esc_html( $time ).'</td><td>'.esc_html( $stat ).'</td></tr>'."\n\n";
1360         }
1361         $html .= '</tbody></table>';
1362
1363         $x = new WP_Ajax_Response();
1364         $x->add( array(
1365                 'what' => $what,
1366                 'data' => $html
1367         ));
1368         $x->send();
1369
1370         break;
1371 case 'lj-importer' :
1372         check_ajax_referer( 'lj-api-import' );
1373         if ( !current_user_can( 'publish_posts' ) )
1374                 die('-1');
1375         if ( empty( $_POST['step'] ) )
1376                 die( '-1' );
1377         define('WP_IMPORTING', true);
1378         include( ABSPATH . 'wp-admin/import/livejournal.php' );
1379         $result = $lj_api_import->{ 'step' . ( (int) $_POST['step'] ) }();
1380         if ( is_wp_error( $result ) )
1381                 echo $result->get_error_message();
1382         die;
1383         break;
1384 case 'widgets-order' :
1385         check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );
1386
1387         if ( !current_user_can('edit_theme_options') )
1388                 die('-1');
1389
1390         unset( $_POST['savewidgets'], $_POST['action'] );
1391
1392         // save widgets order for all sidebars
1393         if ( is_array($_POST['sidebars']) ) {
1394                 $sidebars = array();
1395                 foreach ( $_POST['sidebars'] as $key => $val ) {
1396                         $sb = array();
1397                         if ( !empty($val) ) {
1398                                 $val = explode(',', $val);
1399                                 foreach ( $val as $k => $v ) {
1400                                         if ( strpos($v, 'widget-') === false )
1401                                                 continue;
1402
1403                                         $sb[$k] = substr($v, strpos($v, '_') + 1);
1404                                 }
1405                         }
1406                         $sidebars[$key] = $sb;
1407                 }
1408                 wp_set_sidebars_widgets($sidebars);
1409                 die('1');
1410         }
1411
1412         die('-1');
1413         break;
1414 case 'save-widget' :
1415         check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );
1416
1417         if ( !current_user_can('edit_theme_options') || !isset($_POST['id_base']) )
1418                 die('-1');
1419
1420         unset( $_POST['savewidgets'], $_POST['action'] );
1421
1422         do_action('load-widgets.php');
1423         do_action('widgets.php');
1424         do_action('sidebar_admin_setup');
1425
1426         $id_base = $_POST['id_base'];
1427         $widget_id = $_POST['widget-id'];
1428         $sidebar_id = $_POST['sidebar'];
1429         $multi_number = !empty($_POST['multi_number']) ? (int) $_POST['multi_number'] : 0;
1430         $settings = isset($_POST['widget-' . $id_base]) && is_array($_POST['widget-' . $id_base]) ? $_POST['widget-' . $id_base] : false;
1431         $error = '<p>' . __('An error has occured. Please reload the page and try again.') . '</p>';
1432
1433         $sidebars = wp_get_sidebars_widgets();
1434         $sidebar = isset($sidebars[$sidebar_id]) ? $sidebars[$sidebar_id] : array();
1435
1436         // delete
1437         if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {
1438
1439                 if ( !isset($wp_registered_widgets[$widget_id]) )
1440                         die($error);
1441
1442                 $sidebar = array_diff( $sidebar, array($widget_id) );
1443                 $_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');
1444         } elseif ( $settings && preg_match( '/__i__|%i%/', key($settings) ) ) {
1445                 if ( !$multi_number )
1446                         die($error);
1447
1448                 $_POST['widget-' . $id_base] = array( $multi_number => array_shift($settings) );
1449                 $widget_id = $id_base . '-' . $multi_number;
1450                 $sidebar[] = $widget_id;
1451         }
1452         $_POST['widget-id'] = $sidebar;
1453
1454         foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
1455
1456                 if ( $name == $id_base ) {
1457                         if ( !is_callable( $control['callback'] ) )
1458                                 continue;
1459
1460                         ob_start();
1461                                 call_user_func_array( $control['callback'], $control['params'] );
1462                         ob_end_clean();
1463                         break;
1464                 }
1465         }
1466
1467         if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {
1468                 $sidebars[$sidebar_id] = $sidebar;
1469                 wp_set_sidebars_widgets($sidebars);
1470                 echo "deleted:$widget_id";
1471                 die();
1472         }
1473
1474         if ( !empty($_POST['add_new']) )
1475                 die();
1476
1477         if ( $form = $wp_registered_widget_controls[$widget_id] )
1478                 call_user_func_array( $form['callback'], $form['params'] );
1479
1480         die();
1481         break;
1482 case 'image-editor':
1483         $attachment_id = intval($_POST['postid']);
1484         if ( empty($attachment_id) || !current_user_can('edit_post', $attachment_id) )
1485                 die('-1');
1486
1487         check_ajax_referer( "image_editor-$attachment_id" );
1488         include_once( ABSPATH . 'wp-admin/includes/image-edit.php' );
1489
1490         $msg = false;
1491         switch ( $_POST['do'] ) {
1492                 case 'save' :
1493                         $msg = wp_save_image($attachment_id);
1494                         $msg = json_encode($msg);
1495                         die($msg);
1496                         break;
1497                 case 'scale' :
1498                         $msg = wp_save_image($attachment_id);
1499                         break;
1500                 case 'restore' :
1501                         $msg = wp_restore_image($attachment_id);
1502                         break;
1503         }
1504
1505         wp_image_editor($attachment_id, $msg);
1506         die();
1507         break;
1508 case 'set-post-thumbnail':
1509         $post_ID = intval( $_POST['post_id'] );
1510         if ( !current_user_can( 'edit_post', $post_ID ) )
1511                 die( '-1' );
1512         $thumbnail_id = intval( $_POST['thumbnail_id'] );
1513
1514         check_ajax_referer( "set_post_thumbnail-$post_ID" );
1515
1516         if ( $thumbnail_id == '-1' ) {
1517                 delete_post_meta( $post_ID, '_thumbnail_id' );
1518                 die( _wp_post_thumbnail_html() );
1519         }
1520
1521         if ( $thumbnail_id && get_post( $thumbnail_id ) ) {
1522                 $thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'thumbnail' );
1523                 if ( !empty( $thumbnail_html ) ) {
1524                         update_post_meta( $post_ID, '_thumbnail_id', $thumbnail_id );
1525                         die( _wp_post_thumbnail_html( $thumbnail_id ) );
1526                 }
1527         }
1528         die( '0' );
1529         break;
1530 default :
1531         do_action( 'wp_ajax_' . $_POST['action'] );
1532         die('0');
1533         break;
1534 endswitch;
1535 ?>