web/wp-admin/includes/post.php
changeset 136 bde1974c263b
child 194 32102edaa81b
equal deleted inserted replaced
135:53cff4b4a802 136:bde1974c263b
       
     1 <?php
       
     2 /**
       
     3  * WordPress Post Administration API.
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Administration
       
     7  */
       
     8 
       
     9 /**
       
    10  * Rename $_POST data from form names to DB post columns.
       
    11  *
       
    12  * Manipulates $_POST directly.
       
    13  *
       
    14  * @package WordPress
       
    15  * @since 2.6.0
       
    16  *
       
    17  * @param bool $update Are we updating a pre-existing post?
       
    18  * @param post_data array Array of post data. Defaults to the contents of $_POST.
       
    19  * @return object|bool WP_Error on failure, true on success.
       
    20  */
       
    21 function _wp_translate_postdata( $update = false, $post_data = null ) {
       
    22 
       
    23 	if ( empty($post_data) )
       
    24 		$post_data = &$_POST;
       
    25 
       
    26 	if ( $update )
       
    27 		$post_data['ID'] = (int) $post_data['post_ID'];
       
    28 	$post_data['post_content'] = isset($post_data['content']) ? $post_data['content'] : '';
       
    29 	$post_data['post_excerpt'] = isset($post_data['excerpt']) ? $post_data['excerpt'] : '';
       
    30 	$post_data['post_parent'] = isset($post_data['parent_id'])? $post_data['parent_id'] : '';
       
    31 	if ( isset($post_data['trackback_url']) )
       
    32 		$post_data['to_ping'] = $post_data['trackback_url'];
       
    33 
       
    34 	if (!empty ( $post_data['post_author_override'] ) ) {
       
    35 		$post_data['post_author'] = (int) $post_data['post_author_override'];
       
    36 	} else {
       
    37 		if (!empty ( $post_data['post_author'] ) ) {
       
    38 			$post_data['post_author'] = (int) $post_data['post_author'];
       
    39 		} else {
       
    40 			$post_data['post_author'] = (int) $post_data['user_ID'];
       
    41 		}
       
    42 	}
       
    43 
       
    44 	if ( isset($post_data['user_ID']) && ($post_data['post_author'] != $post_data['user_ID']) ) {
       
    45 		if ( 'page' == $post_data['post_type'] ) {
       
    46 			if ( !current_user_can( 'edit_others_pages' ) ) {
       
    47 				return new WP_Error( 'edit_others_pages', $update ?
       
    48 					__( 'You are not allowed to edit pages as this user.' ) :
       
    49 					__( 'You are not allowed to create pages as this user.' )
       
    50 				);
       
    51 			}
       
    52 		} else {
       
    53 			if ( !current_user_can( 'edit_others_posts' ) ) {
       
    54 				return new WP_Error( 'edit_others_posts', $update ?
       
    55 					__( 'You are not allowed to edit posts as this user.' ) :
       
    56 					__( 'You are not allowed to post as this user.' )
       
    57 				);
       
    58 			}
       
    59 		}
       
    60 	}
       
    61 
       
    62 	// What to do based on which button they pressed
       
    63 	if ( isset($post_data['saveasdraft']) && '' != $post_data['saveasdraft'] )
       
    64 		$post_data['post_status'] = 'draft';
       
    65 	if ( isset($post_data['saveasprivate']) && '' != $post_data['saveasprivate'] )
       
    66 		$post_data['post_status'] = 'private';
       
    67 	if ( isset($post_data['publish']) && ( '' != $post_data['publish'] ) && ( $post_data['post_status'] != 'private' ) )
       
    68 		$post_data['post_status'] = 'publish';
       
    69 	if ( isset($post_data['advanced']) && '' != $post_data['advanced'] )
       
    70 		$post_data['post_status'] = 'draft';
       
    71 	if ( isset($post_data['pending']) && '' != $post_data['pending'] )
       
    72 		$post_data['post_status'] = 'pending';
       
    73 
       
    74 	$previous_status = get_post_field('post_status',  isset($post_data['ID']) ? $post_data['ID'] : $post_data['temp_ID']);
       
    75 
       
    76 	// Posts 'submitted for approval' present are submitted to $_POST the same as if they were being published.
       
    77 	// Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts.
       
    78 	if ( 'page' == $post_data['post_type'] ) {
       
    79 		$publish_cap = 'publish_pages';
       
    80 		$edit_cap = 'edit_published_pages';
       
    81 	} else {
       
    82 		$publish_cap = 'publish_posts';
       
    83 		$edit_cap = 'edit_published_posts';
       
    84 	}
       
    85 	if ( isset($post_data['post_status']) && ('publish' == $post_data['post_status'] && !current_user_can( $publish_cap )) )
       
    86 		if ( $previous_status != 'publish' || !current_user_can( $edit_cap ) )
       
    87 			$post_data['post_status'] = 'pending';
       
    88 
       
    89 	if ( ! isset($post_data['post_status']) )
       
    90 		$post_data['post_status'] = $previous_status;
       
    91 
       
    92 	if (!isset( $post_data['comment_status'] ))
       
    93 		$post_data['comment_status'] = 'closed';
       
    94 
       
    95 	if (!isset( $post_data['ping_status'] ))
       
    96 		$post_data['ping_status'] = 'closed';
       
    97 
       
    98 	foreach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
       
    99 		if ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) {
       
   100 			$post_data['edit_date'] = '1';
       
   101 			break;
       
   102 		}
       
   103 	}
       
   104 
       
   105 	if ( !empty( $post_data['edit_date'] ) ) {
       
   106 		$aa = $post_data['aa'];
       
   107 		$mm = $post_data['mm'];
       
   108 		$jj = $post_data['jj'];
       
   109 		$hh = $post_data['hh'];
       
   110 		$mn = $post_data['mn'];
       
   111 		$ss = $post_data['ss'];
       
   112 		$aa = ($aa <= 0 ) ? date('Y') : $aa;
       
   113 		$mm = ($mm <= 0 ) ? date('n') : $mm;
       
   114 		$jj = ($jj > 31 ) ? 31 : $jj;
       
   115 		$jj = ($jj <= 0 ) ? date('j') : $jj;
       
   116 		$hh = ($hh > 23 ) ? $hh -24 : $hh;
       
   117 		$mn = ($mn > 59 ) ? $mn -60 : $mn;
       
   118 		$ss = ($ss > 59 ) ? $ss -60 : $ss;
       
   119 		$post_data['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
       
   120 		$post_data['post_date_gmt'] = get_gmt_from_date( $post_data['post_date'] );
       
   121 	}
       
   122 
       
   123 	return $post_data;
       
   124 }
       
   125 
       
   126 /**
       
   127  * Update an existing post with values provided in $_POST.
       
   128  *
       
   129  * @since unknown
       
   130  *
       
   131  * @param array $post_data Optional.
       
   132  * @return int Post ID.
       
   133  */
       
   134 function edit_post( $post_data = null ) {
       
   135 
       
   136 	if ( empty($post_data) )
       
   137 		$post_data = &$_POST;
       
   138 
       
   139 	$post_ID = (int) $post_data['post_ID'];
       
   140 
       
   141 	if ( 'page' == $post_data['post_type'] ) {
       
   142 		if ( !current_user_can( 'edit_page', $post_ID ) )
       
   143 			wp_die( __('You are not allowed to edit this page.' ));
       
   144 	} else {
       
   145 		if ( !current_user_can( 'edit_post', $post_ID ) )
       
   146 			wp_die( __('You are not allowed to edit this post.' ));
       
   147 	}
       
   148 
       
   149 	// Autosave shouldn't save too soon after a real save
       
   150 	if ( 'autosave' == $post_data['action'] ) {
       
   151 		$post =& get_post( $post_ID );
       
   152 		$now = time();
       
   153 		$then = strtotime($post->post_date_gmt . ' +0000');
       
   154 		$delta = AUTOSAVE_INTERVAL / 2;
       
   155 		if ( ($now - $then) < $delta )
       
   156 			return $post_ID;
       
   157 	}
       
   158 
       
   159 	$post_data = _wp_translate_postdata( true, $post_data );
       
   160 	if ( is_wp_error($post_data) )
       
   161 		wp_die( $post_data->get_error_message() );
       
   162 
       
   163 	if ( isset($post_data['visibility']) ) {
       
   164 		switch ( $post_data['visibility'] ) {
       
   165 			case 'public' :
       
   166 				$post_data['post_password'] = '';
       
   167 				break;
       
   168 			case 'password' :
       
   169 				unset( $post_data['sticky'] );
       
   170 				break;
       
   171 			case 'private' :
       
   172 				$post_data['post_status'] = 'private';
       
   173 				$post_data['post_password'] = '';
       
   174 				unset( $post_data['sticky'] );
       
   175 				break;
       
   176 		}
       
   177 	}
       
   178 
       
   179 	// Meta Stuff
       
   180 	if ( isset($post_data['meta']) && $post_data['meta'] ) {
       
   181 		foreach ( $post_data['meta'] as $key => $value )
       
   182 			update_meta( $key, $value['key'], $value['value'] );
       
   183 	}
       
   184 
       
   185 	if ( isset($post_data['deletemeta']) && $post_data['deletemeta'] ) {
       
   186 		foreach ( $post_data['deletemeta'] as $key => $value )
       
   187 			delete_meta( $key );
       
   188 	}
       
   189 
       
   190 	add_meta( $post_ID );
       
   191 
       
   192 	wp_update_post( $post_data );
       
   193 
       
   194 	// Reunite any orphaned attachments with their parent
       
   195 	if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
       
   196 		$draft_ids = array();
       
   197 	if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) )
       
   198 		_relocate_children( $draft_temp_id, $post_ID );
       
   199 
       
   200 	// Now that we have an ID we can fix any attachment anchor hrefs
       
   201 	_fix_attachment_links( $post_ID );
       
   202 
       
   203 	wp_set_post_lock( $post_ID, $GLOBALS['current_user']->ID );
       
   204 
       
   205 	if ( current_user_can( 'edit_others_posts' ) ) {
       
   206 		if ( !empty($post_data['sticky']) )
       
   207 			stick_post($post_ID);
       
   208 		else
       
   209 			unstick_post($post_ID);
       
   210 	}
       
   211 
       
   212 	return $post_ID;
       
   213 }
       
   214 
       
   215 /**
       
   216  * {@internal Missing Short Description}}
       
   217  *
       
   218  * Updates all bulk edited posts/pages, adding (but not removing) tags and
       
   219  * categories. Skips pages when they would be their own parent or child.
       
   220  *
       
   221  * @since unknown
       
   222  *
       
   223  * @return array
       
   224  */
       
   225 function bulk_edit_posts( $post_data = null ) {
       
   226 	global $wpdb;
       
   227 
       
   228 	if ( empty($post_data) )
       
   229 		$post_data = &$_POST;
       
   230 
       
   231 	if ( isset($post_data['post_type']) && 'page' == $post_data['post_type'] ) {
       
   232 		if ( ! current_user_can( 'edit_pages' ) )
       
   233 			wp_die( __('You are not allowed to edit pages.') );
       
   234 	} else {
       
   235 		if ( ! current_user_can( 'edit_posts' ) )
       
   236 			wp_die( __('You are not allowed to edit posts.') );
       
   237 	}
       
   238 
       
   239 	if ( -1 == $post_data['_status'] ) {
       
   240 		$post_data['post_status'] = null;
       
   241 		unset($post_data['post_status']);
       
   242 	} else {
       
   243 		$post_data['post_status'] = $post_data['_status'];
       
   244 	}
       
   245 	unset($post_data['_status']);
       
   246 
       
   247 	$post_IDs = array_map( 'intval', (array) $post_data['post'] );
       
   248 
       
   249 	$reset = array( 'post_author', 'post_status', 'post_password', 'post_parent', 'page_template', 'comment_status', 'ping_status', 'keep_private', 'tags_input', 'post_category', 'sticky' );
       
   250 	foreach ( $reset as $field ) {
       
   251 		if ( isset($post_data[$field]) && ( '' == $post_data[$field] || -1 == $post_data[$field] ) )
       
   252 			unset($post_data[$field]);
       
   253 	}
       
   254 
       
   255 	if ( isset($post_data['post_category']) ) {
       
   256 		if ( is_array($post_data['post_category']) && ! empty($post_data['post_category']) )
       
   257 			$new_cats = array_map( 'absint', $post_data['post_category'] );
       
   258 		else
       
   259 			unset($post_data['post_category']);
       
   260 	}
       
   261 
       
   262 	if ( isset($post_data['tags_input']) ) {
       
   263 		$new_tags = preg_replace( '/\s*,\s*/', ',', rtrim( trim($post_data['tags_input']), ' ,' ) );
       
   264 		$new_tags = explode(',', $new_tags);
       
   265 	}
       
   266 
       
   267 	if ( isset($post_data['post_parent']) && ($parent = (int) $post_data['post_parent']) ) {
       
   268 		$pages = $wpdb->get_results("SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'page'");
       
   269 		$children = array();
       
   270 
       
   271 		for ( $i = 0; $i < 50 && $parent > 0; $i++ ) {
       
   272 			$children[] = $parent;
       
   273 
       
   274 			foreach ( $pages as $page ) {
       
   275 				if ( $page->ID == $parent ) {
       
   276 					$parent = $page->post_parent;
       
   277 					break;
       
   278 				}
       
   279 			}
       
   280 		}
       
   281 	}
       
   282 
       
   283 	$updated = $skipped = $locked = array();
       
   284 	foreach ( $post_IDs as $post_ID ) {
       
   285 
       
   286 		if ( isset($children) && in_array($post_ID, $children) ) {
       
   287 			$skipped[] = $post_ID;
       
   288 			continue;
       
   289 		}
       
   290 
       
   291 		if ( wp_check_post_lock( $post_ID ) ) {
       
   292 			$locked[] = $post_ID;
       
   293 			continue;
       
   294 		}
       
   295 
       
   296 		if ( isset($new_cats) ) {
       
   297 			$cats = (array) wp_get_post_categories($post_ID);
       
   298 			$post_data['post_category'] = array_unique( array_merge($cats, $new_cats) );
       
   299 		}
       
   300 
       
   301 		if ( isset($new_tags) ) {
       
   302 			$tags = wp_get_post_tags($post_ID, array('fields' => 'names'));
       
   303 			$post_data['tags_input'] = array_unique( array_merge($tags, $new_tags) );
       
   304 		}
       
   305 
       
   306 		$post_data['ID'] = $post_ID;
       
   307 		$updated[] = wp_update_post( $post_data );
       
   308 
       
   309 		if ( isset( $post_data['sticky'] ) && current_user_can( 'edit_others_posts' ) ) {
       
   310 			if ( 'sticky' == $post_data['sticky'] )
       
   311 				stick_post( $post_ID );
       
   312 			else
       
   313 				unstick_post( $post_ID );
       
   314 		}
       
   315 
       
   316 	}
       
   317 
       
   318 	return array( 'updated' => $updated, 'skipped' => $skipped, 'locked' => $locked );
       
   319 }
       
   320 
       
   321 /**
       
   322  * Default post information to use when populating the "Write Post" form.
       
   323  *
       
   324  * @since unknown
       
   325  *
       
   326  * @return unknown
       
   327  */
       
   328 function get_default_post_to_edit() {
       
   329 
       
   330 	$post_title = '';
       
   331 	if ( !empty( $_REQUEST['post_title'] ) )
       
   332 		$post_title = esc_html( stripslashes( $_REQUEST['post_title'] ));
       
   333 
       
   334 	$post_content = '';
       
   335 	if ( !empty( $_REQUEST['content'] ) )
       
   336 		$post_content = esc_html( stripslashes( $_REQUEST['content'] ));
       
   337 
       
   338 	$post_excerpt = '';
       
   339 	if ( !empty( $_REQUEST['excerpt'] ) )
       
   340 		$post_excerpt = esc_html( stripslashes( $_REQUEST['excerpt'] ));
       
   341 
       
   342 	$post->ID = 0;
       
   343 	$post->post_name = '';
       
   344 	$post->post_author = '';
       
   345 	$post->post_date = '';
       
   346 	$post->post_date_gmt = '';
       
   347 	$post->post_password = '';
       
   348 	$post->post_status = 'draft';
       
   349 	$post->post_type = 'post';
       
   350 	$post->to_ping = '';
       
   351 	$post->pinged = '';
       
   352 	$post->comment_status = get_option( 'default_comment_status' );
       
   353 	$post->ping_status = get_option( 'default_ping_status' );
       
   354 	$post->post_pingback = get_option( 'default_pingback_flag' );
       
   355 	$post->post_category = get_option( 'default_category' );
       
   356 	$post->post_content = apply_filters( 'default_content', $post_content);
       
   357 	$post->post_title = apply_filters( 'default_title', $post_title );
       
   358 	$post->post_excerpt = apply_filters( 'default_excerpt', $post_excerpt);
       
   359 	$post->page_template = 'default';
       
   360 	$post->post_parent = 0;
       
   361 	$post->menu_order = 0;
       
   362 
       
   363 	return $post;
       
   364 }
       
   365 
       
   366 /**
       
   367  * {@internal Missing Short Description}}
       
   368  *
       
   369  * @since unknown
       
   370  *
       
   371  * @return unknown
       
   372  */
       
   373 function get_default_page_to_edit() {
       
   374 	$page = get_default_post_to_edit();
       
   375 	$page->post_type = 'page';
       
   376 	return $page;
       
   377 }
       
   378 
       
   379 /**
       
   380  * Get an existing post and format it for editing.
       
   381  *
       
   382  * @since unknown
       
   383  *
       
   384  * @param unknown_type $id
       
   385  * @return unknown
       
   386  */
       
   387 function get_post_to_edit( $id ) {
       
   388 
       
   389 	$post = get_post( $id, OBJECT, 'edit' );
       
   390 
       
   391 	if ( $post->post_type == 'page' )
       
   392 		$post->page_template = get_post_meta( $id, '_wp_page_template', true );
       
   393 
       
   394 	return $post;
       
   395 }
       
   396 
       
   397 /**
       
   398  * Determine if a post exists based on title, content, and date
       
   399  *
       
   400  * @since unknown
       
   401  *
       
   402  * @param string $title Post title
       
   403  * @param string $content Optional post content
       
   404  * @param string $date Optional post date
       
   405  * @return int Post ID if post exists, 0 otherwise.
       
   406  */
       
   407 function post_exists($title, $content = '', $date = '') {
       
   408 	global $wpdb;
       
   409 
       
   410 	$post_title = stripslashes( sanitize_post_field( 'post_title', $title, 0, 'db' ) );
       
   411 	$post_content = stripslashes( sanitize_post_field( 'post_content', $content, 0, 'db' ) );
       
   412 	$post_date = stripslashes( sanitize_post_field( 'post_date', $date, 0, 'db' ) );
       
   413 
       
   414 	$query = "SELECT ID FROM $wpdb->posts WHERE 1=1";
       
   415 	$args = array();
       
   416 
       
   417 	if ( !empty ( $date ) ) {
       
   418 		$query .= ' AND post_date = %s';
       
   419 		$args[] = $post_date;
       
   420 	}
       
   421 
       
   422 	if ( !empty ( $title ) ) {
       
   423 		$query .= ' AND post_title = %s';
       
   424 		$args[] = $post_title;
       
   425 	}
       
   426 
       
   427 	if ( !empty ( $content ) ) {
       
   428 		$query .= 'AND post_content = %s';
       
   429 		$args[] = $post_content;
       
   430 	}
       
   431 
       
   432 	if ( !empty ( $args ) )
       
   433 		return $wpdb->get_var( $wpdb->prepare($query, $args) );
       
   434 
       
   435 	return 0;
       
   436 }
       
   437 
       
   438 /**
       
   439  * Creates a new post from the "Write Post" form using $_POST information.
       
   440  *
       
   441  * @since unknown
       
   442  *
       
   443  * @return unknown
       
   444  */
       
   445 function wp_write_post() {
       
   446 	global $user_ID;
       
   447 
       
   448 	if ( 'page' == $_POST['post_type'] ) {
       
   449 		if ( !current_user_can( 'edit_pages' ) )
       
   450 			return new WP_Error( 'edit_pages', __( 'You are not allowed to create pages on this blog.' ) );
       
   451 	} else {
       
   452 		if ( !current_user_can( 'edit_posts' ) )
       
   453 			return new WP_Error( 'edit_posts', __( 'You are not allowed to create posts or drafts on this blog.' ) );
       
   454 	}
       
   455 
       
   456 
       
   457 	// Check for autosave collisions
       
   458 	$temp_id = false;
       
   459 	if ( isset($_POST['temp_ID']) ) {
       
   460 		$temp_id = (int) $_POST['temp_ID'];
       
   461 		if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
       
   462 			$draft_ids = array();
       
   463 		foreach ( $draft_ids as $temp => $real )
       
   464 			if ( time() + $temp > 86400 ) // 1 day: $temp is equal to -1 * time( then )
       
   465 				unset($draft_ids[$temp]);
       
   466 
       
   467 		if ( isset($draft_ids[$temp_id]) ) { // Edit, don't write
       
   468 			$_POST['post_ID'] = $draft_ids[$temp_id];
       
   469 			unset($_POST['temp_ID']);
       
   470 			update_user_option( $user_ID, 'autosave_draft_ids', $draft_ids );
       
   471 			return edit_post();
       
   472 		}
       
   473 	}
       
   474 
       
   475 	$translated = _wp_translate_postdata( false );
       
   476 	if ( is_wp_error($translated) )
       
   477 		return $translated;
       
   478 
       
   479 	if ( isset($_POST['visibility']) ) {
       
   480 		switch ( $_POST['visibility'] ) {
       
   481 			case 'public' :
       
   482 				$_POST['post_password'] = '';
       
   483 				break;
       
   484 			case 'password' :
       
   485 				unset( $_POST['sticky'] );
       
   486 				break;
       
   487 			case 'private' :
       
   488 				$_POST['post_status'] = 'private';
       
   489 				$_POST['post_password'] = '';
       
   490 				unset( $_POST['sticky'] );
       
   491 				break;
       
   492 		}
       
   493 	}
       
   494 
       
   495 	// Create the post.
       
   496 	$post_ID = wp_insert_post( $_POST );
       
   497 	if ( is_wp_error( $post_ID ) )
       
   498 		return $post_ID;
       
   499 
       
   500 	if ( empty($post_ID) )
       
   501 		return 0;
       
   502 
       
   503 	add_meta( $post_ID );
       
   504 
       
   505 	// Reunite any orphaned attachments with their parent
       
   506 	if ( !$draft_ids = get_user_option( 'autosave_draft_ids' ) )
       
   507 		$draft_ids = array();
       
   508 	if ( $draft_temp_id = (int) array_search( $post_ID, $draft_ids ) )
       
   509 		_relocate_children( $draft_temp_id, $post_ID );
       
   510 	if ( $temp_id && $temp_id != $draft_temp_id )
       
   511 		_relocate_children( $temp_id, $post_ID );
       
   512 
       
   513 	// Update autosave collision detection
       
   514 	if ( $temp_id ) {
       
   515 		$draft_ids[$temp_id] = $post_ID;
       
   516 		update_user_option( $user_ID, 'autosave_draft_ids', $draft_ids );
       
   517 	}
       
   518 
       
   519 	// Now that we have an ID we can fix any attachment anchor hrefs
       
   520 	_fix_attachment_links( $post_ID );
       
   521 
       
   522 	wp_set_post_lock( $post_ID, $GLOBALS['current_user']->ID );
       
   523 
       
   524 	return $post_ID;
       
   525 }
       
   526 
       
   527 /**
       
   528  * Calls wp_write_post() and handles the errors.
       
   529  *
       
   530  * @since unknown
       
   531  *
       
   532  * @return unknown
       
   533  */
       
   534 function write_post() {
       
   535 	$result = wp_write_post();
       
   536 	if( is_wp_error( $result ) )
       
   537 		wp_die( $result->get_error_message() );
       
   538 	else
       
   539 		return $result;
       
   540 }
       
   541 
       
   542 //
       
   543 // Post Meta
       
   544 //
       
   545 
       
   546 /**
       
   547  * {@internal Missing Short Description}}
       
   548  *
       
   549  * @since unknown
       
   550  *
       
   551  * @param unknown_type $post_ID
       
   552  * @return unknown
       
   553  */
       
   554 function add_meta( $post_ID ) {
       
   555 	global $wpdb;
       
   556 	$post_ID = (int) $post_ID;
       
   557 
       
   558 	$protected = array( '_wp_attached_file', '_wp_attachment_metadata', '_wp_old_slug', '_wp_page_template' );
       
   559 
       
   560 	$metakeyselect = isset($_POST['metakeyselect']) ? stripslashes( trim( $_POST['metakeyselect'] ) ) : '';
       
   561 	$metakeyinput = isset($_POST['metakeyinput']) ? stripslashes( trim( $_POST['metakeyinput'] ) ) : '';
       
   562 	$metavalue = isset($_POST['metavalue']) ? maybe_serialize( stripslashes_deep( $_POST['metavalue'] ) ) : '';
       
   563 	if ( is_string($metavalue) )
       
   564 		$metavalue = trim( $metavalue );
       
   565 
       
   566 	if ( ('0' === $metavalue || !empty ( $metavalue ) ) && ((('#NONE#' != $metakeyselect) && !empty ( $metakeyselect) ) || !empty ( $metakeyinput) ) ) {
       
   567 		// We have a key/value pair. If both the select and the
       
   568 		// input for the key have data, the input takes precedence:
       
   569 
       
   570  		if ('#NONE#' != $metakeyselect)
       
   571 			$metakey = $metakeyselect;
       
   572 
       
   573 		if ( $metakeyinput)
       
   574 			$metakey = $metakeyinput; // default
       
   575 
       
   576 		if ( in_array($metakey, $protected) )
       
   577 			return false;
       
   578 
       
   579 		wp_cache_delete($post_ID, 'post_meta');
       
   580 
       
   581 		$wpdb->query( $wpdb->prepare("INSERT INTO $wpdb->postmeta (post_id,meta_key,meta_value ) VALUES (%s, %s, %s)", $post_ID, $metakey, $metavalue) );
       
   582 		do_action( 'added_postmeta', $wpdb->insert_id, $post_ID, $metakey, $metavalue );
       
   583 
       
   584 		return $wpdb->insert_id;
       
   585 	}
       
   586 	return false;
       
   587 } // add_meta
       
   588 
       
   589 /**
       
   590  * {@internal Missing Short Description}}
       
   591  *
       
   592  * @since unknown
       
   593  *
       
   594  * @param unknown_type $mid
       
   595  * @return unknown
       
   596  */
       
   597 function delete_meta( $mid ) {
       
   598 	global $wpdb;
       
   599 	$mid = (int) $mid;
       
   600 
       
   601 	$post_id = $wpdb->get_var( $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_id = %d", $mid) );
       
   602 
       
   603 	do_action( 'delete_postmeta', $mid );
       
   604 	wp_cache_delete($post_id, 'post_meta');
       
   605 	$rval = $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->postmeta WHERE meta_id = %d", $mid) );
       
   606 	do_action( 'deleted_postmeta', $mid );
       
   607 
       
   608 	return $rval;
       
   609 }
       
   610 
       
   611 /**
       
   612  * Get a list of previously defined keys.
       
   613  *
       
   614  * @since unknown
       
   615  *
       
   616  * @return unknown
       
   617  */
       
   618 function get_meta_keys() {
       
   619 	global $wpdb;
       
   620 
       
   621 	$keys = $wpdb->get_col( "
       
   622 			SELECT meta_key
       
   623 			FROM $wpdb->postmeta
       
   624 			GROUP BY meta_key
       
   625 			ORDER BY meta_key" );
       
   626 
       
   627 	return $keys;
       
   628 }
       
   629 
       
   630 /**
       
   631  * {@internal Missing Short Description}}
       
   632  *
       
   633  * @since unknown
       
   634  *
       
   635  * @param unknown_type $mid
       
   636  * @return unknown
       
   637  */
       
   638 function get_post_meta_by_id( $mid ) {
       
   639 	global $wpdb;
       
   640 	$mid = (int) $mid;
       
   641 
       
   642 	$meta = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->postmeta WHERE meta_id = %d", $mid) );
       
   643 	if ( is_serialized_string( $meta->meta_value ) )
       
   644 		$meta->meta_value = maybe_unserialize( $meta->meta_value );
       
   645 	return $meta;
       
   646 }
       
   647 
       
   648 /**
       
   649  * {@internal Missing Short Description}}
       
   650  *
       
   651  * Some postmeta stuff.
       
   652  *
       
   653  * @since unknown
       
   654  *
       
   655  * @param unknown_type $postid
       
   656  * @return unknown
       
   657  */
       
   658 function has_meta( $postid ) {
       
   659 	global $wpdb;
       
   660 
       
   661 	return $wpdb->get_results( $wpdb->prepare("SELECT meta_key, meta_value, meta_id, post_id
       
   662 			FROM $wpdb->postmeta WHERE post_id = %d
       
   663 			ORDER BY meta_key,meta_id", $postid), ARRAY_A );
       
   664 
       
   665 }
       
   666 
       
   667 /**
       
   668  * {@internal Missing Short Description}}
       
   669  *
       
   670  * @since unknown
       
   671  *
       
   672  * @param unknown_type $meta_id
       
   673  * @param unknown_type $meta_key
       
   674  * @param unknown_type $meta_value
       
   675  * @return unknown
       
   676  */
       
   677 function update_meta( $meta_id, $meta_key, $meta_value ) {
       
   678 	global $wpdb;
       
   679 
       
   680 	$protected = array( '_wp_attached_file', '_wp_attachment_metadata', '_wp_old_slug', '_wp_page_template' );
       
   681 
       
   682 	if ( in_array($meta_key, $protected) )
       
   683 		return false;
       
   684 
       
   685 	if ( '' === trim( $meta_value ) )
       
   686 		return false;
       
   687 
       
   688 	$post_id = $wpdb->get_var( $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_id = %d", $meta_id) );
       
   689 
       
   690 	$meta_value = maybe_serialize( stripslashes_deep( $meta_value ) );
       
   691 	$meta_id = (int) $meta_id;
       
   692 
       
   693 	$data  = compact( 'meta_key', 'meta_value' );
       
   694 	$where = compact( 'meta_id' );
       
   695 
       
   696 	do_action( 'update_postmeta', $meta_id, $post_id, $meta_key, $meta_value );
       
   697 	$rval = $wpdb->update( $wpdb->postmeta, $data, $where );
       
   698 	wp_cache_delete($post_id, 'post_meta');
       
   699 	do_action( 'updated_postmeta', $meta_id, $post_id, $meta_key, $meta_value );
       
   700 
       
   701 	return $rval;
       
   702 }
       
   703 
       
   704 //
       
   705 // Private
       
   706 //
       
   707 
       
   708 /**
       
   709  * Replace hrefs of attachment anchors with up-to-date permalinks.
       
   710  *
       
   711  * @since unknown
       
   712  * @access private
       
   713  *
       
   714  * @param unknown_type $post_ID
       
   715  * @return unknown
       
   716  */
       
   717 function _fix_attachment_links( $post_ID ) {
       
   718 	global $_fix_attachment_link_id;
       
   719 
       
   720 	$post = & get_post( $post_ID, ARRAY_A );
       
   721 
       
   722 	$search = "#<a[^>]+rel=('|\")[^'\"]*attachment[^>]*>#ie";
       
   723 
       
   724 	// See if we have any rel="attachment" links
       
   725 	if ( 0 == preg_match_all( $search, $post['post_content'], $anchor_matches, PREG_PATTERN_ORDER ) )
       
   726 		return;
       
   727 
       
   728 	$i = 0;
       
   729 	$search = "#[\s]+rel=(\"|')(.*?)wp-att-(\d+)\\1#i";
       
   730 	foreach ( $anchor_matches[0] as $anchor ) {
       
   731 		if ( 0 == preg_match( $search, $anchor, $id_matches ) )
       
   732 			continue;
       
   733 
       
   734 		$id = (int) $id_matches[3];
       
   735 
       
   736 		// While we have the attachment ID, let's adopt any orphans.
       
   737 		$attachment = & get_post( $id, ARRAY_A );
       
   738 		if ( ! empty( $attachment) && ! is_object( get_post( $attachment['post_parent'] ) ) ) {
       
   739 			$attachment['post_parent'] = $post_ID;
       
   740 			// Escape data pulled from DB.
       
   741 			$attachment = add_magic_quotes( $attachment);
       
   742 			wp_update_post( $attachment);
       
   743 		}
       
   744 
       
   745 		$post_search[$i] = $anchor;
       
   746 		 $_fix_attachment_link_id = $id;
       
   747 		$post_replace[$i] = preg_replace_callback( "#href=(\"|')[^'\"]*\\1#", '_fix_attachment_links_replace_cb', $anchor );
       
   748 		++$i;
       
   749 	}
       
   750 
       
   751 	$post['post_content'] = str_replace( $post_search, $post_replace, $post['post_content'] );
       
   752 
       
   753 	// Escape data pulled from DB.
       
   754 	$post = add_magic_quotes( $post);
       
   755 
       
   756 	return wp_update_post( $post);
       
   757 }
       
   758 
       
   759 function _fix_attachment_links_replace_cb($match) {
       
   760         global $_fix_attachment_link_id;
       
   761         return stripslashes( 'href='.$match[1] ).get_attachment_link( $_fix_attachment_link_id ).stripslashes( $match[1] );
       
   762 }
       
   763 
       
   764 /**
       
   765  * Move child posts to a new parent.
       
   766  *
       
   767  * @since unknown
       
   768  * @access private
       
   769  *
       
   770  * @param unknown_type $old_ID
       
   771  * @param unknown_type $new_ID
       
   772  * @return unknown
       
   773  */
       
   774 function _relocate_children( $old_ID, $new_ID ) {
       
   775 	global $wpdb;
       
   776 	$old_ID = (int) $old_ID;
       
   777 	$new_ID = (int) $new_ID;
       
   778 
       
   779 	$children = $wpdb->get_col( $wpdb->prepare("
       
   780 		SELECT post_id
       
   781 		FROM $wpdb->postmeta
       
   782 		WHERE meta_key = '_wp_attachment_temp_parent'
       
   783 		AND meta_value = %d", $old_ID) );
       
   784 
       
   785 	foreach ( $children as $child_id ) {
       
   786 		$wpdb->update($wpdb->posts, array('post_parent' => $new_ID), array('ID' => $child_id) );
       
   787 		delete_post_meta($child_id, '_wp_attachment_temp_parent');
       
   788 	}
       
   789 }
       
   790 
       
   791 /**
       
   792  * {@internal Missing Short Description}}
       
   793  *
       
   794  * @since unknown
       
   795  *
       
   796  * @param unknown_type $type
       
   797  * @return unknown
       
   798  */
       
   799 function get_available_post_statuses($type = 'post') {
       
   800 	$stati = wp_count_posts($type);
       
   801 
       
   802 	return array_keys(get_object_vars($stati));
       
   803 }
       
   804 
       
   805 /**
       
   806  * {@internal Missing Short Description}}
       
   807  *
       
   808  * @since unknown
       
   809  *
       
   810  * @param unknown_type $q
       
   811  * @return unknown
       
   812  */
       
   813 function wp_edit_posts_query( $q = false ) {
       
   814 	if ( false === $q )
       
   815 		$q = $_GET;
       
   816 	$q['m']   = isset($q['m']) ? (int) $q['m'] : 0;
       
   817 	$q['cat'] = isset($q['cat']) ? (int) $q['cat'] : 0;
       
   818 	$post_stati  = array(	//	array( adj, noun )
       
   819 				'publish' => array(_x('Published', 'post'), __('Published posts'), _n_noop('Published <span class="count">(%s)</span>', 'Published <span class="count">(%s)</span>')),
       
   820 				'future' => array(_x('Scheduled', 'post'), __('Scheduled posts'), _n_noop('Scheduled <span class="count">(%s)</span>', 'Scheduled <span class="count">(%s)</span>')),
       
   821 				'pending' => array(_x('Pending Review', 'post'), __('Pending posts'), _n_noop('Pending Review <span class="count">(%s)</span>', 'Pending Review <span class="count">(%s)</span>')),
       
   822 				'draft' => array(_x('Draft', 'post'), _x('Drafts', 'manage posts header'), _n_noop('Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>')),
       
   823 				'private' => array(_x('Private', 'post'), __('Private posts'), _n_noop('Private <span class="count">(%s)</span>', 'Private <span class="count">(%s)</span>')),
       
   824 				'trash' => array(_x('Trash', 'post'), __('Trash posts'), _n_noop('Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>')),
       
   825 			);
       
   826 
       
   827 	$post_stati = apply_filters('post_stati', $post_stati);
       
   828 
       
   829 	$avail_post_stati = get_available_post_statuses('post');
       
   830 
       
   831 	$post_status_q = '';
       
   832 	if ( isset($q['post_status']) && in_array( $q['post_status'], array_keys($post_stati) ) ) {
       
   833 		$post_status_q = '&post_status=' . $q['post_status'];
       
   834 		$post_status_q .= '&perm=readable';
       
   835 	}
       
   836 
       
   837 	if ( isset($q['post_status']) && 'pending' === $q['post_status'] ) {
       
   838 		$order = 'ASC';
       
   839 		$orderby = 'modified';
       
   840 	} elseif ( isset($q['post_status']) && 'draft' === $q['post_status'] ) {
       
   841 		$order = 'DESC';
       
   842 		$orderby = 'modified';
       
   843 	} else {
       
   844 		$order = 'DESC';
       
   845 		$orderby = 'date';
       
   846 	}
       
   847 
       
   848 	$posts_per_page = (int) get_user_option( 'edit_per_page', 0, false );
       
   849 	if ( empty( $posts_per_page ) || $posts_per_page < 1 )
       
   850 		$posts_per_page = 15;
       
   851 	$posts_per_page = apply_filters( 'edit_posts_per_page', $posts_per_page );
       
   852 
       
   853 	wp("post_type=post&$post_status_q&posts_per_page=$posts_per_page&order=$order&orderby=$orderby");
       
   854 
       
   855 	return array($post_stati, $avail_post_stati);
       
   856 }
       
   857 
       
   858 /**
       
   859  * Get default post mime types
       
   860  *
       
   861  * @since 2.9.0
       
   862  *
       
   863  * @return array
       
   864  */
       
   865 function get_post_mime_types() {
       
   866 	$post_mime_types = array(	//	array( adj, noun )
       
   867 		'image' => array(__('Images'), __('Manage Images'), _n_noop('Image <span class="count">(%s)</span>', 'Images <span class="count">(%s)</span>')),
       
   868 		'audio' => array(__('Audio'), __('Manage Audio'), _n_noop('Audio <span class="count">(%s)</span>', 'Audio <span class="count">(%s)</span>')),
       
   869 		'video' => array(__('Video'), __('Manage Video'), _n_noop('Video <span class="count">(%s)</span>', 'Video <span class="count">(%s)</span>')),
       
   870 	);
       
   871 
       
   872 	return apply_filters('post_mime_types', $post_mime_types);
       
   873 }
       
   874 
       
   875 /**
       
   876  * {@internal Missing Short Description}}
       
   877  *
       
   878  * @since unknown
       
   879  *
       
   880  * @param unknown_type $type
       
   881  * @return unknown
       
   882  */
       
   883 function get_available_post_mime_types($type = 'attachment') {
       
   884 	global $wpdb;
       
   885 
       
   886 	$types = $wpdb->get_col($wpdb->prepare("SELECT DISTINCT post_mime_type FROM $wpdb->posts WHERE post_type = %s", $type));
       
   887 	return $types;
       
   888 }
       
   889 
       
   890 /**
       
   891  * {@internal Missing Short Description}}
       
   892  *
       
   893  * @since unknown
       
   894  *
       
   895  * @param unknown_type $q
       
   896  * @return unknown
       
   897  */
       
   898 function wp_edit_attachments_query( $q = false ) {
       
   899 	if ( false === $q )
       
   900 		$q = $_GET;
       
   901 
       
   902 	$q['m']   = isset( $q['m'] ) ? (int) $q['m'] : 0;
       
   903 	$q['cat'] = isset( $q['cat'] ) ? (int) $q['cat'] : 0;
       
   904 	$q['post_type'] = 'attachment';
       
   905 	$q['post_status'] = isset( $q['status'] ) && 'trash' == $q['status'] ? 'trash' : 'inherit';
       
   906 	$media_per_page = (int) get_user_option( 'upload_per_page', 0, false );
       
   907 	if ( empty( $media_per_page ) || $media_per_page < 1 )
       
   908 		$media_per_page = 20;
       
   909 	$q['posts_per_page'] = apply_filters( 'upload_per_page', $media_per_page );
       
   910 
       
   911 	$post_mime_types = get_post_mime_types();
       
   912 	$avail_post_mime_types = get_available_post_mime_types('attachment');
       
   913 
       
   914 	if ( isset($q['post_mime_type']) && !array_intersect( (array) $q['post_mime_type'], array_keys($post_mime_types) ) )
       
   915 		unset($q['post_mime_type']);
       
   916 
       
   917 	wp($q);
       
   918 
       
   919 	return array($post_mime_types, $avail_post_mime_types);
       
   920 }
       
   921 
       
   922 /**
       
   923  * {@internal Missing Short Description}}
       
   924  *
       
   925  * @since unknown
       
   926  *
       
   927  * @param unknown_type $id
       
   928  * @param unknown_type $page
       
   929  * @return unknown
       
   930  */
       
   931 function postbox_classes( $id, $page ) {
       
   932 	if ( isset( $_GET['edit'] ) && $_GET['edit'] == $id )
       
   933 		return '';
       
   934 	$current_user = wp_get_current_user();
       
   935 	if ( $closed = get_user_option('closedpostboxes_'.$page, 0, false ) ) {
       
   936 		if ( !is_array( $closed ) ) return '';
       
   937 		return in_array( $id, $closed )? 'closed' : '';
       
   938 	} else {
       
   939 		return '';
       
   940 	}
       
   941 }
       
   942 
       
   943 /**
       
   944  * {@internal Missing Short Description}}
       
   945  *
       
   946  * @since unknown
       
   947  *
       
   948  * @param int|object $id    Post ID or post object. 
       
   949  * @param string $title (optional) Title 
       
   950  * @param string $name (optional) Name 
       
   951  * @return array With two entries of type string 
       
   952  */
       
   953 function get_sample_permalink($id, $title = null, $name = null) {
       
   954 	$post = &get_post($id);
       
   955 	if (!$post->ID) {
       
   956 		return array('', '');
       
   957 	}
       
   958 	$original_status = $post->post_status;
       
   959 	$original_date = $post->post_date;
       
   960 	$original_name = $post->post_name;
       
   961 
       
   962 	// Hack: get_permalink would return ugly permalink for
       
   963 	// drafts, so we will fake, that our post is published
       
   964 	if (in_array($post->post_status, array('draft', 'pending'))) {
       
   965 		$post->post_status = 'publish';
       
   966 		$post->post_name = sanitize_title($post->post_name ? $post->post_name : $post->post_title, $post->ID);
       
   967 	}
       
   968 
       
   969 	$post->post_name = wp_unique_post_slug($post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent);
       
   970 
       
   971 	// If the user wants to set a new name -- override the current one
       
   972 	// Note: if empty name is supplied -- use the title instead, see #6072
       
   973 	if (!is_null($name)) {
       
   974 		$post->post_name = sanitize_title($name ? $name : $title, $post->ID);
       
   975 	}
       
   976 
       
   977 	$post->filter = 'sample';
       
   978 
       
   979 	$permalink = get_permalink($post, true);
       
   980 
       
   981 	// Handle page hierarchy
       
   982 	if ( 'page' == $post->post_type ) {
       
   983 		$uri = get_page_uri($post->ID);
       
   984 		$uri = untrailingslashit($uri);
       
   985 		$uri = strrev( stristr( strrev( $uri ), '/' ) );
       
   986 		$uri = untrailingslashit($uri);
       
   987 		if ( !empty($uri) )
       
   988 			$uri .='/';
       
   989 		$permalink = str_replace('%pagename%', "${uri}%pagename%", $permalink);
       
   990 	}
       
   991 
       
   992 	$permalink = array($permalink, apply_filters('editable_slug', $post->post_name));
       
   993 	$post->post_status = $original_status;
       
   994 	$post->post_date = $original_date;
       
   995 	$post->post_name = $original_name;
       
   996 	unset($post->filter);
       
   997 
       
   998 	return $permalink;
       
   999 }
       
  1000 
       
  1001 /**
       
  1002  * sample permalink html
       
  1003  *
       
  1004  * intended to be used for the inplace editor of the permalink post slug on in the post (and page?) editor.
       
  1005  * 
       
  1006  * @since unknown
       
  1007  *
       
  1008  * @param int|object $id Post ID or post object. 
       
  1009  * @param string $new_title (optional) New title  
       
  1010  * @param string $new_slug (optional) New slug 
       
  1011  * @return string intended to be used for the inplace editor of the permalink post slug on in the post (and page?) editor. 
       
  1012  */
       
  1013 function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
       
  1014 	$post = &get_post($id);
       
  1015 	list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);
       
  1016 
       
  1017 	if ( 'publish' == $post->post_status ) {
       
  1018 		$view_post = 'post' == $post->post_type ? __('View Post') : __('View Page');
       
  1019 		$title = __('Click to edit this part of the permalink');
       
  1020 	} else {
       
  1021 		$title = __('Temporary permalink. Click to edit this part.');
       
  1022 	}
       
  1023 
       
  1024 	if ( false === strpos($permalink, '%postname%') && false === strpos($permalink, '%pagename%') ) {
       
  1025 		$return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink">' . $permalink . "</span>\n";
       
  1026 		if ( current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) )
       
  1027 			$return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button" target="_blank">' . __('Change Permalinks') . "</a></span>\n";
       
  1028 		if ( isset($view_post) )
       
  1029 			$return .= "<span id='view-post-btn'><a href='$permalink' class='button' target='_blank'>$view_post</a></span>\n";
       
  1030 
       
  1031 		$return = apply_filters('get_sample_permalink_html', $return, $id, $new_title, $new_slug);
       
  1032 
       
  1033 		return $return;
       
  1034 	}
       
  1035 
       
  1036 	if ( function_exists('mb_strlen') ) {
       
  1037 		if ( mb_strlen($post_name) > 30 ) {
       
  1038 			$post_name_abridged = mb_substr($post_name, 0, 14). '&hellip;' . mb_substr($post_name, -14);
       
  1039 		} else {
       
  1040 			$post_name_abridged = $post_name;
       
  1041 		}
       
  1042 	} else {
       
  1043 		if ( strlen($post_name) > 30 ) {
       
  1044 			$post_name_abridged = substr($post_name, 0, 14). '&hellip;' . substr($post_name, -14);
       
  1045 		} else {
       
  1046 			$post_name_abridged = $post_name;
       
  1047 		}
       
  1048 	}
       
  1049 
       
  1050 	$post_name_html = '<span id="editable-post-name" title="' . $title . '">' . $post_name_abridged . '</span>';
       
  1051 	$display_link = str_replace(array('%pagename%','%postname%'), $post_name_html, $permalink);
       
  1052 	$view_link = str_replace(array('%pagename%','%postname%'), $post_name, $permalink);
       
  1053 	$return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink">' . $display_link . "</span>\n";
       
  1054 	$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";
       
  1055 	$return .= '<span id="editable-post-name-full">' . $post_name . "</span>\n";
       
  1056 	if ( isset($view_post) )
       
  1057 		$return .= "<span id='view-post-btn'><a href='$view_link' class='button' target='_blank'>$view_post</a></span>\n";
       
  1058 
       
  1059 	$return = apply_filters('get_sample_permalink_html', $return, $id, $new_title, $new_slug);
       
  1060 
       
  1061 	return $return;
       
  1062 }
       
  1063 
       
  1064 /**
       
  1065  * Output HTML for the post thumbnail meta-box.
       
  1066  *
       
  1067  * @since 2.9.0
       
  1068  *
       
  1069  * @param int $thumbnail_id ID of the attachment used for thumbnail
       
  1070  * @return string html
       
  1071  */
       
  1072 function _wp_post_thumbnail_html( $thumbnail_id = NULL ) {
       
  1073 	global $content_width, $_wp_additional_image_sizes;
       
  1074 	$content = '<p class="hide-if-no-js"><a href="#" id="set-post-thumbnail" onclick="jQuery(\'#add_image\').click();return false;">' . esc_html__( 'Set thumbnail' ) . '</a></p>';
       
  1075 
       
  1076 	if ( $thumbnail_id && get_post( $thumbnail_id ) ) {
       
  1077 		$old_content_width = $content_width;
       
  1078 		$content_width = 266;
       
  1079 		if ( !isset( $_wp_additional_image_sizes['post-thumbnail'] ) )
       
  1080 			$thumbnail_html = wp_get_attachment_image( $thumbnail_id, array( $content_width, $content_width ) );
       
  1081 		else
       
  1082 			$thumbnail_html = wp_get_attachment_image( $thumbnail_id, 'post-thumbnail' );
       
  1083 		if ( !empty( $thumbnail_html ) ) {
       
  1084 			$content = '<a href="#" id="set-post-thumbnail" onclick="jQuery(\'#add_image\').click();return false;">' . $thumbnail_html . '</a>';
       
  1085 			$content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail" onclick="WPRemoveThumbnail();return false;">' . esc_html__( 'Remove thumbnail' ) . '</a></p>';
       
  1086 		}
       
  1087 		$content_width = $old_content_width;
       
  1088 	}
       
  1089 
       
  1090 	return apply_filters( 'admin_post_thumbnail_html', $content );
       
  1091 }
       
  1092 
       
  1093 /**
       
  1094  * Check to see if the post is currently being edited by another user.
       
  1095  *
       
  1096  * @since 2.5.0
       
  1097  *
       
  1098  * @param int $post_id ID of the post to check for editing
       
  1099  * @return bool|int False: not locked or locked by current user. Int: user ID of user with lock.
       
  1100  */
       
  1101 function wp_check_post_lock( $post_id ) {
       
  1102 	global $current_user;
       
  1103 
       
  1104 	if ( !$post = get_post( $post_id ) )
       
  1105 		return false;
       
  1106 
       
  1107 	$lock = get_post_meta( $post->ID, '_edit_lock', true );
       
  1108 	$last = get_post_meta( $post->ID, '_edit_last', true );
       
  1109 
       
  1110 	$time_window = apply_filters( 'wp_check_post_lock_window', AUTOSAVE_INTERVAL * 2 );
       
  1111 
       
  1112 	if ( $lock && $lock > time() - $time_window && $last != $current_user->ID )
       
  1113 		return $last;
       
  1114 	return false;
       
  1115 }
       
  1116 
       
  1117 /**
       
  1118  * Mark the post as currently being edited by the current user
       
  1119  *
       
  1120  * @since 2.5.0
       
  1121  *
       
  1122  * @param int $post_id ID of the post to being edited
       
  1123  * @return bool Returns false if the post doesn't exist of there is no current user
       
  1124  */
       
  1125 function wp_set_post_lock( $post_id ) {
       
  1126 	global $current_user;
       
  1127 	if ( !$post = get_post( $post_id ) )
       
  1128 		return false;
       
  1129 	if ( !$current_user || !$current_user->ID )
       
  1130 		return false;
       
  1131 
       
  1132 	$now = time();
       
  1133 
       
  1134 	if ( !add_post_meta( $post->ID, '_edit_lock', $now, true ) )
       
  1135 		update_post_meta( $post->ID, '_edit_lock', $now );
       
  1136 	if ( !add_post_meta( $post->ID, '_edit_last', $current_user->ID, true ) )
       
  1137 		update_post_meta( $post->ID, '_edit_last', $current_user->ID );
       
  1138 }
       
  1139 
       
  1140 /**
       
  1141  * Outputs the notice message to say that someone else is editing this post at the moment.
       
  1142  *
       
  1143  * @since 2.8.5
       
  1144  * @return none
       
  1145  */
       
  1146 function _admin_notice_post_locked() {
       
  1147 	global $post;
       
  1148 	$last_user = get_userdata( get_post_meta( $post->ID, '_edit_last', true ) );
       
  1149 	$last_user_name = $last_user ? $last_user->display_name : __('Somebody');
       
  1150 
       
  1151 	switch ($post->post_type) {
       
  1152 		case 'post':
       
  1153 			$message = __( 'Warning: %s is currently editing this post' );
       
  1154 			break;
       
  1155 		case 'page':
       
  1156 			$message = __( 'Warning: %s is currently editing this page' );
       
  1157 			break;
       
  1158 		default:
       
  1159 			$message = __( 'Warning: %s is currently editing this.' );
       
  1160 	}
       
  1161 
       
  1162 	$message = sprintf( $message, esc_html( $last_user_name ) );
       
  1163 	echo "<div class='error'><p>$message</p></div>";
       
  1164 }
       
  1165 
       
  1166 /**
       
  1167  * Creates autosave data for the specified post from $_POST data.
       
  1168  *
       
  1169  * @package WordPress
       
  1170  * @subpackage Post_Revisions
       
  1171  * @since 2.6.0
       
  1172  *
       
  1173  * @uses _wp_translate_postdata()
       
  1174  * @uses _wp_post_revision_fields()
       
  1175  */
       
  1176 function wp_create_post_autosave( $post_id ) {
       
  1177 	$translated = _wp_translate_postdata( true );
       
  1178 	if ( is_wp_error( $translated ) )
       
  1179 		return $translated;
       
  1180 
       
  1181 	// Only store one autosave.  If there is already an autosave, overwrite it.
       
  1182 	if ( $old_autosave = wp_get_post_autosave( $post_id ) ) {
       
  1183 		$new_autosave = _wp_post_revision_fields( $_POST, true );
       
  1184 		$new_autosave['ID'] = $old_autosave->ID;
       
  1185 		$current_user = wp_get_current_user();
       
  1186 		$new_autosave['post_author'] = $current_user->ID;
       
  1187 		return wp_update_post( $new_autosave );
       
  1188 	}
       
  1189 
       
  1190 	// _wp_put_post_revision() expects unescaped.
       
  1191 	$_POST = stripslashes_deep($_POST);
       
  1192 
       
  1193 	// Otherwise create the new autosave as a special post revision
       
  1194 	return _wp_put_post_revision( $_POST, true );
       
  1195 }
       
  1196 
       
  1197 /**
       
  1198  * Save draft or manually autosave for showing preview.
       
  1199  *
       
  1200  * @package WordPress
       
  1201  * @since 2.7
       
  1202  *
       
  1203  * @uses wp_write_post()
       
  1204  * @uses edit_post()
       
  1205  * @uses get_post()
       
  1206  * @uses current_user_can()
       
  1207  * @uses wp_create_post_autosave()
       
  1208  *
       
  1209  * @return str URL to redirect to show the preview
       
  1210  */
       
  1211 function post_preview() {
       
  1212 
       
  1213 	$post_ID = (int) $_POST['post_ID'];
       
  1214 	if ( $post_ID < 1 )
       
  1215 		wp_die( __('Preview not available. Please save as a draft first.') );
       
  1216 
       
  1217 	if ( isset($_POST['catslist']) )
       
  1218 		$_POST['post_category'] = explode(",", $_POST['catslist']);
       
  1219 
       
  1220 	if ( isset($_POST['tags_input']) )
       
  1221 		$_POST['tags_input'] = explode(",", $_POST['tags_input']);
       
  1222 
       
  1223 	if ( $_POST['post_type'] == 'page' || empty($_POST['post_category']) )
       
  1224 		unset($_POST['post_category']);
       
  1225 
       
  1226 	$_POST['ID'] = $post_ID;
       
  1227 	$post = get_post($post_ID);
       
  1228 
       
  1229 	if ( 'page' == $post->post_type ) {
       
  1230 		if ( !current_user_can('edit_page', $post_ID) )
       
  1231 			wp_die(__('You are not allowed to edit this page.'));
       
  1232 	} else {
       
  1233 		if ( !current_user_can('edit_post', $post_ID) )
       
  1234 			wp_die(__('You are not allowed to edit this post.'));
       
  1235 	}
       
  1236 
       
  1237 	if ( 'draft' == $post->post_status ) {
       
  1238 		$id = edit_post();
       
  1239 	} else { // Non drafts are not overwritten.  The autosave is stored in a special post revision.
       
  1240 		$id = wp_create_post_autosave( $post->ID );
       
  1241 		if ( ! is_wp_error($id) )
       
  1242 			$id = $post->ID;
       
  1243 	}
       
  1244 
       
  1245 	if ( is_wp_error($id) )
       
  1246 		wp_die( $id->get_error_message() );
       
  1247 
       
  1248 	if ( $_POST['post_status'] == 'draft'  ) {
       
  1249 		$url = add_query_arg( 'preview', 'true', get_permalink($id) );
       
  1250 	} else {
       
  1251 		$nonce = wp_create_nonce('post_preview_' . $id);
       
  1252 		$url = add_query_arg( array( 'preview' => 'true', 'preview_id' => $id, 'preview_nonce' => $nonce ), get_permalink($id) );
       
  1253 	}
       
  1254 
       
  1255 	return $url;
       
  1256 }
       
  1257 
       
  1258 /**
       
  1259  * Adds the TinyMCE editor used on the Write and Edit screens.
       
  1260  *
       
  1261  * @package WordPress
       
  1262  * @since 2.7
       
  1263  *
       
  1264  * TinyMCE is loaded separately from other Javascript by using wp-tinymce.php. It outputs concatenated
       
  1265  * and optionaly pre-compressed version of the core and all default plugins. Additional plugins are loaded
       
  1266  * directly by TinyMCE using non-blocking method. Custom plugins can be refreshed by adding a query string
       
  1267  * to the URL when queueing them with the mce_external_plugins filter.
       
  1268  *
       
  1269  * @param bool $teeny optional Output a trimmed down version used in Press This.
       
  1270  * @param mixed $settings optional An array that can add to or overwrite the default TinyMCE settings.
       
  1271  */
       
  1272 function wp_tiny_mce( $teeny = false, $settings = false ) {
       
  1273 	global $concatenate_scripts, $compress_scripts, $tinymce_version;
       
  1274 
       
  1275 	if ( ! user_can_richedit() )
       
  1276 		return;
       
  1277 
       
  1278 	$baseurl = includes_url('js/tinymce');
       
  1279 
       
  1280 	$mce_locale = ( '' == get_locale() ) ? 'en' : strtolower( substr(get_locale(), 0, 2) ); // only ISO 639-1
       
  1281 
       
  1282 	/*
       
  1283 	The following filter allows localization scripts to change the languages displayed in the spellchecker's drop-down menu.
       
  1284 	By default it uses Google's spellchecker API, but can be configured to use PSpell/ASpell if installed on the server.
       
  1285 	The + sign marks the default language. More information:
       
  1286 	http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker
       
  1287 	*/
       
  1288 	$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');
       
  1289 
       
  1290 	if ( $teeny ) {
       
  1291 		$plugins = apply_filters( 'teeny_mce_plugins', array('safari', 'inlinepopups', 'media', 'fullscreen', 'wordpress') );
       
  1292 		$ext_plugins = '';
       
  1293 	} else {
       
  1294 		$plugins = array( 'safari', 'inlinepopups', 'spellchecker', 'paste', 'wordpress', 'media', 'fullscreen', 'wpeditimage', 'wpgallery', 'tabfocus' );
       
  1295 
       
  1296 		/*
       
  1297 		The following filter takes an associative array of external plugins for TinyMCE in the form 'plugin_name' => 'url'.
       
  1298 		It adds the plugin's name to TinyMCE's plugins init and the call to PluginManager to load the plugin.
       
  1299 		The url should be absolute and should include the js file name to be loaded. Example:
       
  1300 		array( 'myplugin' => 'http://my-site.com/wp-content/plugins/myfolder/mce_plugin.js' )
       
  1301 		If the plugin uses a button, it should be added with one of the "$mce_buttons" filters.
       
  1302 		*/
       
  1303 		$mce_external_plugins = apply_filters('mce_external_plugins', array());
       
  1304 
       
  1305 		$ext_plugins = '';
       
  1306 		if ( ! empty($mce_external_plugins) ) {
       
  1307 
       
  1308 			/*
       
  1309 			The following filter loads external language files for TinyMCE plugins.
       
  1310 			It takes an associative array 'plugin_name' => 'path', where path is the
       
  1311 			include path to the file. The language file should follow the same format as
       
  1312 			/tinymce/langs/wp-langs.php and should define a variable $strings that
       
  1313 			holds all translated strings.
       
  1314 			When this filter is not used, the function will try to load {mce_locale}.js.
       
  1315 			If that is not found, en.js will be tried next.
       
  1316 			*/
       
  1317 			$mce_external_languages = apply_filters('mce_external_languages', array());
       
  1318 
       
  1319 			$loaded_langs = array();
       
  1320 			$strings = '';
       
  1321 
       
  1322 			if ( ! empty($mce_external_languages) ) {
       
  1323 				foreach ( $mce_external_languages as $name => $path ) {
       
  1324 					if ( @is_file($path) && @is_readable($path) ) {
       
  1325 						include_once($path);
       
  1326 						$ext_plugins .= $strings . "\n";
       
  1327 						$loaded_langs[] = $name;
       
  1328 					}
       
  1329 				}
       
  1330 			}
       
  1331 
       
  1332 			foreach ( $mce_external_plugins as $name => $url ) {
       
  1333 
       
  1334 				if ( is_ssl() ) $url = str_replace('http://', 'https://', $url);
       
  1335 
       
  1336 				$plugins[] = '-' . $name;
       
  1337 
       
  1338 				$plugurl = dirname($url);
       
  1339 				$strings = $str1 = $str2 = '';
       
  1340 				if ( ! in_array($name, $loaded_langs) ) {
       
  1341 					$path = str_replace( WP_PLUGIN_URL, '', $plugurl );
       
  1342 					$path = WP_PLUGIN_DIR . $path . '/langs/';
       
  1343 
       
  1344 					if ( function_exists('realpath') )
       
  1345 						$path = trailingslashit( realpath($path) );
       
  1346 
       
  1347 					if ( @is_file($path . $mce_locale . '.js') )
       
  1348 						$strings .= @file_get_contents($path . $mce_locale . '.js') . "\n";
       
  1349 
       
  1350 					if ( @is_file($path . $mce_locale . '_dlg.js') )
       
  1351 						$strings .= @file_get_contents($path . $mce_locale . '_dlg.js') . "\n";
       
  1352 
       
  1353 					if ( 'en' != $mce_locale && empty($strings) ) {
       
  1354 						if ( @is_file($path . 'en.js') ) {
       
  1355 							$str1 = @file_get_contents($path . 'en.js');
       
  1356 							$strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str1, 1 ) . "\n";
       
  1357 						}
       
  1358 
       
  1359 						if ( @is_file($path . 'en_dlg.js') ) {
       
  1360 							$str2 = @file_get_contents($path . 'en_dlg.js');
       
  1361 							$strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str2, 1 ) . "\n";
       
  1362 						}
       
  1363 					}
       
  1364 
       
  1365 					if ( ! empty($strings) )
       
  1366 						$ext_plugins .= "\n" . $strings . "\n";
       
  1367 				}
       
  1368 
       
  1369 				$ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . "\n";
       
  1370 				$ext_plugins .= 'tinymce.PluginManager.load("' . $name . '", "' . $url . '");' . "\n";
       
  1371 			}
       
  1372 		}
       
  1373 	}
       
  1374 
       
  1375 	$plugins = implode($plugins, ',');
       
  1376 
       
  1377 	if ( $teeny ) {
       
  1378 		$mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold, italic, underline, blockquote, separator, strikethrough, bullist, numlist,justifyleft, justifycenter, justifyright, undo, redo, link, unlink, fullscreen') );
       
  1379 		$mce_buttons = implode($mce_buttons, ',');
       
  1380 		$mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = '';
       
  1381 	} else {
       
  1382 		$mce_buttons = apply_filters('mce_buttons', array('bold', 'italic', 'strikethrough', '|', 'bullist', 'numlist', 'blockquote', '|', 'justifyleft', 'justifycenter', 'justifyright', '|', 'link', 'unlink', 'wp_more', '|', 'spellchecker', 'fullscreen', 'wp_adv' ));
       
  1383 		$mce_buttons = implode($mce_buttons, ',');
       
  1384 
       
  1385 		$mce_buttons_2 = apply_filters('mce_buttons_2', array('formatselect', 'underline', 'justifyfull', 'forecolor', '|', 'pastetext', 'pasteword', 'removeformat', '|', 'media', 'charmap', '|', 'outdent', 'indent', '|', 'undo', 'redo', 'wp_help' ));
       
  1386 		$mce_buttons_2 = implode($mce_buttons_2, ',');
       
  1387 
       
  1388 		$mce_buttons_3 = apply_filters('mce_buttons_3', array());
       
  1389 		$mce_buttons_3 = implode($mce_buttons_3, ',');
       
  1390 
       
  1391 		$mce_buttons_4 = apply_filters('mce_buttons_4', array());
       
  1392 		$mce_buttons_4 = implode($mce_buttons_4, ',');
       
  1393 	}
       
  1394 	$no_captions = ( apply_filters( 'disable_captions', '' ) ) ? true : false;
       
  1395 
       
  1396 	// TinyMCE init settings
       
  1397 	$initArray = array (
       
  1398 		'mode' => 'specific_textareas',
       
  1399 		'editor_selector' => 'theEditor',
       
  1400 		'width' => '100%',
       
  1401 		'theme' => 'advanced',
       
  1402 		'skin' => 'wp_theme',
       
  1403 		'theme_advanced_buttons1' => "$mce_buttons",
       
  1404 		'theme_advanced_buttons2' => "$mce_buttons_2",
       
  1405 		'theme_advanced_buttons3' => "$mce_buttons_3",
       
  1406 		'theme_advanced_buttons4' => "$mce_buttons_4",
       
  1407 		'language' => "$mce_locale",
       
  1408 		'spellchecker_languages' => "$mce_spellchecker_languages",
       
  1409 		'theme_advanced_toolbar_location' => 'top',
       
  1410 		'theme_advanced_toolbar_align' => 'left',
       
  1411 		'theme_advanced_statusbar_location' => 'bottom',
       
  1412 		'theme_advanced_resizing' => true,
       
  1413 		'theme_advanced_resize_horizontal' => false,
       
  1414 		'dialog_type' => 'modal',
       
  1415 		'relative_urls' => false,
       
  1416 		'remove_script_host' => false,
       
  1417 		'convert_urls' => false,
       
  1418 		'apply_source_formatting' => false,
       
  1419 		'remove_linebreaks' => true,
       
  1420 		'gecko_spellcheck' => true,
       
  1421 		'entities' => '38,amp,60,lt,62,gt',
       
  1422 		'accessibility_focus' => true,
       
  1423 		'tabfocus_elements' => 'major-publishing-actions',
       
  1424 		'media_strict' => false,
       
  1425 		'paste_remove_styles' => true,
       
  1426 		'paste_remove_spans' => true,
       
  1427 		'paste_strip_class_attributes' => 'all',
       
  1428 		'wpeditimage_disable_captions' => $no_captions,
       
  1429 		'plugins' => "$plugins"
       
  1430 	);
       
  1431 
       
  1432 	$mce_css = trim(apply_filters('mce_css', ''), ' ,');
       
  1433 
       
  1434 	if ( ! empty($mce_css) )
       
  1435 		$initArray['content_css'] = "$mce_css";
       
  1436 
       
  1437 	if ( is_array($settings) )
       
  1438 		$initArray = array_merge($initArray, $settings);
       
  1439 
       
  1440 	// For people who really REALLY know what they're doing with TinyMCE
       
  1441 	// You can modify initArray to add, remove, change elements of the config before tinyMCE.init
       
  1442 	// Setting "valid_elements", "invalid_elements" and "extended_valid_elements" can be done through "tiny_mce_before_init".
       
  1443 	// Best is to use the default cleanup by not specifying valid_elements, as TinyMCE contains full set of XHTML 1.0.
       
  1444 	if ( $teeny ) {
       
  1445 		$initArray = apply_filters('teeny_mce_before_init', $initArray);
       
  1446 	} else {
       
  1447 		$initArray = apply_filters('tiny_mce_before_init', $initArray);
       
  1448 	}
       
  1449 
       
  1450 	if ( empty($initArray['theme_advanced_buttons3']) && !empty($initArray['theme_advanced_buttons4']) ) {
       
  1451 		$initArray['theme_advanced_buttons3'] = $initArray['theme_advanced_buttons4'];
       
  1452 		$initArray['theme_advanced_buttons4'] = '';
       
  1453 	}
       
  1454 
       
  1455 	if ( ! isset($concatenate_scripts) )
       
  1456 		script_concat_settings();
       
  1457 
       
  1458 	$language = $initArray['language'];
       
  1459 	$zip = $compress_scripts ? 1 : 0;
       
  1460 
       
  1461 	/**
       
  1462 	 * Deprecated
       
  1463 	 *
       
  1464 	 * The tiny_mce_version filter is not needed since external plugins are loaded directly by TinyMCE.
       
  1465 	 * These plugins can be refreshed by appending query string to the URL passed to mce_external_plugins filter.
       
  1466 	 * 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).
       
  1467 	 */
       
  1468 	$version = apply_filters('tiny_mce_version', '');
       
  1469 	$version = 'ver=' . $tinymce_version . $version;
       
  1470 
       
  1471 	if ( 'en' != $language )
       
  1472 		include_once(ABSPATH . WPINC . '/js/tinymce/langs/wp-langs.php');
       
  1473 
       
  1474 	$mce_options = '';
       
  1475 	foreach ( $initArray as $k => $v )
       
  1476 	    $mce_options .= $k . ':"' . $v . '", ';
       
  1477 
       
  1478 	$mce_options = rtrim( trim($mce_options), '\n\r,' ); ?>
       
  1479 
       
  1480 <script type="text/javascript">
       
  1481 /* <![CDATA[ */
       
  1482 tinyMCEPreInit = {
       
  1483 	base : "<?php echo $baseurl; ?>",
       
  1484 	suffix : "",
       
  1485 	query : "<?php echo $version; ?>",
       
  1486 	mceInit : {<?php echo $mce_options; ?>},
       
  1487 	load_ext : function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');}
       
  1488 };
       
  1489 /* ]]> */
       
  1490 </script>
       
  1491 
       
  1492 <?php
       
  1493 	if ( $concatenate_scripts )
       
  1494 		echo "<script type='text/javascript' src='$baseurl/wp-tinymce.php?c=$zip&amp;$version'></script>\n";
       
  1495 	else
       
  1496 		echo "<script type='text/javascript' src='$baseurl/tiny_mce.js?$version'></script>\n";
       
  1497 
       
  1498 	if ( 'en' != $language && isset($lang) )
       
  1499 		echo "<script type='text/javascript'>\n$lang\n</script>\n";
       
  1500 	else
       
  1501 		echo "<script type='text/javascript' src='$baseurl/langs/wp-langs-en.js?$version'></script>\n";
       
  1502 ?>
       
  1503 
       
  1504 <script type="text/javascript">
       
  1505 /* <![CDATA[ */
       
  1506 <?php if ( $ext_plugins ) echo "$ext_plugins\n"; ?>
       
  1507 <?php if ( $concatenate_scripts ) { ?>
       
  1508 tinyMCEPreInit.go();
       
  1509 <?php } else { ?>
       
  1510 (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');}});})();
       
  1511 <?php } ?>
       
  1512 tinyMCE.init(tinyMCEPreInit.mceInit);
       
  1513 /* ]]> */
       
  1514 </script>
       
  1515 <?php
       
  1516 }