source: trunk/www.guidonia.net/wp/wp-admin/includes/template.php@ 44

Last change on this file since 44 was 44, checked in by luciano, 14 years ago
File size: 123.9 KB
Line 
1<?php
2/**
3 * Template WordPress Administration API.
4 *
5 * A Big Mess. Also some neat functions that are nicely written.
6 *
7 * @package WordPress
8 * @subpackage Administration
9 */
10
11// Ugly recursive category stuff.
12/**
13 * {@internal Missing Short Description}}
14 *
15 * @since unknown
16 *
17 * @param unknown_type $parent
18 * @param unknown_type $level
19 * @param unknown_type $categories
20 * @param unknown_type $page
21 * @param unknown_type $per_page
22 */
23function cat_rows( $parent = 0, $level = 0, $categories = 0, $page = 1, $per_page = 20 ) {
24
25 $count = 0;
26
27 if ( empty($categories) ) {
28
29 $args = array('hide_empty' => 0);
30 if ( !empty($_GET['s']) )
31 $args['search'] = $_GET['s'];
32
33 $categories = get_categories( $args );
34
35 if ( empty($categories) )
36 return false;
37 }
38
39 $children = _get_term_hierarchy('category');
40
41 _cat_rows( $parent, $level, $categories, $children, $page, $per_page, $count );
42
43}
44
45/**
46 * {@internal Missing Short Description}}
47 *
48 * @since unknown
49 *
50 * @param unknown_type $categories
51 * @param unknown_type $count
52 * @param unknown_type $parent
53 * @param unknown_type $level
54 * @param unknown_type $page
55 * @param unknown_type $per_page
56 * @return unknown
57 */
58function _cat_rows( $parent = 0, $level = 0, $categories, &$children, $page = 1, $per_page = 20, &$count ) {
59
60 $start = ($page - 1) * $per_page;
61 $end = $start + $per_page;
62 ob_start();
63
64 foreach ( $categories as $key => $category ) {
65 if ( $count >= $end )
66 break;
67
68 if ( $category->parent != $parent && empty($_GET['s']) )
69 continue;
70
71 // If the page starts in a subtree, print the parents.
72 if ( $count == $start && $category->parent > 0 ) {
73
74 $my_parents = array();
75 $p = $category->parent;
76 while ( $p ) {
77 $my_parent = get_category( $p );
78 $my_parents[] = $my_parent;
79 if ( $my_parent->parent == 0 )
80 break;
81 $p = $my_parent->parent;
82 }
83
84 $num_parents = count($my_parents);
85 while( $my_parent = array_pop($my_parents) ) {
86 echo "\t" . _cat_row( $my_parent, $level - $num_parents );
87 $num_parents--;
88 }
89 }
90
91 if ( $count >= $start )
92 echo "\t" . _cat_row( $category, $level );
93
94 unset( $categories[ $key ] );
95
96 $count++;
97
98 if ( isset($children[$category->term_id]) )
99 _cat_rows( $category->term_id, $level + 1, $categories, $children, $page, $per_page, $count );
100 }
101
102 $output = ob_get_contents();
103 ob_end_clean();
104
105 echo $output;
106}
107
108/**
109 * {@internal Missing Short Description}}
110 *
111 * @since unknown
112 *
113 * @param unknown_type $category
114 * @param unknown_type $level
115 * @param unknown_type $name_override
116 * @return unknown
117 */
118function _cat_row( $category, $level, $name_override = false ) {
119 static $row_class = '';
120
121 $category = get_category( $category, OBJECT, 'display' );
122
123 $default_cat_id = (int) get_option( 'default_category' );
124 $pad = str_repeat( '&#8212; ', max(0, $level) );
125 $name = ( $name_override ? $name_override : $pad . ' ' . $category->name );
126 $edit_link = "categories.php?action=edit&amp;cat_ID=$category->term_id";
127 if ( current_user_can( 'manage_categories' ) ) {
128 $edit = "<a class='row-title' href='$edit_link' title='" . esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $category->name)) . "'>" . esc_attr( $name ) . '</a><br />';
129 $actions = array();
130 $actions['edit'] = '<a href="' . $edit_link . '">' . __('Edit') . '</a>';
131 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __('Quick&nbsp;Edit') . '</a>';
132 if ( $default_cat_id != $category->term_id )
133 $actions['delete'] = "<a class='delete:the-list:cat-$category->term_id submitdelete' href='" . wp_nonce_url("categories.php?action=delete&amp;cat_ID=$category->term_id", 'delete-category_' . $category->term_id) . "'>" . __('Delete') . "</a>";
134 $actions = apply_filters('cat_row_actions', $actions, $category);
135 $action_count = count($actions);
136 $i = 0;
137 $edit .= '<div class="row-actions">';
138 foreach ( $actions as $action => $link ) {
139 ++$i;
140 ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
141 $edit .= "<span class='$action'>$link$sep</span>";
142 }
143 $edit .= '</div>';
144 } else {
145 $edit = $name;
146 }
147
148 $row_class = 'alternate' == $row_class ? '' : 'alternate';
149 $qe_data = get_category_to_edit($category->term_id);
150
151 $category->count = number_format_i18n( $category->count );
152 $posts_count = ( $category->count > 0 ) ? "<a href='edit.php?cat=$category->term_id'>$category->count</a>" : $category->count;
153 $output = "<tr id='cat-$category->term_id' class='iedit $row_class'>";
154
155 $columns = get_column_headers('categories');
156 $hidden = get_hidden_columns('categories');
157 foreach ( $columns as $column_name => $column_display_name ) {
158 $class = "class=\"$column_name column-$column_name\"";
159
160 $style = '';
161 if ( in_array($column_name, $hidden) )
162 $style = ' style="display:none;"';
163
164 $attributes = "$class$style";
165
166 switch ($column_name) {
167 case 'cb':
168 $output .= "<th scope='row' class='check-column'>";
169 if ( $default_cat_id != $category->term_id ) {
170 $output .= "<input type='checkbox' name='delete[]' value='$category->term_id' />";
171 } else {
172 $output .= "&nbsp;";
173 }
174 $output .= '</th>';
175 break;
176 case 'name':
177 $output .= "<td $attributes>$edit";
178 $output .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';
179 $output .= '<div class="name">' . $qe_data->name . '</div>';
180 $output .= '<div class="slug">' . $qe_data->slug . '</div>';
181 $output .= '<div class="cat_parent">' . $qe_data->parent . '</div></div></td>';
182 break;
183 case 'description':
184 $output .= "<td $attributes>$category->description</td>";
185 break;
186 case 'slug':
187 $output .= "<td $attributes>$category->slug</td>";
188 break;
189 case 'posts':
190 $attributes = 'class="posts column-posts num"' . $style;
191 $output .= "<td $attributes>$posts_count</td>\n";
192 break;
193 default:
194 $output .= "<td $attributes>";
195 $output .= apply_filters('manage_categories_custom_column', '', $column_name, $category->term_id);
196 $output .= "</td>";
197 }
198 }
199 $output .= '</tr>';
200
201 return $output;
202}
203
204/**
205 * {@internal Missing Short Description}}
206 *
207 * @since 2.7
208 *
209 * Outputs the HTML for the hidden table rows used in Categories, Link Caregories and Tags quick edit.
210 *
211 * @param string $type "tag", "category" or "link-category"
212 * @return
213 */
214function inline_edit_term_row($type) {
215
216 if ( ! current_user_can( 'manage_categories' ) )
217 return;
218
219 $is_tag = $type == 'edit-tags';
220 $columns = get_column_headers($type);
221 $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns($type) ) );
222 $col_count = count($columns) - count($hidden);
223 ?>
224
225<form method="get" action=""><table style="display: none"><tbody id="inlineedit">
226 <tr id="inline-edit" class="inline-edit-row" style="display: none"><td colspan="<?php echo $col_count; ?>">
227
228 <fieldset><div class="inline-edit-col">
229 <h4><?php _e( 'Quick Edit' ); ?></h4>
230
231 <label>
232 <span class="title"><?php _e( 'Name' ); ?></span>
233 <span class="input-text-wrap"><input type="text" name="name" class="ptitle" value="" /></span>
234 </label>
235
236 <label>
237 <span class="title"><?php _e( 'Slug' ); ?></span>
238 <span class="input-text-wrap"><input type="text" name="slug" class="ptitle" value="" /></span>
239 </label>
240
241<?php if ( 'category' == $type ) : ?>
242
243 <label>
244 <span class="title"><?php _e( 'Parent' ); ?></span>
245 <?php wp_dropdown_categories(array('hide_empty' => 0, 'name' => 'parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => __('None'))); ?>
246 </label>
247
248<?php endif; // $type ?>
249
250 </div></fieldset>
251
252<?php
253
254 $core_columns = array( 'cb' => true, 'description' => true, 'name' => true, 'slug' => true, 'posts' => true );
255
256 foreach ( $columns as $column_name => $column_display_name ) {
257 if ( isset( $core_columns[$column_name] ) )
258 continue;
259 do_action( 'quick_edit_custom_box', $column_name, $type );
260 }
261
262?>
263
264 <p class="inline-edit-save submit">
265 <a accesskey="c" href="#inline-edit" title="<?php _e('Cancel'); ?>" class="cancel button-secondary alignleft"><?php _e('Cancel'); ?></a>
266 <?php $update_text = ( $is_tag ) ? __( 'Update Tag' ) : __( 'Update Category' ); ?>
267 <a accesskey="s" href="#inline-edit" title="<?php echo esc_attr( $update_text ); ?>" class="save button-primary alignright"><?php echo $update_text; ?></a>
268 <img class="waiting" style="display:none;" src="images/wpspin_light.gif" alt="" />
269 <span class="error" style="display:none;"></span>
270 <?php wp_nonce_field( 'taxinlineeditnonce', '_inline_edit', false ); ?>
271 <br class="clear" />
272 </p>
273 </td></tr>
274 </tbody></table></form>
275<?php
276}
277
278/**
279 * {@internal Missing Short Description}}
280 *
281 * @since unknown
282 *
283 * @param unknown_type $category
284 * @param unknown_type $name_override
285 * @return unknown
286 */
287function link_cat_row( $category, $name_override = false ) {
288 static $row_class = '';
289
290 if ( !$category = get_term( $category, 'link_category', OBJECT, 'display' ) )
291 return false;
292 if ( is_wp_error( $category ) )
293 return $category;
294
295 $default_cat_id = (int) get_option( 'default_link_category' );
296 $name = ( $name_override ? $name_override : $category->name );
297 $edit_link = "link-category.php?action=edit&amp;cat_ID=$category->term_id";
298 if ( current_user_can( 'manage_categories' ) ) {
299 $edit = "<a class='row-title' href='$edit_link' title='" . esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $category->name)) . "'>$name</a><br />";
300 $actions = array();
301 $actions['edit'] = '<a href="' . $edit_link . '">' . __('Edit') . '</a>';
302 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __('Quick&nbsp;Edit') . '</a>';
303 if ( $default_cat_id != $category->term_id )
304 $actions['delete'] = "<a class='delete:the-list:link-cat-$category->term_id submitdelete' href='" . wp_nonce_url("link-category.php?action=delete&amp;cat_ID=$category->term_id", 'delete-link-category_' . $category->term_id) . "'>" . __('Delete') . "</a>";
305 $actions = apply_filters('link_cat_row_actions', $actions, $category);
306 $action_count = count($actions);
307 $i = 0;
308 $edit .= '<div class="row-actions">';
309 foreach ( $actions as $action => $link ) {
310 ++$i;
311 ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
312 $edit .= "<span class='$action'>$link$sep</span>";
313 }
314 $edit .= '</div>';
315 } else {
316 $edit = $name;
317 }
318
319 $row_class = 'alternate' == $row_class ? '' : 'alternate';
320 $qe_data = get_term_to_edit($category->term_id, 'link_category');
321
322 $category->count = number_format_i18n( $category->count );
323 $count = ( $category->count > 0 ) ? "<a href='link-manager.php?cat_id=$category->term_id'>$category->count</a>" : $category->count;
324 $output = "<tr id='link-cat-$category->term_id' class='iedit $row_class'>";
325 $columns = get_column_headers('edit-link-categories');
326 $hidden = get_hidden_columns('edit-link-categories');
327 foreach ( $columns as $column_name => $column_display_name ) {
328 $class = "class=\"$column_name column-$column_name\"";
329
330 $style = '';
331 if ( in_array($column_name, $hidden) )
332 $style = ' style="display:none;"';
333
334 $attributes = "$class$style";
335
336 switch ($column_name) {
337 case 'cb':
338 $output .= "<th scope='row' class='check-column'>";
339 if ( absint( get_option( 'default_link_category' ) ) != $category->term_id ) {
340 $output .= "<input type='checkbox' name='delete[]' value='$category->term_id' />";
341 } else {
342 $output .= "&nbsp;";
343 }
344 $output .= "</th>";
345 break;
346 case 'name':
347 $output .= "<td $attributes>$edit";
348 $output .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';
349 $output .= '<div class="name">' . $qe_data->name . '</div>';
350 $output .= '<div class="slug">' . $qe_data->slug . '</div>';
351 $output .= '<div class="cat_parent">' . $qe_data->parent . '</div></div></td>';
352 break;
353 case 'description':
354 $output .= "<td $attributes>$category->description</td>";
355 break;
356 case 'slug':
357 $output .= "<td $attributes>$category->slug</td>";
358 break;
359 case 'links':
360 $attributes = 'class="links column-links num"' . $style;
361 $output .= "<td $attributes>$count</td>";
362 break;
363 default:
364 $output .= "<td $attributes>";
365 $output .= apply_filters('manage_link_categories_custom_column', '', $column_name, $category->term_id);
366 $output .= "</td>";
367 }
368 }
369 $output .= '</tr>';
370
371 return $output;
372}
373
374/**
375 * Outputs the html checked attribute.
376 *
377 * Compares the first two arguments and if identical marks as checked
378 *
379 * @since 2.8
380 *
381 * @param any $checked One of the values to compare
382 * @param any $current (true) The other value to compare if not just true
383 * @param bool $echo Whether or not to echo or just return the string
384 */
385function checked( $checked, $current = true, $echo = true) {
386 return __checked_selected_helper( $checked, $current, $echo, 'checked' );
387}
388
389/**
390 * Outputs the html selected attribute.
391 *
392 * Compares the first two arguments and if identical marks as selected
393 *
394 * @since 2.8
395 *
396 * @param any selected One of the values to compare
397 * @param any $current (true) The other value to compare if not just true
398 * @param bool $echo Whether or not to echo or just return the string
399 */
400function selected( $selected, $current = true, $echo = true) {
401 return __checked_selected_helper( $selected, $current, $echo, 'selected' );
402}
403
404/**
405 * Private helper function for checked and selected.
406 *
407 * Compares the first two arguments and if identical marks as $type
408 *
409 * @since 2.8
410 * @access private
411 *
412 * @param any $helper One of the values to compare
413 * @param any $current (true) The other value to compare if not just true
414 * @param bool $echo Whether or not to echo or just return the string
415 * @param string $type The type of checked|selected we are doing.
416 */
417function __checked_selected_helper( $helper, $current, $echo, $type) {
418 if ( $helper == $current)
419 $result = " $type='$type'";
420 else
421 $result = '';
422
423 if ($echo)
424 echo $result;
425
426 return $result;
427}
428
429//
430// Category Checklists
431//
432
433/**
434 * {@internal Missing Short Description}}
435 *
436 * @since unknown
437 * @deprecated Use {@link wp_link_category_checklist()}
438 * @see wp_link_category_checklist()
439 *
440 * @param unknown_type $default
441 * @param unknown_type $parent
442 * @param unknown_type $popular_ids
443 */
444function dropdown_categories( $default = 0, $parent = 0, $popular_ids = array() ) {
445 global $post_ID;
446 wp_category_checklist($post_ID);
447}
448
449/**
450 * {@internal Missing Short Description}}
451 *
452 * @since unknown
453 */
454class Walker_Category_Checklist extends Walker {
455 var $tree_type = 'category';
456 var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this
457
458 function start_lvl(&$output, $depth, $args) {
459 $indent = str_repeat("\t", $depth);
460 $output .= "$indent<ul class='children'>\n";
461 }
462
463 function end_lvl(&$output, $depth, $args) {
464 $indent = str_repeat("\t", $depth);
465 $output .= "$indent</ul>\n";
466 }
467
468 function start_el(&$output, $category, $depth, $args) {
469 extract($args);
470
471 $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
472 $output .= "\n<li id='category-$category->term_id'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="post_category[]" id="in-category-' . $category->term_id . '"' . (in_array( $category->term_id, $selected_cats ) ? ' checked="checked"' : "" ) . '/> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
473 }
474
475 function end_el(&$output, $category, $depth, $args) {
476 $output .= "</li>\n";
477 }
478}
479
480/**
481 * {@internal Missing Short Description}}
482 *
483 * @since unknown
484 *
485 * @param unknown_type $post_id
486 * @param unknown_type $descendants_and_self
487 * @param unknown_type $selected_cats
488 * @param unknown_type $popular_cats
489 */
490function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null ) {
491 if ( empty($walker) || !is_a($walker, 'Walker') )
492 $walker = new Walker_Category_Checklist;
493
494 $descendants_and_self = (int) $descendants_and_self;
495
496 $args = array();
497
498 if ( is_array( $selected_cats ) )
499 $args['selected_cats'] = $selected_cats;
500 elseif ( $post_id )
501 $args['selected_cats'] = wp_get_post_categories($post_id);
502 else
503 $args['selected_cats'] = array();
504
505 if ( is_array( $popular_cats ) )
506 $args['popular_cats'] = $popular_cats;
507 else
508 $args['popular_cats'] = get_terms( 'category', array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
509
510 if ( $descendants_and_self ) {
511 $categories = get_categories( "child_of=$descendants_and_self&hierarchical=0&hide_empty=0" );
512 $self = get_category( $descendants_and_self );
513 array_unshift( $categories, $self );
514 } else {
515 $categories = get_categories('get=all');
516 }
517
518 // Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache)
519 $checked_categories = array();
520 $keys = array_keys( $categories );
521
522 foreach( $keys as $k ) {
523 if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) {
524 $checked_categories[] = $categories[$k];
525 unset( $categories[$k] );
526 }
527 }
528
529 // Put checked cats on top
530 echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args));
531 // Then the rest of them
532 echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args));
533}
534
535/**
536 * {@internal Missing Short Description}}
537 *
538 * @since unknown
539 *
540 * @param unknown_type $taxonomy
541 * @param unknown_type $default
542 * @param unknown_type $number
543 * @param unknown_type $echo
544 * @return unknown
545 */
546function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) {
547 global $post_ID;
548 if ( $post_ID )
549 $checked_categories = wp_get_post_categories($post_ID);
550 else
551 $checked_categories = array();
552 $categories = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number, 'hierarchical' => false ) );
553
554 $popular_ids = array();
555 foreach ( (array) $categories as $category ) {
556 $popular_ids[] = $category->term_id;
557 if ( !$echo ) // hack for AJAX use
558 continue;
559 $id = "popular-category-$category->term_id";
560 ?>
561
562 <li id="<?php echo $id; ?>" class="popular-category">
563 <label class="selectit">
564 <input id="in-<?php echo $id; ?>" type="checkbox" value="<?php echo (int) $category->term_id; ?>" />
565 <?php echo esc_html( apply_filters( 'the_category', $category->name ) ); ?>
566 </label>
567 </li>
568
569 <?php
570 }
571 return $popular_ids;
572}
573
574/**
575 * {@internal Missing Short Description}}
576 *
577 * @since unknown
578 * @deprecated Use {@link wp_link_category_checklist()}
579 * @see wp_link_category_checklist()
580 *
581 * @param unknown_type $default
582 */
583function dropdown_link_categories( $default = 0 ) {
584 global $link_id;
585
586 wp_link_category_checklist($link_id);
587}
588
589/**
590 * {@internal Missing Short Description}}
591 *
592 * @since unknown
593 *
594 * @param unknown_type $link_id
595 */
596function wp_link_category_checklist( $link_id = 0 ) {
597 $default = 1;
598
599 if ( $link_id ) {
600 $checked_categories = wp_get_link_cats($link_id);
601
602 if ( count( $checked_categories ) == 0 ) {
603 // No selected categories, strange
604 $checked_categories[] = $default;
605 }
606 } else {
607 $checked_categories[] = $default;
608 }
609
610 $categories = get_terms('link_category', 'orderby=count&hide_empty=0');
611
612 if ( empty($categories) )
613 return;
614
615 foreach ( $categories as $category ) {
616 $cat_id = $category->term_id;
617 $name = esc_html( apply_filters('the_category', $category->name));
618 $checked = in_array( $cat_id, $checked_categories );
619 echo '<li id="link-category-', $cat_id, '"><label for="in-link-category-', $cat_id, '" class="selectit"><input value="', $cat_id, '" type="checkbox" name="link_category[]" id="in-link-category-', $cat_id, '"', ($checked ? ' checked="checked"' : "" ), '/> ', $name, "</label></li>";
620 }
621}
622
623// Tag stuff
624
625// Returns a single tag row (see tag_rows below)
626// Note: this is also used in admin-ajax.php!
627/**
628 * {@internal Missing Short Description}}
629 *
630 * @since unknown
631 *
632 * @param unknown_type $tag
633 * @param unknown_type $class
634 * @return unknown
635 */
636function _tag_row( $tag, $class = '', $taxonomy = 'post_tag' ) {
637 $count = number_format_i18n( $tag->count );
638 $tagsel = ($taxonomy == 'post_tag' ? 'tag' : $taxonomy);
639 $count = ( $count > 0 ) ? "<a href='edit.php?$tagsel=$tag->slug'>$count</a>" : $count;
640
641 $name = apply_filters( 'term_name', $tag->name );
642 $qe_data = get_term($tag->term_id, $taxonomy, object, 'edit');
643 $edit_link = "edit-tags.php?action=edit&amp;taxonomy=$taxonomy&amp;tag_ID=$tag->term_id";
644 $out = '';
645 $out .= '<tr id="tag-' . $tag->term_id . '"' . $class . '>';
646 $columns = get_column_headers('edit-tags');
647 $hidden = get_hidden_columns('edit-tags');
648 foreach ( $columns as $column_name => $column_display_name ) {
649 $class = "class=\"$column_name column-$column_name\"";
650
651 $style = '';
652 if ( in_array($column_name, $hidden) )
653 $style = ' style="display:none;"';
654
655 $attributes = "$class$style";
656
657 switch ($column_name) {
658 case 'cb':
659 $out .= '<th scope="row" class="check-column"> <input type="checkbox" name="delete_tags[]" value="' . $tag->term_id . '" /></th>';
660 break;
661 case 'name':
662 $out .= '<td ' . $attributes . '><strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $name)) . '">' . $name . '</a></strong><br />';
663 $actions = array();
664 $actions['edit'] = '<a href="' . $edit_link . '">' . __('Edit') . '</a>';
665 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __('Quick&nbsp;Edit') . '</a>';
666 $actions['delete'] = "<a class='delete:the-list:tag-$tag->term_id submitdelete' href='" . wp_nonce_url("edit-tags.php?action=delete&amp;taxonomy=$taxonomy&amp;tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id) . "'>" . __('Delete') . "</a>";
667 $actions = apply_filters('tag_row_actions', $actions, $tag);
668 $action_count = count($actions);
669 $i = 0;
670 $out .= '<div class="row-actions">';
671 foreach ( $actions as $action => $link ) {
672 ++$i;
673 ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
674 $out .= "<span class='$action'>$link$sep</span>";
675 }
676 $out .= '</div>';
677 $out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';
678 $out .= '<div class="name">' . $qe_data->name . '</div>';
679 $out .= '<div class="slug">' . $qe_data->slug . '</div></div></td>';
680 break;
681 case 'description':
682 $out .= "<td $attributes>$tag->description</td>";
683 break;
684 case 'slug':
685 $out .= "<td $attributes>$tag->slug</td>";
686 break;
687 case 'posts':
688 $attributes = 'class="posts column-posts num"' . $style;
689 $out .= "<td $attributes>$count</td>";
690 break;
691 default:
692 $out .= "<td $attributes>";
693 $out .= apply_filters("manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id);
694 $out .= "</td>";
695 }
696 }
697
698 $out .= '</tr>';
699
700 return $out;
701}
702
703// Outputs appropriate rows for the Nth page of the Tag Management screen,
704// assuming M tags displayed at a time on the page
705// Returns the number of tags displayed
706/**
707 * {@internal Missing Short Description}}
708 *
709 * @since unknown
710 *
711 * @param unknown_type $page
712 * @param unknown_type $pagesize
713 * @param unknown_type $searchterms
714 * @return unknown
715 */
716function tag_rows( $page = 1, $pagesize = 20, $searchterms = '', $taxonomy = 'post_tag' ) {
717
718 // Get a page worth of tags
719 $start = ($page - 1) * $pagesize;
720
721 $args = array('offset' => $start, 'number' => $pagesize, 'hide_empty' => 0);
722
723 if ( !empty( $searchterms ) ) {
724 $args['search'] = $searchterms;
725 }
726
727 $tags = get_terms( $taxonomy, $args );
728
729 // convert it to table rows
730 $out = '';
731 $count = 0;
732 foreach( $tags as $tag )
733 $out .= _tag_row( $tag, ++$count % 2 ? ' class="iedit alternate"' : ' class="iedit"', $taxonomy );
734
735 // filter and send to screen
736 echo $out;
737 return $count;
738}
739
740// define the columns to display, the syntax is 'internal name' => 'display name'
741/**
742 * {@internal Missing Short Description}}
743 *
744 * @since unknown
745 *
746 * @return unknown
747 */
748function wp_manage_posts_columns() {
749 $posts_columns = array();
750 $posts_columns['cb'] = '<input type="checkbox" />';
751 /* translators: manage posts column name */
752 $posts_columns['title'] = _x('Post', 'column name');
753 $posts_columns['author'] = __('Author');
754 $posts_columns['categories'] = __('Categories');
755 $posts_columns['tags'] = __('Tags');
756 if ( !isset($_GET['post_status']) || !in_array($_GET['post_status'], array('pending', 'draft', 'future')) )
757 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="images/comment-grey-bubble.png" /></div>';
758 $posts_columns['date'] = __('Date');
759 $posts_columns = apply_filters('manage_posts_columns', $posts_columns);
760
761 return $posts_columns;
762}
763
764// define the columns to display, the syntax is 'internal name' => 'display name'
765/**
766 * {@internal Missing Short Description}}
767 *
768 * @since unknown
769 *
770 * @return unknown
771 */
772function wp_manage_media_columns() {
773 $posts_columns = array();
774 $posts_columns['cb'] = '<input type="checkbox" />';
775 $posts_columns['icon'] = '';
776 /* translators: column name */
777 $posts_columns['media'] = _x('File', 'column name');
778 $posts_columns['author'] = __('Author');
779 //$posts_columns['tags'] = _x('Tags', 'column name');
780 /* translators: column name */
781 $posts_columns['parent'] = _x('Attached to', 'column name');
782 $posts_columns['comments'] = '<div class="vers"><img alt="Comments" src="images/comment-grey-bubble.png" /></div>';
783 //$posts_columns['comments'] = __('Comments');
784 /* translators: column name */
785 $posts_columns['date'] = _x('Date', 'column name');
786 $posts_columns = apply_filters('manage_media_columns', $posts_columns);
787
788 return $posts_columns;
789}
790
791/**
792 * {@internal Missing Short Description}}
793 *
794 * @since unknown
795 *
796 * @return unknown
797 */
798function wp_manage_pages_columns() {
799 $posts_columns = array();
800 $posts_columns['cb'] = '<input type="checkbox" />';
801 $posts_columns['title'] = __('Title');
802 $posts_columns['author'] = __('Author');
803 $post_status = 'all';
804 if ( !empty($_GET['post_status']) )
805 $post_status = $_GET['post_status'];
806 if ( !in_array($post_status, array('pending', 'draft', 'future')) )
807 $posts_columns['comments'] = '<div class="vers"><img alt="" src="images/comment-grey-bubble.png" /></div>';
808 $posts_columns['date'] = __('Date');
809 $posts_columns = apply_filters('manage_pages_columns', $posts_columns);
810
811 return $posts_columns;
812}
813
814/**
815 * {@internal Missing Short Description}}
816 *
817 * @since unknown
818 *
819 * @param unknown_type $page
820 * @return unknown
821 */
822function get_column_headers($page) {
823 global $_wp_column_headers;
824
825 if ( !isset($_wp_column_headers) )
826 $_wp_column_headers = array();
827
828 // Store in static to avoid running filters on each call
829 if ( isset($_wp_column_headers[$page]) )
830 return $_wp_column_headers[$page];
831
832 switch ($page) {
833 case 'edit':
834 $_wp_column_headers[$page] = wp_manage_posts_columns();
835 break;
836 case 'edit-pages':
837 $_wp_column_headers[$page] = wp_manage_pages_columns();
838 break;
839 case 'edit-comments':
840 $_wp_column_headers[$page] = array(
841 'cb' => '<input type="checkbox" />',
842 'author' => __('Author'),
843 /* translators: column name */
844 'comment' => _x('Comment', 'column name'),
845 //'date' => __('Submitted'),
846 'response' => __('In Response To')
847 );
848
849 break;
850 case 'link-manager':
851 $_wp_column_headers[$page] = array(
852 'cb' => '<input type="checkbox" />',
853 'name' => __('Name'),
854 'url' => __('URL'),
855 'categories' => __('Categories'),
856 'rel' => __('Relationship'),
857 'visible' => __('Visible'),
858 'rating' => __('Rating')
859 );
860
861 break;
862 case 'upload':
863 $_wp_column_headers[$page] = wp_manage_media_columns();
864 break;
865 case 'categories':
866 $_wp_column_headers[$page] = array(
867 'cb' => '<input type="checkbox" />',
868 'name' => __('Name'),
869 'description' => __('Description'),
870 'slug' => __('Slug'),
871 'posts' => __('Posts')
872 );
873
874 break;
875 case 'edit-link-categories':
876 $_wp_column_headers[$page] = array(
877 'cb' => '<input type="checkbox" />',
878 'name' => __('Name'),
879 'description' => __('Description'),
880 'slug' => __('Slug'),
881 'links' => __('Links')
882 );
883
884 break;
885 case 'edit-tags':
886 $_wp_column_headers[$page] = array(
887 'cb' => '<input type="checkbox" />',
888 'name' => __('Name'),
889 'description' => __('Description'),
890 'slug' => __('Slug'),
891 'posts' => __('Posts')
892 );
893
894 break;
895 case 'users':
896 $_wp_column_headers[$page] = array(
897 'cb' => '<input type="checkbox" />',
898 'username' => __('Username'),
899 'name' => __('Name'),
900 'email' => __('E-mail'),
901 'role' => __('Role'),
902 'posts' => __('Posts')
903 );
904 break;
905 default :
906 $_wp_column_headers[$page] = array();
907 }
908
909 $_wp_column_headers[$page] = apply_filters('manage_' . $page . '_columns', $_wp_column_headers[$page]);
910 return $_wp_column_headers[$page];
911}
912
913/**
914 * {@internal Missing Short Description}}
915 *
916 * @since unknown
917 *
918 * @param unknown_type $type
919 * @param unknown_type $id
920 */
921function print_column_headers( $type, $id = true ) {
922 $type = str_replace('.php', '', $type);
923 $columns = get_column_headers( $type );
924 $hidden = get_hidden_columns($type);
925 $styles = array();
926// $styles['tag']['posts'] = 'width: 90px;';
927// $styles['link-category']['links'] = 'width: 90px;';
928// $styles['category']['posts'] = 'width: 90px;';
929// $styles['link']['visible'] = 'text-align: center;';
930
931 foreach ( $columns as $column_key => $column_display_name ) {
932 $class = ' class="manage-column';
933
934 $class .= " column-$column_key";
935
936 if ( 'cb' == $column_key )
937 $class .= ' check-column';
938 elseif ( in_array($column_key, array('posts', 'comments', 'links')) )
939 $class .= ' num';
940
941 $class .= '"';
942
943 $style = '';
944 if ( in_array($column_key, $hidden) )
945 $style = 'display:none;';
946
947 if ( isset($styles[$type]) && isset($styles[$type][$column_key]) )
948 $style .= ' ' . $styles[$type][$column_key];
949 $style = ' style="' . $style . '"';
950?>
951 <th scope="col" <?php echo $id ? "id=\"$column_key\"" : ""; echo $class; echo $style; ?>><?php echo $column_display_name; ?></th>
952<?php }
953}
954
955/**
956 * Register column headers for a particular screen. The header names will be listed in the Screen Options.
957 *
958 * @since 2.7.0
959 *
960 * @param string $screen The handle for the screen to add help to. This is usually the hook name returned by the add_*_page() functions.
961 * @param array $columns An array of columns with column IDs as the keys and translated column names as the values
962 * @see get_column_headers(), print_column_headers(), get_hidden_columns()
963 */
964function register_column_headers($screen, $columns) {
965 global $_wp_column_headers;
966
967 if ( !isset($_wp_column_headers) )
968 $_wp_column_headers = array();
969
970 $_wp_column_headers[$screen] = $columns;
971}
972
973/**
974 * {@internal Missing Short Description}}
975 *
976 * @since unknown
977 *
978 * @param unknown_type $page
979 */
980function get_hidden_columns($page) {
981 $page = str_replace('.php', '', $page);
982 return (array) get_user_option( 'manage-' . $page . '-columns-hidden', 0, false );
983}
984
985/**
986 * {@internal Missing Short Description}}
987 *
988 * Outputs the quick edit and bulk edit table rows for posts and pages
989 *
990 * @since 2.7
991 *
992 * @param string $type 'post' or 'page'
993 */
994function inline_edit_row( $type ) {
995 global $current_user, $mode;
996
997 $is_page = 'page' == $type;
998 if ( $is_page ) {
999 $screen = 'edit-pages';
1000 $post = get_default_page_to_edit();
1001 } else {
1002 $screen = 'edit';
1003 $post = get_default_post_to_edit();
1004 }
1005
1006 $columns = $is_page ? wp_manage_pages_columns() : wp_manage_posts_columns();
1007 $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns($screen) ) );
1008 $col_count = count($columns) - count($hidden);
1009 $m = ( isset($mode) && 'excerpt' == $mode ) ? 'excerpt' : 'list';
1010 $can_publish = current_user_can("publish_{$type}s");
1011 $core_columns = array( 'cb' => true, 'date' => true, 'title' => true, 'categories' => true, 'tags' => true, 'comments' => true, 'author' => true );
1012
1013?>
1014
1015<form method="get" action=""><table style="display: none"><tbody id="inlineedit">
1016 <?php
1017 $bulk = 0;
1018 while ( $bulk < 2 ) { ?>
1019
1020 <tr id="<?php echo $bulk ? 'bulk-edit' : 'inline-edit'; ?>" class="inline-edit-row inline-edit-row-<?php echo "$type ";
1021 echo $bulk ? "bulk-edit-row bulk-edit-row-$type" : "quick-edit-row quick-edit-row-$type";
1022 ?>" style="display: none"><td colspan="<?php echo $col_count; ?>">
1023
1024 <fieldset class="inline-edit-col-left"><div class="inline-edit-col">
1025 <h4><?php echo $bulk ? ( $is_page ? __( 'Bulk Edit Pages' ) : __( 'Bulk Edit Posts' ) ) : __( 'Quick Edit' ); ?></h4>
1026
1027
1028<?php if ( $bulk ) : ?>
1029 <div id="bulk-title-div">
1030 <div id="bulk-titles"></div>
1031 </div>
1032
1033<?php else : // $bulk ?>
1034
1035 <label>
1036 <span class="title"><?php _e( 'Title' ); ?></span>
1037 <span class="input-text-wrap"><input type="text" name="post_title" class="ptitle" value="" /></span>
1038 </label>
1039
1040<?php endif; // $bulk ?>
1041
1042
1043<?php if ( !$bulk ) : ?>
1044
1045 <label>
1046 <span class="title"><?php _e( 'Slug' ); ?></span>
1047 <span class="input-text-wrap"><input type="text" name="post_name" value="" /></span>
1048 </label>
1049
1050 <label><span class="title"><?php _e( 'Date' ); ?></span></label>
1051 <div class="inline-edit-date">
1052 <?php touch_time(1, 1, 4, 1); ?>
1053 </div>
1054 <br class="clear" />
1055
1056<?php endif; // $bulk
1057
1058 ob_start();
1059 $authors = get_editable_user_ids( $current_user->id, true, $type ); // TODO: ROLE SYSTEM
1060 if ( $authors && count( $authors ) > 1 ) :
1061 $users_opt = array('include' => $authors, 'name' => 'post_author', 'class'=> 'authors', 'multi' => 1);
1062 if ( $bulk )
1063 $users_opt['show_option_none'] = __('- No Change -');
1064?>
1065 <label>
1066 <span class="title"><?php _e( 'Author' ); ?></span>
1067 <?php wp_dropdown_users( $users_opt ); ?>
1068 </label>
1069
1070<?php
1071 endif; // authors
1072 $authors_dropdown = ob_get_clean();
1073?>
1074
1075<?php if ( !$bulk ) : echo $authors_dropdown; ?>
1076
1077 <div class="inline-edit-group">
1078 <label class="alignleft">
1079 <span class="title"><?php _e( 'Password' ); ?></span>
1080 <span class="input-text-wrap"><input type="text" name="post_password" class="inline-edit-password-input" value="" /></span>
1081 </label>
1082
1083 <em style="margin:5px 10px 0 0" class="alignleft">
1084 <?php
1085 /* translators: Between password field and private checkbox on post quick edit interface */
1086 echo __( '&ndash;OR&ndash;' );
1087 ?>
1088 </em>
1089 <label class="alignleft inline-edit-private">
1090 <input type="checkbox" name="keep_private" value="private" />
1091 <span class="checkbox-title"><?php echo $is_page ? __('Private page') : __('Private post'); ?></span>
1092 </label>
1093 </div>
1094
1095<?php endif; ?>
1096
1097 </div></fieldset>
1098
1099<?php if ( !$is_page && !$bulk ) : ?>
1100
1101 <fieldset class="inline-edit-col-center inline-edit-categories"><div class="inline-edit-col">
1102 <span class="title inline-edit-categories-label"><?php _e( 'Categories' ); ?>
1103 <span class="catshow"><?php _e('[more]'); ?></span>
1104 <span class="cathide" style="display:none;"><?php _e('[less]'); ?></span>
1105 </span>
1106 <ul class="cat-checklist">
1107 <?php wp_category_checklist(); ?>
1108 </ul>
1109 </div></fieldset>
1110
1111<?php endif; // !$is_page && !$bulk ?>
1112
1113 <fieldset class="inline-edit-col-right"><div class="inline-edit-col">
1114
1115<?php
1116 if ( $bulk )
1117 echo $authors_dropdown;
1118?>
1119
1120<?php if ( $is_page ) : ?>
1121
1122 <label>
1123 <span class="title"><?php _e( 'Parent' ); ?></span>
1124<?php
1125 $dropdown_args = array('selected' => $post->post_parent, 'name' => 'post_parent', 'show_option_none' => __('Main Page (no parent)'), 'option_none_value' => 0, 'sort_column'=> 'menu_order, post_title');
1126 if ( $bulk )
1127 $dropdown_args['show_option_no_change'] = __('- No Change -');
1128 $dropdown_args = apply_filters('quick_edit_dropdown_pages_args', $dropdown_args);
1129 wp_dropdown_pages($dropdown_args);
1130?>
1131 </label>
1132
1133<?php if ( !$bulk ) : ?>
1134
1135 <label>
1136 <span class="title"><?php _e( 'Order' ); ?></span>
1137 <span class="input-text-wrap"><input type="text" name="menu_order" class="inline-edit-menu-order-input" value="<?php echo $post->menu_order ?>" /></span>
1138 </label>
1139
1140<?php endif; // !$bulk ?>
1141
1142 <label>
1143 <span class="title"><?php _e( 'Template' ); ?></span>
1144 <select name="page_template">
1145<?php if ( $bulk ) : ?>
1146 <option value="-1"><?php _e('- No Change -'); ?></option>
1147<?php endif; // $bulk ?>
1148 <option value="default"><?php _e( 'Default Template' ); ?></option>
1149 <?php page_template_dropdown() ?>
1150 </select>
1151 </label>
1152
1153<?php elseif ( !$bulk ) : // $is_page ?>
1154
1155 <label class="inline-edit-tags">
1156 <span class="title"><?php _e( 'Tags' ); ?></span>
1157 <textarea cols="22" rows="1" name="tags_input" class="tags_input"></textarea>
1158 </label>
1159
1160<?php endif; // $is_page ?>
1161
1162<?php if ( $bulk ) : ?>
1163
1164 <div class="inline-edit-group">
1165 <label class="alignleft">
1166 <span class="title"><?php _e( 'Comments' ); ?></span>
1167 <select name="comment_status">
1168 <option value=""><?php _e('- No Change -'); ?></option>
1169 <option value="open"><?php _e('Allow'); ?></option>
1170 <option value="closed"><?php _e('Do not allow'); ?></option>
1171 </select>
1172 </label>
1173
1174 <label class="alignright">
1175 <span class="title"><?php _e( 'Pings' ); ?></span>
1176 <select name="ping_status">
1177 <option value=""><?php _e('- No Change -'); ?></option>
1178 <option value="open"><?php _e('Allow'); ?></option>
1179 <option value="closed"><?php _e('Do not allow'); ?></option>
1180 </select>
1181 </label>
1182 </div>
1183
1184<?php else : // $bulk ?>
1185
1186 <div class="inline-edit-group">
1187 <label class="alignleft">
1188 <input type="checkbox" name="comment_status" value="open" />
1189 <span class="checkbox-title"><?php _e( 'Allow Comments' ); ?></span>
1190 </label>
1191
1192 <label class="alignleft">
1193 <input type="checkbox" name="ping_status" value="open" />
1194 <span class="checkbox-title"><?php _e( 'Allow Pings' ); ?></span>
1195 </label>
1196 </div>
1197
1198<?php endif; // $bulk ?>
1199
1200
1201 <div class="inline-edit-group">
1202 <label class="inline-edit-status alignleft">
1203 <span class="title"><?php _e( 'Status' ); ?></span>
1204 <select name="_status">
1205<?php if ( $bulk ) : ?>
1206 <option value="-1"><?php _e('- No Change -'); ?></option>
1207<?php endif; // $bulk ?>
1208 <?php if ( $can_publish ) : // Contributors only get "Unpublished" and "Pending Review" ?>
1209 <option value="publish"><?php _e( 'Published' ); ?></option>
1210 <option value="future"><?php _e( 'Scheduled' ); ?></option>
1211<?php if ( $bulk ) : ?>
1212 <option value="private"><?php _e('Private') ?></option>
1213<?php endif; // $bulk ?>
1214 <?php endif; ?>
1215 <option value="pending"><?php _e( 'Pending Review' ); ?></option>
1216 <option value="draft"><?php _e( 'Draft' ); ?></option>
1217 </select>
1218 </label>
1219
1220<?php if ( !$is_page && $can_publish && current_user_can( 'edit_others_posts' ) ) : ?>
1221
1222<?php if ( $bulk ) : ?>
1223
1224 <label class="alignright">
1225 <span class="title"><?php _e( 'Sticky' ); ?></span>
1226 <select name="sticky">
1227 <option value="-1"><?php _e( '- No Change -' ); ?></option>
1228 <option value="sticky"><?php _e( 'Sticky' ); ?></option>
1229 <option value="unsticky"><?php _e( 'Not Sticky' ); ?></option>
1230 </select>
1231 </label>
1232
1233<?php else : // $bulk ?>
1234
1235 <label class="alignleft">
1236 <input type="checkbox" name="sticky" value="sticky" />
1237 <span class="checkbox-title"><?php _e( 'Make this post sticky' ); ?></span>
1238 </label>
1239
1240<?php endif; // $bulk ?>
1241
1242<?php endif; // !$is_page && $can_publish && current_user_can( 'edit_others_posts' ) ?>
1243
1244 </div>
1245
1246 </div></fieldset>
1247
1248<?php
1249 foreach ( $columns as $column_name => $column_display_name ) {
1250 if ( isset( $core_columns[$column_name] ) )
1251 continue;
1252 do_action( $bulk ? 'bulk_edit_custom_box' : 'quick_edit_custom_box', $column_name, $type);
1253 }
1254?>
1255 <p class="submit inline-edit-save">
1256 <a accesskey="c" href="#inline-edit" title="<?php _e('Cancel'); ?>" class="button-secondary cancel alignleft"><?php _e('Cancel'); ?></a>
1257 <?php if ( ! $bulk ) {
1258 wp_nonce_field( 'inlineeditnonce', '_inline_edit', false );
1259 $update_text = ( $is_page ) ? __( 'Update Page' ) : __( 'Update Post' );
1260 ?>
1261 <a accesskey="s" href="#inline-edit" title="<?php _e('Update'); ?>" class="button-primary save alignright"><?php echo esc_attr( $update_text ); ?></a>
1262 <img class="waiting" style="display:none;" src="images/wpspin_light.gif" alt="" />
1263 <?php } else {
1264 $update_text = ( $is_page ) ? __( 'Update Pages' ) : __( 'Update Posts' );
1265 ?>
1266 <input accesskey="s" class="button-primary alignright" type="submit" name="bulk_edit" value="<?php echo esc_attr( $update_text ); ?>" />
1267 <?php } ?>
1268 <input type="hidden" name="post_view" value="<?php echo $m; ?>" />
1269 <br class="clear" />
1270 </p>
1271 </td></tr>
1272<?php
1273 $bulk++;
1274 } ?>
1275 </tbody></table></form>
1276<?php
1277}
1278
1279// adds hidden fields with the data for use in the inline editor for posts and pages
1280/**
1281 * {@internal Missing Short Description}}
1282 *
1283 * @since unknown
1284 *
1285 * @param unknown_type $post
1286 */
1287function get_inline_data($post) {
1288
1289 if ( ! current_user_can('edit_' . $post->post_type, $post->ID) )
1290 return;
1291
1292 $title = esc_attr($post->post_title);
1293
1294 echo '
1295<div class="hidden" id="inline_' . $post->ID . '">
1296 <div class="post_title">' . $title . '</div>
1297 <div class="post_name">' . $post->post_name . '</div>
1298 <div class="post_author">' . $post->post_author . '</div>
1299 <div class="comment_status">' . $post->comment_status . '</div>
1300 <div class="ping_status">' . $post->ping_status . '</div>
1301 <div class="_status">' . $post->post_status . '</div>
1302 <div class="jj">' . mysql2date( 'd', $post->post_date, false ) . '</div>
1303 <div class="mm">' . mysql2date( 'm', $post->post_date, false ) . '</div>
1304 <div class="aa">' . mysql2date( 'Y', $post->post_date, false ) . '</div>
1305 <div class="hh">' . mysql2date( 'H', $post->post_date, false ) . '</div>
1306 <div class="mn">' . mysql2date( 'i', $post->post_date, false ) . '</div>
1307 <div class="ss">' . mysql2date( 's', $post->post_date, false ) . '</div>
1308 <div class="post_password">' . esc_html( $post->post_password ) . '</div>';
1309
1310 if( $post->post_type == 'page' )
1311 echo '
1312 <div class="post_parent">' . $post->post_parent . '</div>
1313 <div class="page_template">' . esc_html( get_post_meta( $post->ID, '_wp_page_template', true ) ) . '</div>
1314 <div class="menu_order">' . $post->menu_order . '</div>';
1315
1316 if( $post->post_type == 'post' )
1317 echo '
1318 <div class="tags_input">' . esc_html( str_replace( ',', ', ', get_tags_to_edit($post->ID) ) ) . '</div>
1319 <div class="post_category">' . implode( ',', wp_get_post_categories( $post->ID ) ) . '</div>
1320 <div class="sticky">' . (is_sticky($post->ID) ? 'sticky' : '') . '</div>';
1321
1322 echo '</div>';
1323}
1324
1325/**
1326 * {@internal Missing Short Description}}
1327 *
1328 * @since unknown
1329 *
1330 * @param unknown_type $posts
1331 */
1332function post_rows( $posts = array() ) {
1333 global $wp_query, $post, $mode;
1334
1335 add_filter('the_title','esc_html');
1336
1337 // Create array of post IDs.
1338 $post_ids = array();
1339
1340 if ( empty($posts) )
1341 $posts = &$wp_query->posts;
1342
1343 foreach ( $posts as $a_post )
1344 $post_ids[] = $a_post->ID;
1345
1346 $comment_pending_count = get_pending_comments_num($post_ids);
1347 if ( empty($comment_pending_count) )
1348 $comment_pending_count = array();
1349
1350 foreach ( $posts as $post ) {
1351 if ( empty($comment_pending_count[$post->ID]) )
1352 $comment_pending_count[$post->ID] = 0;
1353
1354 _post_row($post, $comment_pending_count[$post->ID], $mode);
1355 }
1356}
1357
1358/**
1359 * {@internal Missing Short Description}}
1360 *
1361 * @since unknown
1362 *
1363 * @param unknown_type $a_post
1364 * @param unknown_type $pending_comments
1365 * @param unknown_type $mode
1366 */
1367function _post_row($a_post, $pending_comments, $mode) {
1368 global $post;
1369 static $rowclass;
1370
1371 $global_post = $post;
1372 $post = $a_post;
1373 setup_postdata($post);
1374
1375 $rowclass = 'alternate' == $rowclass ? '' : 'alternate';
1376 global $current_user;
1377 $post_owner = ( $current_user->ID == $post->post_author ? 'self' : 'other' );
1378 $edit_link = get_edit_post_link( $post->ID );
1379 $title = _draft_or_post_title();
1380?>
1381 <tr id='post-<?php echo $post->ID; ?>' class='<?php echo trim( $rowclass . ' author-' . $post_owner . ' status-' . $post->post_status ); ?> iedit' valign="top">
1382<?php
1383 $posts_columns = get_column_headers('edit');
1384 $hidden = get_hidden_columns('edit');
1385 foreach ( $posts_columns as $column_name=>$column_display_name ) {
1386 $class = "class=\"$column_name column-$column_name\"";
1387
1388 $style = '';
1389 if ( in_array($column_name, $hidden) )
1390 $style = ' style="display:none;"';
1391
1392 $attributes = "$class$style";
1393
1394 switch ($column_name) {
1395
1396 case 'cb':
1397 ?>
1398 <th scope="row" class="check-column"><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><input type="checkbox" name="post[]" value="<?php the_ID(); ?>" /><?php } ?></th>
1399 <?php
1400 break;
1401
1402 case 'date':
1403 if ( '0000-00-00 00:00:00' == $post->post_date && 'date' == $column_name ) {
1404 $t_time = $h_time = __('Unpublished');
1405 $time_diff = 0;
1406 } else {
1407 $t_time = get_the_time(__('Y/m/d g:i:s A'));
1408 $m_time = $post->post_date;
1409 $time = get_post_time('G', true, $post);
1410
1411 $time_diff = time() - $time;
1412
1413 if ( $time_diff > 0 && $time_diff < 24*60*60 )
1414 $h_time = sprintf( __('%s ago'), human_time_diff( $time ) );
1415 else
1416 $h_time = mysql2date(__('Y/m/d'), $m_time);
1417 }
1418
1419 echo '<td ' . $attributes . '>';
1420 if ( 'excerpt' == $mode )
1421 echo apply_filters('post_date_column_time', $t_time, $post, $column_name, $mode);
1422 else
1423 echo '<abbr title="' . $t_time . '">' . apply_filters('post_date_column_time', $h_time, $post, $column_name, $mode) . '</abbr>';
1424 echo '<br />';
1425 if ( 'publish' == $post->post_status ) {
1426 _e('Published');
1427 } elseif ( 'future' == $post->post_status ) {
1428 if ( $time_diff > 0 )
1429 echo '<strong class="attention">' . __('Missed schedule') . '</strong>';
1430 else
1431 _e('Scheduled');
1432 } else {
1433 _e('Last Modified');
1434 }
1435 echo '</td>';
1436 break;
1437
1438 case 'title':
1439 $attributes = 'class="post-title column-title"' . $style;
1440 ?>
1441 <td <?php echo $attributes ?>><strong><?php if ( current_user_can( 'edit_post', $post->ID ) ) { ?><a class="row-title" href="<?php echo $edit_link; ?>" title="<?php echo esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $title)); ?>"><?php echo $title ?></a><?php } else { echo $title; }; _post_states($post); ?></strong>
1442 <?php
1443 if ( 'excerpt' == $mode )
1444 the_excerpt();
1445
1446 $actions = array();
1447 if ( current_user_can('edit_post', $post->ID) ) {
1448 $actions['edit'] = '<a href="' . get_edit_post_link($post->ID, true) . '" title="' . esc_attr(__('Edit this post')) . '">' . __('Edit') . '</a>';
1449 $actions['inline hide-if-no-js'] = '<a href="#" class="editinline" title="' . esc_attr(__('Edit this post inline')) . '">' . __('Quick&nbsp;Edit') . '</a>';
1450 }
1451 if ( current_user_can('delete_post', $post->ID) ) {
1452 $actions['delete'] = "<a class='submitdelete' title='" . esc_attr(__('Delete this post')) . "' href='" . wp_nonce_url("post.php?action=delete&amp;post=$post->ID", 'delete-post_' . $post->ID) . "' onclick=\"if ( confirm('" . esc_js(sprintf( ('draft' == $post->post_status) ? __("You are about to delete this draft '%s'\n 'Cancel' to stop, 'OK' to delete.") : __("You are about to delete this post '%s'\n 'Cancel' to stop, 'OK' to delete."), $post->post_title )) . "') ) { return true;}return false;\">" . __('Delete') . "</a>";
1453 }
1454 if ( in_array($post->post_status, array('pending', 'draft')) ) {
1455 if ( current_user_can('edit_post', $post->ID) )
1456 $actions['view'] = '<a href="' . get_permalink($post->ID) . '" title="' . esc_attr(sprintf(__('Preview &#8220;%s&#8221;'), $title)) . '" rel="permalink">' . __('Preview') . '</a>';
1457 } else {
1458 $actions['view'] = '<a href="' . get_permalink($post->ID) . '" title="' . esc_attr(sprintf(__('View &#8220;%s&#8221;'), $title)) . '" rel="permalink">' . __('View') . '</a>';
1459 }
1460 $actions = apply_filters('post_row_actions', $actions, $post);
1461 $action_count = count($actions);
1462 $i = 0;
1463 echo '<div class="row-actions">';
1464 foreach ( $actions as $action => $link ) {
1465 ++$i;
1466 ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
1467 echo "<span class='$action'>$link$sep</span>";
1468 }
1469 echo '</div>';
1470
1471 get_inline_data($post);
1472 ?>
1473 </td>
1474 <?php
1475 break;
1476
1477 case 'categories':
1478 ?>
1479 <td <?php echo $attributes ?>><?php
1480 $categories = get_the_category();
1481 if ( !empty( $categories ) ) {
1482 $out = array();
1483 foreach ( $categories as $c )
1484 $out[] = "<a href='edit.php?category_name=$c->slug'> " . esc_html(sanitize_term_field('name', $c->name, $c->term_id, 'category', 'display')) . "</a>";
1485 echo join( ', ', $out );
1486 } else {
1487 _e('Uncategorized');
1488 }
1489 ?></td>
1490 <?php
1491 break;
1492
1493 case 'tags':
1494 ?>
1495 <td <?php echo $attributes ?>><?php
1496 $tags = get_the_tags($post->ID);
1497 if ( !empty( $tags ) ) {
1498 $out = array();
1499 foreach ( $tags as $c )
1500 $out[] = "<a href='edit.php?tag=$c->slug'> " . esc_html(sanitize_term_field('name', $c->name, $c->term_id, 'post_tag', 'display')) . "</a>";
1501 echo join( ', ', $out );
1502 } else {
1503 _e('No Tags');
1504 }
1505 ?></td>
1506 <?php
1507 break;
1508
1509 case 'comments':
1510 ?>
1511 <td <?php echo $attributes ?>><div class="post-com-count-wrapper">
1512 <?php
1513 $pending_phrase = sprintf( __('%s pending'), number_format( $pending_comments ) );
1514 if ( $pending_comments )
1515 echo '<strong>';
1516 comments_number("<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('0', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('1', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link: % will be substituted by comment count */ _x('%', 'comment count') . '</span></a>');
1517 if ( $pending_comments )
1518 echo '</strong>';
1519 ?>
1520 </div></td>
1521 <?php
1522 break;
1523
1524 case 'author':
1525 ?>
1526 <td <?php echo $attributes ?>><a href="edit.php?author=<?php the_author_meta('ID'); ?>"><?php the_author() ?></a></td>
1527 <?php
1528 break;
1529
1530 case 'control_view':
1531 ?>
1532 <td><a href="<?php the_permalink(); ?>" rel="permalink" class="view"><?php _e('View'); ?></a></td>
1533 <?php
1534 break;
1535
1536 case 'control_edit':
1537 ?>
1538 <td><?php if ( current_user_can('edit_post', $post->ID) ) { echo "<a href='$edit_link' class='edit'>" . __('Edit') . "</a>"; } ?></td>
1539 <?php
1540 break;
1541
1542 case 'control_delete':
1543 ?>
1544 <td><?php if ( current_user_can('delete_post', $post->ID) ) { echo "<a href='" . wp_nonce_url("post.php?action=delete&amp;post=$id", 'delete-post_' . $post->ID) . "' class='delete'>" . __('Delete') . "</a>"; } ?></td>
1545 <?php
1546 break;
1547
1548 default:
1549 ?>
1550 <td <?php echo $attributes ?>><?php do_action('manage_posts_custom_column', $column_name, $post->ID); ?></td>
1551 <?php
1552 break;
1553 }
1554}
1555?>
1556 </tr>
1557<?php
1558 $post = $global_post;
1559}
1560
1561/*
1562 * display one row if the page doesn't have any children
1563 * otherwise, display the row and its children in subsequent rows
1564 */
1565/**
1566 * {@internal Missing Short Description}}
1567 *
1568 * @since unknown
1569 *
1570 * @param unknown_type $page
1571 * @param unknown_type $level
1572 */
1573function display_page_row( $page, $level = 0 ) {
1574 global $post;
1575 static $rowclass;
1576
1577 $post = $page;
1578 setup_postdata($page);
1579
1580 if ( 0 == $level && (int)$page->post_parent > 0 ) {
1581 //sent level 0 by accident, by default, or because we don't know the actual level
1582 $find_main_page = (int)$page->post_parent;
1583 while ( $find_main_page > 0 ) {
1584 $parent = get_page($find_main_page);
1585
1586 if ( is_null($parent) )
1587 break;
1588
1589 $level++;
1590 $find_main_page = (int)$parent->post_parent;
1591
1592 if ( !isset($parent_name) )
1593 $parent_name = $parent->post_title;
1594 }
1595 }
1596
1597 $page->post_title = esc_html( $page->post_title );
1598 $pad = str_repeat( '&#8212; ', $level );
1599 $id = (int) $page->ID;
1600 $rowclass = 'alternate' == $rowclass ? '' : 'alternate';
1601 $posts_columns = get_column_headers('edit-pages');
1602 $hidden = get_hidden_columns('edit-pages');
1603 $title = _draft_or_post_title();
1604?>
1605<tr id="page-<?php echo $id; ?>" class="<?php echo $rowclass; ?> iedit">
1606<?php
1607
1608foreach ($posts_columns as $column_name=>$column_display_name) {
1609 $class = "class=\"$column_name column-$column_name\"";
1610
1611 $style = '';
1612 if ( in_array($column_name, $hidden) )
1613 $style = ' style="display:none;"';
1614
1615 $attributes = "$class$style";
1616
1617 switch ($column_name) {
1618
1619 case 'cb':
1620 ?>
1621 <th scope="row" class="check-column"><input type="checkbox" name="post[]" value="<?php the_ID(); ?>" /></th>
1622 <?php
1623 break;
1624 case 'date':
1625 if ( '0000-00-00 00:00:00' == $page->post_date && 'date' == $column_name ) {
1626 $t_time = $h_time = __('Unpublished');
1627 $time_diff = 0;
1628 } else {
1629 $t_time = get_the_time(__('Y/m/d g:i:s A'));
1630 $m_time = $page->post_date;
1631 $time = get_post_time('G', true);
1632
1633 $time_diff = time() - $time;
1634
1635 if ( $time_diff > 0 && $time_diff < 24*60*60 )
1636 $h_time = sprintf( __('%s ago'), human_time_diff( $time ) );
1637 else
1638 $h_time = mysql2date(__('Y/m/d'), $m_time);
1639 }
1640 echo '<td ' . $attributes . '>';
1641 echo '<abbr title="' . $t_time . '">' . apply_filters('post_date_column_time', $h_time, $page, $column_name, '') . '</abbr>';
1642 echo '<br />';
1643 if ( 'publish' == $page->post_status ) {
1644 _e('Published');
1645 } elseif ( 'future' == $page->post_status ) {
1646 if ( $time_diff > 0 )
1647 echo '<strong class="attention">' . __('Missed schedule') . '</strong>';
1648 else
1649 _e('Scheduled');
1650 } else {
1651 _e('Last Modified');
1652 }
1653 echo '</td>';
1654 break;
1655 case 'title':
1656 $attributes = 'class="post-title page-title column-title"' . $style;
1657 $edit_link = get_edit_post_link( $page->ID );
1658 ?>
1659 <td <?php echo $attributes ?>><strong><?php if ( current_user_can( 'edit_page', $page->ID ) ) { ?><a class="row-title" href="<?php echo $edit_link; ?>" title="<?php echo esc_attr(sprintf(__('Edit &#8220;%s&#8221;'), $title)); ?>"><?php echo $pad; echo $title ?></a><?php } else { echo $pad; echo $title; }; _post_states($page); echo isset($parent_name) ? ' | ' . __('Parent Page: ') . esc_html($parent_name) : ''; ?></strong>
1660 <?php
1661 $actions = array();
1662 if ( current_user_can('edit_page', $page->ID) ) {
1663 $actions['edit'] = '<a href="' . $edit_link . '" title="' . esc_attr(__('Edit this page')) . '">' . __('Edit') . '</a>';
1664 $actions['inline'] = '<a href="#" class="editinline">' . __('Quick&nbsp;Edit') . '</a>';
1665 }
1666 if ( current_user_can('delete_page', $page->ID) ) {
1667 $actions['delete'] = "<a class='submitdelete' title='" . esc_attr(__('Delete this page')) . "' href='" . wp_nonce_url("page.php?action=delete&amp;post=$page->ID", 'delete-page_' . $page->ID) . "' onclick=\"if ( confirm('" . esc_js(sprintf( ('draft' == $page->post_status) ? __("You are about to delete this draft '%s'\n 'Cancel' to stop, 'OK' to delete.") : __("You are about to delete this page '%s'\n 'Cancel' to stop, 'OK' to delete."), $page->post_title )) . "') ) { return true;}return false;\">" . __('Delete') . "</a>";
1668 }
1669 if ( in_array($post->post_status, array('pending', 'draft')) ) {
1670 if ( current_user_can('edit_page', $page->ID) )
1671 $actions['view'] = '<a href="' . get_permalink($page->ID) . '" title="' . esc_attr(sprintf(__('Preview &#8220;%s&#8221;'), $title)) . '" rel="permalink">' . __('Preview') . '</a>';
1672 } else {
1673 $actions['view'] = '<a href="' . get_permalink($page->ID) . '" title="' . esc_attr(sprintf(__('View &#8220;%s&#8221;'), $title)) . '" rel="permalink">' . __('View') . '</a>';
1674 }
1675 $actions = apply_filters('page_row_actions', $actions, $page);
1676 $action_count = count($actions);
1677
1678 $i = 0;
1679 echo '<div class="row-actions">';
1680 foreach ( $actions as $action => $link ) {
1681 ++$i;
1682 ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
1683 echo "<span class='$action'>$link$sep</span>";
1684 }
1685 echo '</div>';
1686
1687 get_inline_data($post);
1688 echo '</td>';
1689 break;
1690
1691 case 'comments':
1692 ?>
1693 <td <?php echo $attributes ?>><div class="post-com-count-wrapper">
1694 <?php
1695 $left = get_pending_comments_num( $page->ID );
1696 $pending_phrase = sprintf( __('%s pending'), number_format( $left ) );
1697 if ( $left )
1698 echo '<strong>';
1699 comments_number("<a href='edit-comments.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('0', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('1', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$id' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link: % will be substituted by comment count */ _x('%', 'comment count') . '</span></a>');
1700 if ( $left )
1701 echo '</strong>';
1702 ?>
1703 </div></td>
1704 <?php
1705 break;
1706
1707 case 'author':
1708 ?>
1709 <td <?php echo $attributes ?>><a href="edit-pages.php?author=<?php the_author_meta('ID'); ?>"><?php the_author() ?></a></td>
1710 <?php
1711 break;
1712
1713 default:
1714 ?>
1715 <td <?php echo $attributes ?>><?php do_action('manage_pages_custom_column', $column_name, $id); ?></td>
1716 <?php
1717 break;
1718 }
1719}
1720?>
1721
1722</tr>
1723
1724<?php
1725}
1726
1727/*
1728 * displays pages in hierarchical order with paging support
1729 */
1730/**
1731 * {@internal Missing Short Description}}
1732 *
1733 * @since unknown
1734 *
1735 * @param unknown_type $pages
1736 * @param unknown_type $pagenum
1737 * @param unknown_type $per_page
1738 * @return unknown
1739 */
1740function page_rows($pages, $pagenum = 1, $per_page = 20) {
1741 global $wpdb;
1742
1743 $level = 0;
1744
1745 if ( ! $pages ) {
1746 $pages = get_pages( array('sort_column' => 'menu_order') );
1747
1748 if ( ! $pages )
1749 return false;
1750 }
1751
1752 /*
1753 * arrange pages into two parts: top level pages and children_pages
1754 * children_pages is two dimensional array, eg.
1755 * children_pages[10][] contains all sub-pages whose parent is 10.
1756 * It only takes O(N) to arrange this and it takes O(1) for subsequent lookup operations
1757 * If searching, ignore hierarchy and treat everything as top level
1758 */
1759 if ( empty($_GET['s']) ) {
1760
1761 $top_level_pages = array();
1762 $children_pages = array();
1763
1764 foreach ( $pages as $page ) {
1765
1766 // catch and repair bad pages
1767 if ( $page->post_parent == $page->ID ) {
1768 $page->post_parent = 0;
1769 $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_parent = '0' WHERE ID = %d", $page->ID) );
1770 clean_page_cache( $page->ID );
1771 }
1772
1773 if ( 0 == $page->post_parent )
1774 $top_level_pages[] = $page;
1775 else
1776 $children_pages[ $page->post_parent ][] = $page;
1777 }
1778
1779 $pages = &$top_level_pages;
1780 }
1781
1782 $count = 0;
1783 $start = ($pagenum - 1) * $per_page;
1784 $end = $start + $per_page;
1785
1786 foreach ( $pages as $page ) {
1787 if ( $count >= $end )
1788 break;
1789
1790 if ( $count >= $start )
1791 echo "\t" . display_page_row( $page, $level );
1792
1793 $count++;
1794
1795 if ( isset($children_pages) )
1796 _page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
1797 }
1798
1799 // if it is the last pagenum and there are orphaned pages, display them with paging as well
1800 if ( isset($children_pages) && $count < $end ){
1801 foreach( $children_pages as $orphans ){
1802 foreach ( $orphans as $op ) {
1803 if ( $count >= $end )
1804 break;
1805 if ( $count >= $start )
1806 echo "\t" . display_page_row( $op, 0 );
1807 $count++;
1808 }
1809 }
1810 }
1811}
1812
1813/*
1814 * Given a top level page ID, display the nested hierarchy of sub-pages
1815 * together with paging support
1816 */
1817/**
1818 * {@internal Missing Short Description}}
1819 *
1820 * @since unknown
1821 *
1822 * @param unknown_type $children_pages
1823 * @param unknown_type $count
1824 * @param unknown_type $parent
1825 * @param unknown_type $level
1826 * @param unknown_type $pagenum
1827 * @param unknown_type $per_page
1828 */
1829function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page ) {
1830
1831 if ( ! isset( $children_pages[$parent] ) )
1832 return;
1833
1834 $start = ($pagenum - 1) * $per_page;
1835 $end = $start + $per_page;
1836
1837 foreach ( $children_pages[$parent] as $page ) {
1838
1839 if ( $count >= $end )
1840 break;
1841
1842 // If the page starts in a subtree, print the parents.
1843 if ( $count == $start && $page->post_parent > 0 ) {
1844 $my_parents = array();
1845 $my_parent = $page->post_parent;
1846 while ( $my_parent) {
1847 $my_parent = get_post($my_parent);
1848 $my_parents[] = $my_parent;
1849 if ( !$my_parent->post_parent )
1850 break;
1851 $my_parent = $my_parent->post_parent;
1852 }
1853 $num_parents = count($my_parents);
1854 while( $my_parent = array_pop($my_parents) ) {
1855 echo "\t" . display_page_row( $my_parent, $level - $num_parents );
1856 $num_parents--;
1857 }
1858 }
1859
1860 if ( $count >= $start )
1861 echo "\t" . display_page_row( $page, $level );
1862
1863 $count++;
1864
1865 _page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page );
1866 }
1867
1868 unset( $children_pages[$parent] ); //required in order to keep track of orphans
1869}
1870
1871/**
1872 * {@internal Missing Short Description}}
1873 *
1874 * @since unknown
1875 *
1876 * @param unknown_type $user_object
1877 * @param unknown_type $style
1878 * @param unknown_type $role
1879 * @return unknown
1880 */
1881function user_row( $user_object, $style = '', $role = '' ) {
1882 global $wp_roles;
1883
1884 $current_user = wp_get_current_user();
1885
1886 if ( !( is_object( $user_object) && is_a( $user_object, 'WP_User' ) ) )
1887 $user_object = new WP_User( (int) $user_object );
1888 $email = $user_object->user_email;
1889 $url = $user_object->user_url;
1890 $short_url = str_replace( 'http://', '', $url );
1891 $short_url = str_replace( 'www.', '', $short_url );
1892 if ('/' == substr( $short_url, -1 ))
1893 $short_url = substr( $short_url, 0, -1 );
1894 if ( strlen( $short_url ) > 35 )
1895 $short_url = substr( $short_url, 0, 32 ).'...';
1896 $numposts = get_usernumposts( $user_object->ID );
1897 $checkbox = '';
1898 // Check if the user for this row is editable
1899 if ( current_user_can( 'edit_user', $user_object->ID ) ) {
1900 // Set up the user editing link
1901 // TODO: make profile/user-edit determination a seperate function
1902 if ($current_user->ID == $user_object->ID) {
1903 $edit_link = 'profile.php';
1904 } else {
1905 $edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( esc_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) );
1906 }
1907 $edit = "<strong><a href=\"$edit_link\">$user_object->user_login</a></strong><br />";
1908
1909 // Set up the hover actions for this user
1910 $actions = array();
1911 $actions['edit'] = '<a href="' . $edit_link . '">' . __('Edit') . '</a>';
1912 if ( $current_user->ID != $user_object->ID )
1913 $actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url("users.php?action=delete&amp;user=$user_object->ID", 'bulk-users') . "'>" . __('Delete') . "</a>";
1914 $actions = apply_filters('user_row_actions', $actions, $user_object);
1915 $action_count = count($actions);
1916 $i = 0;
1917 $edit .= '<div class="row-actions">';
1918 foreach ( $actions as $action => $link ) {
1919 ++$i;
1920 ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
1921 $edit .= "<span class='$action'>$link$sep</span>";
1922 }
1923 $edit .= '</div>';
1924
1925 // Set up the checkbox (because the user is editable, otherwise its empty)
1926 $checkbox = "<input type='checkbox' name='users[]' id='user_{$user_object->ID}' class='$role' value='{$user_object->ID}' />";
1927
1928 } else {
1929 $edit = '<strong>' . $user_object->user_login . '</strong>';
1930 }
1931 $role_name = isset($wp_roles->role_names[$role]) ? translate_user_role($wp_roles->role_names[$role] ) : __('None');
1932 $r = "<tr id='user-$user_object->ID'$style>";
1933 $columns = get_column_headers('users');
1934 $hidden = get_hidden_columns('users');
1935 $avatar = get_avatar( $user_object->ID, 32 );
1936 foreach ( $columns as $column_name => $column_display_name ) {
1937 $class = "class=\"$column_name column-$column_name\"";
1938
1939 $style = '';
1940 if ( in_array($column_name, $hidden) )
1941 $style = ' style="display:none;"';
1942
1943 $attributes = "$class$style";
1944
1945 switch ($column_name) {
1946 case 'cb':
1947 $r .= "<th scope='row' class='check-column'>$checkbox</th>";
1948 break;
1949 case 'username':
1950 $r .= "<td $attributes>$avatar $edit</td>";
1951 break;
1952 case 'name':
1953 $r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";
1954 break;
1955 case 'email':
1956 $r .= "<td $attributes><a href='mailto:$email' title='" . sprintf( __('e-mail: %s' ), $email ) . "'>$email</a></td>";
1957 break;
1958 case 'role':
1959 $r .= "<td $attributes>$role_name</td>";
1960 break;
1961 case 'posts':
1962 $attributes = 'class="posts column-posts num"' . $style;
1963 $r .= "<td $attributes>";
1964 if ( $numposts > 0 ) {
1965 $r .= "<a href='edit.php?author=$user_object->ID' title='" . __( 'View posts by this author' ) . "' class='edit'>";
1966 $r .= $numposts;
1967 $r .= '</a>';
1968 } else {
1969 $r .= 0;
1970 }
1971 $r .= "</td>";
1972 break;
1973 default:
1974 $r .= "<td $attributes>";
1975 $r .= apply_filters('manage_users_custom_column', '', $column_name, $user_object->ID);
1976 $r .= "</td>";
1977 }
1978 }
1979 $r .= '</tr>';
1980
1981 return $r;
1982}
1983
1984/**
1985 * {@internal Missing Short Description}}
1986 *
1987 * @since unknown
1988 *
1989 * @param unknown_type $status
1990 * @param unknown_type $s
1991 * @param unknown_type $start
1992 * @param unknown_type $num
1993 * @param unknown_type $post
1994 * @param unknown_type $type
1995 * @return unknown
1996 */
1997function _wp_get_comment_list( $status = '', $s = false, $start, $num, $post = 0, $type = '' ) {
1998 global $wpdb;
1999
2000 $start = abs( (int) $start );
2001 $num = (int) $num;
2002 $post = (int) $post;
2003 $count = wp_count_comments();
2004 $index = '';
2005
2006 if ( 'moderated' == $status ) {
2007 $approved = "comment_approved = '0'";
2008 $total = $count->moderated;
2009 } elseif ( 'approved' == $status ) {
2010 $approved = "comment_approved = '1'";
2011 $total = $count->approved;
2012 } elseif ( 'spam' == $status ) {
2013 $approved = "comment_approved = 'spam'";
2014 $total = $count->spam;
2015 } else {
2016 $approved = "( comment_approved = '0' OR comment_approved = '1' )";
2017 $total = $count->moderated + $count->approved;
2018 $index = 'USE INDEX (comment_date_gmt)';
2019 }
2020
2021 if ( $post ) {
2022 $total = '';
2023 $post = " AND comment_post_ID = '$post'";
2024 $orderby = "ORDER BY comment_date_gmt ASC LIMIT $start, $num";
2025 } else {
2026 $post = '';
2027 $orderby = "ORDER BY comment_date_gmt DESC LIMIT $start, $num";
2028 }
2029
2030 if ( 'comment' == $type )
2031 $typesql = "AND comment_type = ''";
2032 elseif ( 'pingback' == $type )
2033 $typesql = "AND comment_type = 'pingback'";
2034 elseif ( 'trackback' == $type )
2035 $typesql = "AND comment_type = 'trackback'";
2036 elseif ( 'pings' == $type )
2037 $typesql = "AND ( comment_type = 'pingback' OR comment_type = 'trackback' )";
2038 else
2039 $typesql = '';
2040
2041 if ( !empty($type) )
2042 $total = '';
2043
2044 if ( $s ) {
2045 $total = '';
2046 $s = $wpdb->escape($s);
2047 $query = "FROM $wpdb->comments WHERE
2048 (comment_author LIKE '%$s%' OR
2049 comment_author_email LIKE '%$s%' OR
2050 comment_author_url LIKE ('%$s%') OR
2051 comment_author_IP LIKE ('%$s%') OR
2052 comment_content LIKE ('%$s%') ) AND
2053 $approved
2054 $typesql";
2055 } else {
2056 $query = "FROM $wpdb->comments $index WHERE $approved $post $typesql";
2057 }
2058
2059 $comments = $wpdb->get_results("SELECT * $query $orderby");
2060 if ( '' === $total )
2061 $total = $wpdb->get_var("SELECT COUNT(comment_ID) $query");
2062
2063 update_comment_cache($comments);
2064
2065 return array($comments, $total);
2066}
2067
2068/**
2069 * {@internal Missing Short Description}}
2070 *
2071 * @since unknown
2072 *
2073 * @param unknown_type $comment_id
2074 * @param unknown_type $mode
2075 * @param unknown_type $comment_status
2076 * @param unknown_type $checkbox
2077 */
2078function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, $from_ajax = false ) {
2079 global $comment, $post, $_comment_pending_count;
2080 $comment = get_comment( $comment_id );
2081 $post = get_post($comment->comment_post_ID);
2082 $the_comment_status = wp_get_comment_status($comment->comment_ID);
2083 $user_can = current_user_can('edit_post', $post->ID);
2084
2085 $author_url = get_comment_author_url();
2086 if ( 'http://' == $author_url )
2087 $author_url = '';
2088 $author_url_display = $author_url;
2089 $author_url_display = str_replace('http://www.', '', $author_url_display);
2090 $author_url_display = str_replace('http://', '', $author_url_display);
2091 if ( strlen($author_url_display) > 50 )
2092 $author_url_display = substr($author_url_display, 0, 49) . '...';
2093
2094 $ptime = date('G', strtotime( $comment->comment_date ) );
2095 if ( ( abs(time() - $ptime) ) < 86400 )
2096 $ptime = sprintf( __('%s ago'), human_time_diff( $ptime ) );
2097 else
2098 $ptime = mysql2date(__('Y/m/d \a\t g:i A'), $comment->comment_date );
2099
2100 $delete_url = esc_url( wp_nonce_url( "comment.php?action=deletecomment&p=$post->ID&c=$comment->comment_ID", "delete-comment_$comment->comment_ID" ) );
2101 $approve_url = esc_url( wp_nonce_url( "comment.php?action=approvecomment&p=$post->ID&c=$comment->comment_ID", "approve-comment_$comment->comment_ID" ) );
2102 $unapprove_url = esc_url( wp_nonce_url( "comment.php?action=unapprovecomment&p=$post->ID&c=$comment->comment_ID", "unapprove-comment_$comment->comment_ID" ) );
2103 $spam_url = esc_url( wp_nonce_url( "comment.php?action=deletecomment&dt=spam&p=$post->ID&c=$comment->comment_ID", "delete-comment_$comment->comment_ID" ) );
2104
2105 echo "<tr id='comment-$comment->comment_ID' class='$the_comment_status'>";
2106 $columns = get_column_headers('edit-comments');
2107 $hidden = get_hidden_columns('edit-comments');
2108 foreach ( $columns as $column_name => $column_display_name ) {
2109 $class = "class=\"$column_name column-$column_name\"";
2110
2111 $style = '';
2112 if ( in_array($column_name, $hidden) )
2113 $style = ' style="display:none;"';
2114
2115 $attributes = "$class$style";
2116
2117 switch ($column_name) {
2118 case 'cb':
2119 if ( !$checkbox ) break;
2120 echo '<th scope="row" class="check-column">';
2121 if ( $user_can ) echo "<input type='checkbox' name='delete_comments[]' value='$comment->comment_ID' />";
2122 echo '</th>';
2123 break;
2124 case 'comment':
2125 echo "<td $attributes>";
2126 echo '<div id="submitted-on">';
2127 printf(__('Submitted on <a href="%1$s">%2$s at %3$s</a>'), get_comment_link($comment->comment_ID), get_comment_date(__('Y/m/d')), get_comment_date(__('g:ia')));
2128 echo '</div>';
2129 comment_text(); ?>
2130 <div id="inline-<?php echo $comment->comment_ID; ?>" class="hidden">
2131 <textarea class="comment" rows="3" cols="10"><?php echo $comment->comment_content; ?></textarea>
2132 <div class="author-email"><?php if ( $user_can ) echo esc_attr( $comment->comment_author_email ); ?></div>
2133 <div class="author"><?php if ( $user_can ) echo esc_attr( $comment->comment_author ); ?></div>
2134 <div class="author-url"><?php echo esc_attr( $comment->comment_author_url ); ?></div>
2135 <div class="comment_status"><?php echo $comment->comment_approved; ?></div>
2136 </div>
2137 <?php
2138 $actions = array();
2139
2140 if ( $user_can ) {
2141 $actions['approve'] = "<a href='$approve_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved vim-a' title='" . __( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
2142 $actions['unapprove'] = "<a href='$unapprove_url' class='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved vim-u' title='" . __( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
2143 if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments
2144 if ( 'approved' == $the_comment_status ) {
2145 $actions['unapprove'] = "<a href='$unapprove_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=unapproved vim-u vim-destructive' title='" . __( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
2146 unset($actions['approve']);
2147 } else {
2148 $actions['approve'] = "<a href='$approve_url' class='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=approved vim-a vim-destructive' title='" . __( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
2149 unset($actions['unapprove']);
2150 }
2151 }
2152 if ( 'spam' != $the_comment_status )
2153 $actions['spam'] = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . __( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';
2154 $actions['delete'] = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID delete vim-d vim-destructive'>" . __('Delete') . '</a>';
2155 $actions['edit'] = "<a href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='" . __('Edit comment') . "'>". __('Edit') . '</a>';
2156 $actions['quickedit'] = '<a onclick="commentReply.open(\''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\');return false;" class="vim-q" title="'.__('Quick Edit').'" href="#">' . __('Quick&nbsp;Edit') . '</a>';
2157 if ( 'spam' != $the_comment_status )
2158 $actions['reply'] = '<a onclick="commentReply.open(\''.$comment->comment_ID.'\',\''.$post->ID.'\');return false;" class="vim-r" title="'.__('Reply to this comment').'" href="#">' . __('Reply') . '</a>';
2159
2160 $actions = apply_filters( 'comment_row_actions', $actions, $comment );
2161
2162 $i = 0;
2163 echo '<div class="row-actions">';
2164 foreach ( $actions as $action => $link ) {
2165 ++$i;
2166 ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';
2167
2168 // Reply and quickedit need a hide-if-no-js span when not added with ajax
2169 if ( ('reply' == $action || 'quickedit' == $action) && ! $from_ajax )
2170 $action .= ' hide-if-no-js';
2171
2172 echo "<span class='$action'>$sep$link</span>";
2173 }
2174 echo '</div>';
2175 }
2176
2177 echo '</td>';
2178 break;
2179 case 'author':
2180 echo "<td $attributes><strong>"; comment_author(); echo '</strong><br />';
2181 if ( !empty($author_url) )
2182 echo "<a title='$author_url' href='$author_url'>$author_url_display</a><br />";
2183 if ( $user_can ) {
2184 if ( !empty($comment->comment_author_email) ) {
2185 comment_author_email_link();
2186 echo '<br />';
2187 }
2188 echo '<a href="edit-comments.php?s=';
2189 comment_author_IP();
2190 echo '&amp;mode=detail';
2191 if ( 'spam' == $comment_status )
2192 echo '&amp;comment_status=spam';
2193 echo '">';
2194 comment_author_IP();
2195 echo '</a>';
2196 } //current_user_can
2197 echo '</td>';
2198 break;
2199 case 'date':
2200 echo "<td $attributes>" . get_comment_date(__('Y/m/d \a\t g:ia')) . '</td>';
2201 break;
2202 case 'response':
2203 if ( 'single' !== $mode ) {
2204 if ( isset( $_comment_pending_count[$post->ID] ) ) {
2205 $pending_comments = absint( $_comment_pending_count[$post->ID] );
2206 } else {
2207 $_comment_pending_count_temp = (array) get_pending_comments_num( array( $post->ID ) );
2208 $pending_comments = $_comment_pending_count[$post->ID] = $_comment_pending_count_temp[$post->ID];
2209 }
2210 if ( $user_can ) {
2211 $post_link = "<a href='" . get_edit_post_link($post->ID) . "'>";
2212 $post_link .= get_the_title($post->ID) . '</a>';
2213 } else {
2214 $post_link = get_the_title($post->ID);
2215 }
2216 echo "<td $attributes>\n";
2217 echo '<div class="response-links"><span class="post-com-count-wrapper">';
2218 echo $post_link . '<br />';
2219 $pending_phrase = sprintf( __('%s pending'), number_format( $pending_comments ) );
2220 if ( $pending_comments )
2221 echo '<strong>';
2222 comments_number("<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('0', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link */ _x('1', 'comment count') . '</span></a>', "<a href='edit-comments.php?p=$post->ID' title='$pending_phrase' class='post-com-count'><span class='comment-count'>" . /* translators: comment count link: % will be substituted by comment count */ _x('%', 'comment count') . '</span></a>');
2223 if ( $pending_comments )
2224 echo '</strong>';
2225 echo '</span> ';
2226 echo "<a href='" . get_permalink( $post->ID ) . "'>#</a>";
2227 echo '</div>';
2228 if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array(80, 60), true ) ) )
2229 echo $thumb;
2230 echo '</td>';
2231 }
2232 break;
2233 default:
2234 echo "<td $attributes>\n";
2235 do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );
2236 echo "</td>\n";
2237 break;
2238 }
2239 }
2240 echo "</tr>\n";
2241}
2242
2243/**
2244 * {@internal Missing Short Description}}
2245 *
2246 * @since unknown
2247 *
2248 * @param unknown_type $position
2249 * @param unknown_type $checkbox
2250 * @param unknown_type $mode
2251 */
2252function wp_comment_reply($position = '1', $checkbox = false, $mode = 'single', $table_row = true) {
2253 global $current_user;
2254
2255 // allow plugin to replace the popup content
2256 $content = apply_filters( 'wp_comment_reply', '', array('position' => $position, 'checkbox' => $checkbox, 'mode' => $mode) );
2257
2258 if ( ! empty($content) ) {
2259 echo $content;
2260 return;
2261 }
2262
2263 $columns = get_column_headers('edit-comments');
2264 $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns('edit-comments') ) );
2265 $col_count = count($columns) - count($hidden);
2266
2267?>
2268<form method="get" action="">
2269<?php if ( $table_row ) : ?>
2270<table style="display:none;"><tbody id="com-reply"><tr id="replyrow"><td colspan="<?php echo $col_count; ?>">
2271<?php else : ?>
2272<div id="com-reply" style="display:none;"><div id="replyrow">
2273<?php endif; ?>
2274 <div id="replyhead" style="display:none;"><?php _e('Reply to Comment'); ?></div>
2275
2276 <div id="edithead" style="display:none;">
2277 <div class="inside">
2278 <label for="author"><?php _e('Name') ?></label>
2279 <input type="text" name="newcomment_author" size="50" value="" tabindex="101" id="author" />
2280 </div>
2281
2282 <div class="inside">
2283 <label for="author-email"><?php _e('E-mail') ?></label>
2284 <input type="text" name="newcomment_author_email" size="50" value="" tabindex="102" id="author-email" />
2285 </div>
2286
2287 <div class="inside">
2288 <label for="author-url"><?php _e('URL') ?></label>
2289 <input type="text" id="author-url" name="newcomment_author_url" size="103" value="" tabindex="103" />
2290 </div>
2291 <div style="clear:both;"></div>
2292 </div>
2293
2294 <div id="replycontainer"><textarea rows="8" cols="40" name="replycontent" tabindex="104" id="replycontent"></textarea></div>
2295
2296 <p id="replysubmit" class="submit">
2297 <a href="#comments-form" class="cancel button-secondary alignleft" tabindex="106"><?php _e('Cancel'); ?></a>
2298 <a href="#comments-form" class="save button-primary alignright" tabindex="104">
2299 <span id="savebtn" style="display:none;"><?php _e('Update Comment'); ?></span>
2300 <span id="replybtn" style="display:none;"><?php _e('Submit Reply'); ?></span></a>
2301 <img class="waiting" style="display:none;" src="images/wpspin_light.gif" alt="" />
2302 <span class="error" style="display:none;"></span>
2303 <br class="clear" />
2304 </p>
2305
2306 <input type="hidden" name="user_ID" id="user_ID" value="<?php echo $current_user->ID; ?>" />
2307 <input type="hidden" name="action" id="action" value="" />
2308 <input type="hidden" name="comment_ID" id="comment_ID" value="" />
2309 <input type="hidden" name="comment_post_ID" id="comment_post_ID" value="" />
2310 <input type="hidden" name="status" id="status" value="" />
2311 <input type="hidden" name="position" id="position" value="<?php echo $position; ?>" />
2312 <input type="hidden" name="checkbox" id="checkbox" value="<?php echo $checkbox ? 1 : 0; ?>" />
2313 <input type="hidden" name="mode" id="mode" value="<?php echo esc_attr($mode); ?>" />
2314 <?php wp_nonce_field( 'replyto-comment', '_ajax_nonce', false ); ?>
2315 <?php wp_comment_form_unfiltered_html_nonce(); ?>
2316<?php if ( $table_row ) : ?>
2317</td></tr></tbody></table>
2318<?php else : ?>
2319</div></div>
2320<?php endif; ?>
2321</form>
2322<?php
2323}
2324
2325/**
2326 * {@internal Missing Short Description}}
2327 *
2328 * @since unknown
2329 *
2330 * @param unknown_type $currentcat
2331 * @param unknown_type $currentparent
2332 * @param unknown_type $parent
2333 * @param unknown_type $level
2334 * @param unknown_type $categories
2335 * @return unknown
2336 */
2337function wp_dropdown_cats( $currentcat = 0, $currentparent = 0, $parent = 0, $level = 0, $categories = 0 ) {
2338 if (!$categories )
2339 $categories = get_categories( array('hide_empty' => 0) );
2340
2341 if ( $categories ) {
2342 foreach ( $categories as $category ) {
2343 if ( $currentcat != $category->term_id && $parent == $category->parent) {
2344 $pad = str_repeat( '&#8211; ', $level );
2345 $category->name = esc_html( $category->name );
2346 echo "\n\t<option value='$category->term_id'";
2347 if ( $currentparent == $category->term_id )
2348 echo " selected='selected'";
2349 echo ">$pad$category->name</option>";
2350 wp_dropdown_cats( $currentcat, $currentparent, $category->term_id, $level +1, $categories );
2351 }
2352 }
2353 } else {
2354 return false;
2355 }
2356}
2357
2358/**
2359 * {@internal Missing Short Description}}
2360 *
2361 * @since unknown
2362 *
2363 * @param unknown_type $meta
2364 */
2365function list_meta( $meta ) {
2366 // Exit if no meta
2367 if ( ! $meta ) {
2368 echo '
2369<table id="list-table" style="display: none;">
2370 <thead>
2371 <tr>
2372 <th class="left">' . __( 'Name' ) . '</th>
2373 <th>' . __( 'Value' ) . '</th>
2374 </tr>
2375 </thead>
2376 <tbody id="the-list" class="list:meta">
2377 <tr><td></td></tr>
2378 </tbody>
2379</table>'; //TBODY needed for list-manipulation JS
2380 return;
2381 }
2382 $count = 0;
2383?>
2384<table id="list-table">
2385 <thead>
2386 <tr>
2387 <th class="left"><?php _e( 'Name' ) ?></th>
2388 <th><?php _e( 'Value' ) ?></th>
2389 </tr>
2390 </thead>
2391 <tbody id='the-list' class='list:meta'>
2392<?php
2393 foreach ( $meta as $entry )
2394 echo _list_meta_row( $entry, $count );
2395?>
2396 </tbody>
2397</table>
2398<?php
2399}
2400
2401/**
2402 * {@internal Missing Short Description}}
2403 *
2404 * @since unknown
2405 *
2406 * @param unknown_type $entry
2407 * @param unknown_type $count
2408 * @return unknown
2409 */
2410function _list_meta_row( $entry, &$count ) {
2411 static $update_nonce = false;
2412 if ( !$update_nonce )
2413 $update_nonce = wp_create_nonce( 'add-meta' );
2414
2415 $r = '';
2416 ++ $count;
2417 if ( $count % 2 )
2418 $style = 'alternate';
2419 else
2420 $style = '';
2421 if ('_' == $entry['meta_key'] { 0 } )
2422 $style .= ' hidden';
2423
2424 if ( is_serialized( $entry['meta_value'] ) ) {
2425 if ( is_serialized_string( $entry['meta_value'] ) ) {
2426 // this is a serialized string, so we should display it
2427 $entry['meta_value'] = maybe_unserialize( $entry['meta_value'] );
2428 } else {
2429 // this is a serialized array/object so we should NOT display it
2430 --$count;
2431 return;
2432 }
2433 }
2434
2435 $entry['meta_key'] = esc_attr($entry['meta_key']);
2436 $entry['meta_value'] = htmlspecialchars($entry['meta_value']); // using a <textarea />
2437 $entry['meta_id'] = (int) $entry['meta_id'];
2438
2439 $delete_nonce = wp_create_nonce( 'delete-meta_' . $entry['meta_id'] );
2440
2441 $r .= "\n\t<tr id='meta-{$entry['meta_id']}' class='$style'>";
2442 $r .= "\n\t\t<td class='left'><label class='screen-reader-text' for='meta[{$entry['meta_id']}][key]'>" . __( 'Key' ) . "</label><input name='meta[{$entry['meta_id']}][key]' id='meta[{$entry['meta_id']}][key]' tabindex='6' type='text' size='20' value='{$entry['meta_key']}' />";
2443
2444 $r .= "\n\t\t<div class='submit'><input name='deletemeta[{$entry['meta_id']}]' type='submit' ";
2445 $r .= "class='delete:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$delete_nonce deletemeta' tabindex='6' value='". esc_attr__( 'Delete' ) ."' />";
2446 $r .= "\n\t\t<input name='updatemeta' type='submit' tabindex='6' value='". esc_attr__( 'Update' ) ."' class='add:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$update_nonce updatemeta' /></div>";
2447 $r .= wp_nonce_field( 'change-meta', '_ajax_nonce', false, false );
2448 $r .= "</td>";
2449
2450 $r .= "\n\t\t<td><label class='screen-reader-text' for='meta[{$entry['meta_id']}][value]'>" . __( 'Value' ) . "</label><textarea name='meta[{$entry['meta_id']}][value]' id='meta[{$entry['meta_id']}][value]' tabindex='6' rows='2' cols='30'>{$entry['meta_value']}</textarea></td>\n\t</tr>";
2451 return $r;
2452}
2453
2454/**
2455 * {@internal Missing Short Description}}
2456 *
2457 * @since unknown
2458 */
2459function meta_form() {
2460 global $wpdb;
2461 $limit = (int) apply_filters( 'postmeta_form_limit', 30 );
2462 $keys = $wpdb->get_col( "
2463 SELECT meta_key
2464 FROM $wpdb->postmeta
2465 GROUP BY meta_key
2466 HAVING meta_key NOT LIKE '\_%'
2467 ORDER BY LOWER(meta_key)
2468 LIMIT $limit" );
2469 if ( $keys )
2470 natcasesort($keys);
2471?>
2472<p><strong><?php _e( 'Add new custom field:' ) ?></strong></p>
2473<table id="newmeta">
2474<thead>
2475<tr>
2476<th class="left"><label for="metakeyselect"><?php _e( 'Name' ) ?></label></th>
2477<th><label for="metavalue"><?php _e( 'Value' ) ?></label></th>
2478</tr>
2479</thead>
2480
2481<tbody>
2482<tr>
2483<td id="newmetaleft" class="left">
2484<?php if ( $keys ) { ?>
2485<select id="metakeyselect" name="metakeyselect" tabindex="7">
2486<option value="#NONE#"><?php _e( '- Select -' ); ?></option>
2487<?php
2488
2489 foreach ( $keys as $key ) {
2490 $key = esc_attr( $key );
2491 echo "\n<option value='" . esc_attr($key) . "'>$key</option>";
2492 }
2493?>
2494</select>
2495<input class="hide-if-js" type="text" id="metakeyinput" name="metakeyinput" tabindex="7" value="" />
2496<a href="#postcustomstuff" class="hide-if-no-js" onclick="jQuery('#metakeyinput, #metakeyselect, #enternew, #cancelnew').toggle();return false;">
2497<span id="enternew"><?php _e('Enter new'); ?></span>
2498<span id="cancelnew" class="hidden"><?php _e('Cancel'); ?></span></a>
2499<?php } else { ?>
2500<input type="text" id="metakeyinput" name="metakeyinput" tabindex="7" value="" />
2501<?php } ?>
2502</td>
2503<td><textarea id="metavalue" name="metavalue" rows="2" cols="25" tabindex="8"></textarea></td>
2504</tr>
2505
2506<tr><td colspan="2" class="submit">
2507<input type="submit" id="addmetasub" name="addmeta" class="add:the-list:newmeta" tabindex="9" value="<?php esc_attr_e( 'Add Custom Field' ) ?>" />
2508<?php wp_nonce_field( 'add-meta', '_ajax_nonce', false ); ?>
2509</td></tr>
2510</tbody>
2511</table>
2512<?php
2513
2514}
2515
2516/**
2517 * {@internal Missing Short Description}}
2518 *
2519 * @since unknown
2520 *
2521 * @param unknown_type $edit
2522 * @param unknown_type $for_post
2523 * @param unknown_type $tab_index
2524 * @param unknown_type $multi
2525 */
2526function touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) {
2527 global $wp_locale, $post, $comment;
2528
2529 if ( $for_post )
2530 $edit = ( in_array($post->post_status, array('draft', 'pending') ) && (!$post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) ) ? false : true;
2531
2532 $tab_index_attribute = '';
2533 if ( (int) $tab_index > 0 )
2534 $tab_index_attribute = " tabindex=\"$tab_index\"";
2535
2536 // echo '<label for="timestamp" style="display: block;"><input type="checkbox" class="checkbox" name="edit_date" value="1" id="timestamp"'.$tab_index_attribute.' /> '.__( 'Edit timestamp' ).'</label><br />';
2537
2538 $time_adj = time() + (get_option( 'gmt_offset' ) * 3600 );
2539 $post_date = ($for_post) ? $post->post_date : $comment->comment_date;
2540 $jj = ($edit) ? mysql2date( 'd', $post_date, false ) : gmdate( 'd', $time_adj );
2541 $mm = ($edit) ? mysql2date( 'm', $post_date, false ) : gmdate( 'm', $time_adj );
2542 $aa = ($edit) ? mysql2date( 'Y', $post_date, false ) : gmdate( 'Y', $time_adj );
2543 $hh = ($edit) ? mysql2date( 'H', $post_date, false ) : gmdate( 'H', $time_adj );
2544 $mn = ($edit) ? mysql2date( 'i', $post_date, false ) : gmdate( 'i', $time_adj );
2545 $ss = ($edit) ? mysql2date( 's', $post_date, false ) : gmdate( 's', $time_adj );
2546
2547 $cur_jj = gmdate( 'd', $time_adj );
2548 $cur_mm = gmdate( 'm', $time_adj );
2549 $cur_aa = gmdate( 'Y', $time_adj );
2550 $cur_hh = gmdate( 'H', $time_adj );
2551 $cur_mn = gmdate( 'i', $time_adj );
2552
2553 $month = "<select " . ( $multi ? '' : 'id="mm" ' ) . "name=\"mm\"$tab_index_attribute>\n";
2554 for ( $i = 1; $i < 13; $i = $i +1 ) {
2555 $month .= "\t\t\t" . '<option value="' . zeroise($i, 2) . '"';
2556 if ( $i == $mm )
2557 $month .= ' selected="selected"';
2558 $month .= '>' . $wp_locale->get_month_abbrev( $wp_locale->get_month( $i ) ) . "</option>\n";
2559 }
2560 $month .= '</select>';
2561
2562 $day = '<input type="text" ' . ( $multi ? '' : 'id="jj" ' ) . 'name="jj" value="' . $jj . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
2563 $year = '<input type="text" ' . ( $multi ? '' : 'id="aa" ' ) . 'name="aa" value="' . $aa . '" size="4" maxlength="4"' . $tab_index_attribute . ' autocomplete="off" />';
2564 $hour = '<input type="text" ' . ( $multi ? '' : 'id="hh" ' ) . 'name="hh" value="' . $hh . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
2565 $minute = '<input type="text" ' . ( $multi ? '' : 'id="mn" ' ) . 'name="mn" value="' . $mn . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
2566 /* translators: 1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input */
2567 printf(__('%1$s%2$s, %3$s @ %4$s : %5$s'), $month, $day, $year, $hour, $minute);
2568
2569 echo '<input type="hidden" id="ss" name="ss" value="' . $ss . '" />';
2570
2571 if ( $multi ) return;
2572
2573 echo "\n\n";
2574 foreach ( array('mm', 'jj', 'aa', 'hh', 'mn') as $timeunit ) {
2575 echo '<input type="hidden" id="hidden_' . $timeunit . '" name="hidden_' . $timeunit . '" value="' . $$timeunit . '" />' . "\n";
2576 $cur_timeunit = 'cur_' . $timeunit;
2577 echo '<input type="hidden" id="'. $cur_timeunit . '" name="'. $cur_timeunit . '" value="' . $$cur_timeunit . '" />' . "\n";
2578 }
2579?>
2580
2581<p>
2582<a href="#edit_timestamp" class="save-timestamp hide-if-no-js button"><?php _e('OK'); ?></a>
2583<a href="#edit_timestamp" class="cancel-timestamp hide-if-no-js"><?php _e('Cancel'); ?></a>
2584</p>
2585<?php
2586}
2587
2588/**
2589 * {@internal Missing Short Description}}
2590 *
2591 * @since unknown
2592 *
2593 * @param unknown_type $default
2594 */
2595function page_template_dropdown( $default = '' ) {
2596 $templates = get_page_templates();
2597 ksort( $templates );
2598 foreach (array_keys( $templates ) as $template )
2599 : if ( $default == $templates[$template] )
2600 $selected = " selected='selected'";
2601 else
2602 $selected = '';
2603 echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
2604 endforeach;
2605}
2606
2607/**
2608 * {@internal Missing Short Description}}
2609 *
2610 * @since unknown
2611 *
2612 * @param unknown_type $default
2613 * @param unknown_type $parent
2614 * @param unknown_type $level
2615 * @return unknown
2616 */
2617function parent_dropdown( $default = 0, $parent = 0, $level = 0 ) {
2618 global $wpdb, $post_ID;
2619 $items = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'page' ORDER BY menu_order", $parent) );
2620
2621 if ( $items ) {
2622 foreach ( $items as $item ) {
2623 // A page cannot be its own parent.
2624 if (!empty ( $post_ID ) ) {
2625 if ( $item->ID == $post_ID ) {
2626 continue;
2627 }
2628 }
2629 $pad = str_repeat( '&nbsp;', $level * 3 );
2630 if ( $item->ID == $default)
2631 $current = ' selected="selected"';
2632 else
2633 $current = '';
2634
2635 echo "\n\t<option class='level-$level' value='$item->ID'$current>$pad " . esc_html($item->post_title) . "</option>";
2636 parent_dropdown( $default, $item->ID, $level +1 );
2637 }
2638 } else {
2639 return false;
2640 }
2641}
2642
2643/**
2644 * {@internal Missing Short Description}}
2645 *
2646 * @since unknown
2647 */
2648function browse_happy() {
2649 $getit = __( 'WordPress recommends a better browser' );
2650 echo '
2651 <div id="bh"><a href="http://browsehappy.com/" title="'.$getit.'"><img src="images/browse-happy.gif" alt="Browse Happy" /></a></div>
2652';
2653}
2654
2655/**
2656 * {@internal Missing Short Description}}
2657 *
2658 * @since unknown
2659 *
2660 * @param unknown_type $id
2661 * @return unknown
2662 */
2663function the_attachment_links( $id = false ) {
2664 $id = (int) $id;
2665 $post = & get_post( $id );
2666
2667 if ( $post->post_type != 'attachment' )
2668 return false;
2669
2670 $icon = get_attachment_icon( $post->ID );
2671 $attachment_data = wp_get_attachment_metadata( $id );
2672 $thumb = isset( $attachment_data['thumb'] );
2673?>
2674<form id="the-attachment-links">
2675<table>
2676 <col />
2677 <col class="widefat" />
2678 <tr>
2679 <th scope="row"><?php _e( 'URL' ) ?></th>
2680 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><?php echo wp_get_attachment_url(); ?></textarea></td>
2681 </tr>
2682<?php if ( $icon ) : ?>
2683 <tr>
2684 <th scope="row"><?php $thumb ? _e( 'Thumbnail linked to file' ) : _e( 'Image linked to file' ); ?></th>
2685 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo wp_get_attachment_url(); ?>"><?php echo $icon ?></a></textarea></td>
2686 </tr>
2687 <tr>
2688 <th scope="row"><?php $thumb ? _e( 'Thumbnail linked to page' ) : _e( 'Image linked to page' ); ?></th>
2689 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link( $post->ID ) ?>" rel="attachment wp-att-<?php echo $post->ID; ?>"><?php echo $icon ?></a></textarea></td>
2690 </tr>
2691<?php else : ?>
2692 <tr>
2693 <th scope="row"><?php _e( 'Link to file' ) ?></th>
2694 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo wp_get_attachment_url(); ?>" class="attachmentlink"><?php echo basename( wp_get_attachment_url() ); ?></a></textarea></td>
2695 </tr>
2696 <tr>
2697 <th scope="row"><?php _e( 'Link to page' ) ?></th>
2698 <td><textarea rows="1" cols="40" type="text" class="attachmentlinks" readonly="readonly"><a href="<?php echo get_attachment_link( $post->ID ) ?>" rel="attachment wp-att-<?php echo $post->ID ?>"><?php the_title(); ?></a></textarea></td>
2699 </tr>
2700<?php endif; ?>
2701</table>
2702</form>
2703<?php
2704}
2705
2706
2707/**
2708 * Print out <option> html elements for role selectors based on $wp_roles
2709 *
2710 * @package WordPress
2711 * @subpackage Administration
2712 * @since 2.1
2713 *
2714 * @uses $wp_roles
2715 * @param string $default slug for the role that should be already selected
2716 */
2717function wp_dropdown_roles( $selected = false ) {
2718 global $wp_roles;
2719 $p = '';
2720 $r = '';
2721
2722 $editable_roles = get_editable_roles();
2723
2724 foreach( $editable_roles as $role => $details ) {
2725 $name = translate_user_role($details['name'] );
2726 if ( $selected == $role ) // Make default first in list
2727 $p = "\n\t<option selected='selected' value='" . esc_attr($role) . "'>$name</option>";
2728 else
2729 $r .= "\n\t<option value='" . esc_attr($role) . "'>$name</option>";
2730 }
2731 echo $p . $r;
2732}
2733
2734/**
2735 * {@internal Missing Short Description}}
2736 *
2737 * @since unknown
2738 *
2739 * @param unknown_type $size
2740 * @return unknown
2741 */
2742function wp_convert_hr_to_bytes( $size ) {
2743 $size = strtolower($size);
2744 $bytes = (int) $size;
2745 if ( strpos($size, 'k') !== false )
2746 $bytes = intval($size) * 1024;
2747 elseif ( strpos($size, 'm') !== false )
2748 $bytes = intval($size) * 1024 * 1024;
2749 elseif ( strpos($size, 'g') !== false )
2750 $bytes = intval($size) * 1024 * 1024 * 1024;
2751 return $bytes;
2752}
2753
2754/**
2755 * {@internal Missing Short Description}}
2756 *
2757 * @since unknown
2758 *
2759 * @param unknown_type $bytes
2760 * @return unknown
2761 */
2762function wp_convert_bytes_to_hr( $bytes ) {
2763 $units = array( 0 => 'B', 1 => 'kB', 2 => 'MB', 3 => 'GB' );
2764 $log = log( $bytes, 1024 );
2765 $power = (int) $log;
2766 $size = pow(1024, $log - $power);
2767 return $size . $units[$power];
2768}
2769
2770/**
2771 * {@internal Missing Short Description}}
2772 *
2773 * @since unknown
2774 *
2775 * @return unknown
2776 */
2777function wp_max_upload_size() {
2778 $u_bytes = wp_convert_hr_to_bytes( ini_get( 'upload_max_filesize' ) );
2779 $p_bytes = wp_convert_hr_to_bytes( ini_get( 'post_max_size' ) );
2780 $bytes = apply_filters( 'upload_size_limit', min($u_bytes, $p_bytes), $u_bytes, $p_bytes );
2781 return $bytes;
2782}
2783
2784/**
2785 * {@internal Missing Short Description}}
2786 *
2787 * @since unknown
2788 *
2789 * @param unknown_type $action
2790 */
2791function wp_import_upload_form( $action ) {
2792 $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() );
2793 $size = wp_convert_bytes_to_hr( $bytes );
2794 $upload_dir = wp_upload_dir();
2795 if ( ! empty( $upload_dir['error'] ) ) :
2796 ?><div class="error"><p><?php _e('Before you can upload your import file, you will need to fix the following error:'); ?></p>
2797 <p><strong><?php echo $upload_dir['error']; ?></strong></p></div><?php
2798 else :
2799?>
2800<form enctype="multipart/form-data" id="import-upload-form" method="post" action="<?php echo esc_attr($action) ?>">
2801<p>
2802<?php wp_nonce_field('import-upload'); ?>
2803<label for="upload"><?php _e( 'Choose a file from your computer:' ); ?></label> (<?php printf( __('Maximum size: %s' ), $size ); ?>)
2804<input type="file" id="upload" name="import" size="25" />
2805<input type="hidden" name="action" value="save" />
2806<input type="hidden" name="max_file_size" value="<?php echo $bytes; ?>" />
2807</p>
2808<p class="submit">
2809<input type="submit" class="button" value="<?php esc_attr_e( 'Upload file and import' ); ?>" />
2810</p>
2811</form>
2812<?php
2813 endif;
2814}
2815
2816/**
2817 * {@internal Missing Short Description}}
2818 *
2819 * @since unknown
2820 */
2821function wp_remember_old_slug() {
2822 global $post;
2823 $name = esc_attr($post->post_name); // just in case
2824 if ( strlen($name) )
2825 echo '<input type="hidden" id="wp-old-slug" name="wp-old-slug" value="' . $name . '" />';
2826}
2827
2828/**
2829 * Add a meta box to an edit form.
2830 *
2831 * @since 2.5.0
2832 *
2833 * @param string $id String for use in the 'id' attribute of tags.
2834 * @param string $title Title of the meta box.
2835 * @param string $callback Function that fills the box with the desired content. The function should echo its output.
2836 * @param string $page The type of edit page on which to show the box (post, page, link).
2837 * @param string $context The context within the page where the boxes should show ('normal', 'advanced').
2838 * @param string $priority The priority within the context where the boxes should show ('high', 'low').
2839 */
2840function add_meta_box($id, $title, $callback, $page, $context = 'advanced', $priority = 'default', $callback_args=null) {
2841 global $wp_meta_boxes;
2842
2843 if ( !isset($wp_meta_boxes) )
2844 $wp_meta_boxes = array();
2845 if ( !isset($wp_meta_boxes[$page]) )
2846 $wp_meta_boxes[$page] = array();
2847 if ( !isset($wp_meta_boxes[$page][$context]) )
2848 $wp_meta_boxes[$page][$context] = array();
2849
2850 foreach ( array_keys($wp_meta_boxes[$page]) as $a_context ) {
2851 foreach ( array('high', 'core', 'default', 'low') as $a_priority ) {
2852 if ( !isset($wp_meta_boxes[$page][$a_context][$a_priority][$id]) )
2853 continue;
2854
2855 // If a core box was previously added or removed by a plugin, don't add.
2856 if ( 'core' == $priority ) {
2857 // If core box previously deleted, don't add
2858 if ( false === $wp_meta_boxes[$page][$a_context][$a_priority][$id] )
2859 return;
2860 // If box was added with default priority, give it core priority to maintain sort order
2861 if ( 'default' == $a_priority ) {
2862 $wp_meta_boxes[$page][$a_context]['core'][$id] = $wp_meta_boxes[$page][$a_context]['default'][$id];
2863 unset($wp_meta_boxes[$page][$a_context]['default'][$id]);
2864 }
2865 return;
2866 }
2867 // If no priority given and id already present, use existing priority
2868 if ( empty($priority) ) {
2869 $priority = $a_priority;
2870 // else if we're adding to the sorted priortiy, we don't know the title or callback. Glab them from the previously added context/priority.
2871 } elseif ( 'sorted' == $priority ) {
2872 $title = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['title'];
2873 $callback = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['callback'];
2874 $callback_args = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['args'];
2875 }
2876 // An id can be in only one priority and one context
2877 if ( $priority != $a_priority || $context != $a_context )
2878 unset($wp_meta_boxes[$page][$a_context][$a_priority][$id]);
2879 }
2880 }
2881
2882 if ( empty($priority) )
2883 $priority = 'low';
2884
2885 if ( !isset($wp_meta_boxes[$page][$context][$priority]) )
2886 $wp_meta_boxes[$page][$context][$priority] = array();
2887
2888 $wp_meta_boxes[$page][$context][$priority][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $callback_args);
2889}
2890
2891/**
2892 * {@internal Missing Short Description}}
2893 *
2894 * @since unknown
2895 *
2896 * @param unknown_type $page
2897 * @param unknown_type $context
2898 * @param unknown_type $object
2899 * @return int number of meta_boxes
2900 */
2901function do_meta_boxes($page, $context, $object) {
2902 global $wp_meta_boxes;
2903 static $already_sorted = false;
2904
2905 //do_action('do_meta_boxes', $page, $context, $object);
2906
2907 $hidden = get_hidden_meta_boxes($page);
2908
2909 echo "<div id='$context-sortables' class='meta-box-sortables'>\n";
2910
2911 $i = 0;
2912 do {
2913 // Grab the ones the user has manually sorted. Pull them out of their previous context/priority and into the one the user chose
2914 if ( !$already_sorted && $sorted = get_user_option( "meta-box-order_$page", 0, false ) ) {
2915 foreach ( $sorted as $box_context => $ids )
2916 foreach ( explode(',', $ids) as $id )
2917 if ( $id )
2918 add_meta_box( $id, null, null, $page, $box_context, 'sorted' );
2919 }
2920 $already_sorted = true;
2921
2922 if ( !isset($wp_meta_boxes) || !isset($wp_meta_boxes[$page]) || !isset($wp_meta_boxes[$page][$context]) )
2923 break;
2924
2925 foreach ( array('high', 'sorted', 'core', 'default', 'low') as $priority ) {
2926 if ( isset($wp_meta_boxes[$page][$context][$priority]) ) {
2927 foreach ( (array) $wp_meta_boxes[$page][$context][$priority] as $box ) {
2928 if ( false == $box || ! $box['title'] )
2929 continue;
2930 $i++;
2931 $style = '';
2932 if ( in_array($box['id'], $hidden) )
2933 $style = 'style="display:none;"';
2934 echo '<div id="' . $box['id'] . '" class="postbox ' . postbox_classes($box['id'], $page) . '" ' . $style . '>' . "\n";
2935 echo '<div class="handlediv" title="' . __('Click to toggle') . '"><br /></div>';
2936 echo "<h3 class='hndle'><span>{$box['title']}</span></h3>\n";
2937 echo '<div class="inside">' . "\n";
2938 call_user_func($box['callback'], $object, $box);
2939 echo "</div>\n";
2940 echo "</div>\n";
2941 }
2942 }
2943 }
2944 } while(0);
2945
2946 echo "</div>";
2947
2948 return $i;
2949
2950}
2951
2952/**
2953 * Remove a meta box from an edit form.
2954 *
2955 * @since 2.6.0
2956 *
2957 * @param string $id String for use in the 'id' attribute of tags.
2958 * @param string $page The type of edit page on which to show the box (post, page, link).
2959 * @param string $context The context within the page where the boxes should show ('normal', 'advanced').
2960 */
2961function remove_meta_box($id, $page, $context) {
2962 global $wp_meta_boxes;
2963
2964 if ( !isset($wp_meta_boxes) )
2965 $wp_meta_boxes = array();
2966 if ( !isset($wp_meta_boxes[$page]) )
2967 $wp_meta_boxes[$page] = array();
2968 if ( !isset($wp_meta_boxes[$page][$context]) )
2969 $wp_meta_boxes[$page][$context] = array();
2970
2971 foreach ( array('high', 'core', 'default', 'low') as $priority )
2972 $wp_meta_boxes[$page][$context][$priority][$id] = false;
2973}
2974
2975/**
2976 * {@internal Missing Short Description}}
2977 *
2978 * @since unknown
2979 *
2980 * @param unknown_type $page
2981 */
2982function meta_box_prefs($page) {
2983 global $wp_meta_boxes;
2984
2985 if ( empty($wp_meta_boxes[$page]) )
2986 return;
2987
2988 $hidden = get_hidden_meta_boxes($page);
2989
2990 foreach ( array_keys($wp_meta_boxes[$page]) as $context ) {
2991 foreach ( array_keys($wp_meta_boxes[$page][$context]) as $priority ) {
2992 foreach ( $wp_meta_boxes[$page][$context][$priority] as $box ) {
2993 if ( false == $box || ! $box['title'] )
2994 continue;
2995 // Submit box cannot be hidden
2996 if ( 'submitdiv' == $box['id'] || 'linksubmitdiv' == $box['id'] )
2997 continue;
2998 $box_id = $box['id'];
2999 echo '<label for="' . $box_id . '-hide">';
3000 echo '<input class="hide-postbox-tog" name="' . $box_id . '-hide" type="checkbox" id="' . $box_id . '-hide" value="' . $box_id . '"' . (! in_array($box_id, $hidden) ? ' checked="checked"' : '') . ' />';
3001 echo "{$box['title']}</label>\n";
3002 }
3003 }
3004 }
3005}
3006
3007function get_hidden_meta_boxes($page) {
3008 $hidden = (array) get_user_option( "meta-box-hidden_$page", 0, false );
3009
3010 // Hide slug boxes by default
3011 if ( empty($hidden[0]) ) {
3012 if ( 'page' == $page )
3013 $hidden = array('pageslugdiv');
3014 elseif ( 'post' == $page )
3015 $hidden = array('slugdiv');
3016 }
3017
3018 return $hidden;
3019}
3020
3021/**
3022 * Add a new section to a settings page.
3023 *
3024 * @since 2.7.0
3025 *
3026 * @param string $id String for use in the 'id' attribute of tags.
3027 * @param string $title Title of the section.
3028 * @param string $callback Function that fills the section with the desired content. The function should echo its output.
3029 * @param string $page The type of settings page on which to show the section (general, reading, writing, ...).
3030 */
3031function add_settings_section($id, $title, $callback, $page) {
3032 global $wp_settings_sections;
3033
3034 if ( !isset($wp_settings_sections) )
3035 $wp_settings_sections = array();
3036 if ( !isset($wp_settings_sections[$page]) )
3037 $wp_settings_sections[$page] = array();
3038 if ( !isset($wp_settings_sections[$page][$id]) )
3039 $wp_settings_sections[$page][$id] = array();
3040
3041 $wp_settings_sections[$page][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback);
3042}
3043
3044/**
3045 * Add a new field to a settings page.
3046 *
3047 * @since 2.7.0
3048 *
3049 * @param string $id String for use in the 'id' attribute of tags.
3050 * @param string $title Title of the field.
3051 * @param string $callback Function that fills the field with the desired content. The function should echo its output.
3052 * @param string $page The type of settings page on which to show the field (general, reading, writing, ...).
3053 * @param string $section The section of the settingss page in which to show the box (default, ...).
3054 * @param array $args Additional arguments
3055 */
3056function add_settings_field($id, $title, $callback, $page, $section = 'default', $args = array()) {
3057 global $wp_settings_fields;
3058
3059 if ( !isset($wp_settings_fields) )
3060 $wp_settings_fields = array();
3061 if ( !isset($wp_settings_fields[$page]) )
3062 $wp_settings_fields[$page] = array();
3063 if ( !isset($wp_settings_fields[$page][$section]) )
3064 $wp_settings_fields[$page][$section] = array();
3065
3066 $wp_settings_fields[$page][$section][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $args);
3067}
3068
3069/**
3070 * {@internal Missing Short Description}}
3071 *
3072 * @since unknown
3073 *
3074 * @param unknown_type $page
3075 */
3076function do_settings_sections($page) {
3077 global $wp_settings_sections, $wp_settings_fields;
3078
3079 if ( !isset($wp_settings_sections) || !isset($wp_settings_sections[$page]) )
3080 return;
3081
3082 foreach ( (array) $wp_settings_sections[$page] as $section ) {
3083 echo "<h3>{$section['title']}</h3>\n";
3084 call_user_func($section['callback'], $section);
3085 if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section['id']]) )
3086 continue;
3087 echo '<table class="form-table">';
3088 do_settings_fields($page, $section['id']);
3089 echo '</table>';
3090 }
3091}
3092
3093/**
3094 * {@internal Missing Short Description}}
3095 *
3096 * @since unknown
3097 *
3098 * @param unknown_type $page
3099 * @param unknown_type $section
3100 */
3101function do_settings_fields($page, $section) {
3102 global $wp_settings_fields;
3103
3104 if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section]) )
3105 return;
3106
3107 foreach ( (array) $wp_settings_fields[$page][$section] as $field ) {
3108 echo '<tr valign="top">';
3109 if ( !empty($field['args']['label_for']) )
3110 echo '<th scope="row"><label for="' . $field['args']['label_for'] . '">' . $field['title'] . '</label></th>';
3111 else
3112 echo '<th scope="row">' . $field['title'] . '</th>';
3113 echo '<td>';
3114 call_user_func($field['callback']);
3115 echo '</td>';
3116 echo '</tr>';
3117 }
3118}
3119
3120/**
3121 * {@internal Missing Short Description}}
3122 *
3123 * @since unknown
3124 *
3125 * @param unknown_type $page
3126 */
3127function manage_columns_prefs($page) {
3128 $columns = get_column_headers($page);
3129
3130 $hidden = get_hidden_columns($page);
3131
3132 foreach ( $columns as $column => $title ) {
3133 // Can't hide these
3134 if ( 'cb' == $column || 'title' == $column || 'name' == $column || 'username' == $column || 'media' == $column || 'comment' == $column )
3135 continue;
3136 if ( empty($title) )
3137 continue;
3138
3139 if ( 'comments' == $column )
3140 $title = __('Comments');
3141 $id = "$column-hide";
3142 echo '<label for="' . $id . '">';
3143 echo '<input class="hide-column-tog" name="' . $id . '" type="checkbox" id="' . $id . '" value="' . $column . '"' . (! in_array($column, $hidden) ? ' checked="checked"' : '') . ' />';
3144 echo "$title</label>\n";
3145 }
3146}
3147
3148/**
3149 * {@internal Missing Short Description}}
3150 *
3151 * @since unknown
3152 *
3153 * @param unknown_type $found_action
3154 */
3155function find_posts_div($found_action = '') {
3156?>
3157 <div id="find-posts" class="find-box" style="display:none;">
3158 <div id="find-posts-head" class="find-box-head"><?php _e('Find Posts or Pages'); ?></div>
3159 <div class="find-box-inside">
3160 <div class="find-box-search">
3161 <?php if ( $found_action ) { ?>
3162 <input type="hidden" name="found_action" value="<?php echo esc_attr($found_action); ?>" />
3163 <?php } ?>
3164
3165 <input type="hidden" name="affected" id="affected" value="" />
3166 <?php wp_nonce_field( 'find-posts', '_ajax_nonce', false ); ?>
3167 <label class="screen-reader-text" for="find-posts-input"><?php _e( 'Search' ); ?></label>
3168 <input type="text" id="find-posts-input" name="ps" value="" />
3169 <input type="button" onclick="findPosts.send();" value="<?php esc_attr_e( 'Search' ); ?>" class="button" /><br />
3170
3171 <input type="radio" name="find-posts-what" id="find-posts-posts" checked="checked" value="posts" />
3172 <label for="find-posts-posts"><?php _e( 'Posts' ); ?></label>
3173 <input type="radio" name="find-posts-what" id="find-posts-pages" value="pages" />
3174 <label for="find-posts-pages"><?php _e( 'Pages' ); ?></label>
3175 </div>
3176 <div id="find-posts-response"></div>
3177 </div>
3178 <div class="find-box-buttons">
3179 <input type="button" class="button alignleft" onclick="findPosts.close();" value="<?php esc_attr_e('Close'); ?>" />
3180 <input id="find-posts-submit" type="submit" class="button-primary alignright" value="<?php esc_attr_e('Select'); ?>" />
3181 </div>
3182 </div>
3183<?php
3184}
3185
3186/**
3187 * Display the post password.
3188 *
3189 * The password is passed through {@link esc_attr()} to ensure that it
3190 * is safe for placing in an html attribute.
3191 *
3192 * @uses attr
3193 * @since 2.7.0
3194 */
3195function the_post_password() {
3196 global $post;
3197 if ( isset( $post->post_password ) ) echo esc_attr( $post->post_password );
3198}
3199
3200/**
3201 * {@internal Missing Short Description}}
3202 *
3203 * @since unknown
3204 */
3205function favorite_actions( $screen = null ) {
3206 switch ( $screen ) {
3207 case 'post-new.php':
3208 $default_action = array('edit.php' => array(__('Edit Posts'), 'edit_posts'));
3209 break;
3210 case 'edit-pages.php':
3211 $default_action = array('page-new.php' => array(__('New Page'), 'edit_pages'));
3212 break;
3213 case 'page-new.php':
3214 $default_action = array('edit-pages.php' => array(__('Edit Pages'), 'edit_pages'));
3215 break;
3216 case 'upload.php':
3217 $default_action = array('media-new.php' => array(__('New Media'), 'upload_files'));
3218 break;
3219 case 'media-new.php':
3220 $default_action = array('upload.php' => array(__('Edit Media'), 'upload_files'));
3221 break;
3222 case 'link-manager.php':
3223 $default_action = array('link-add.php' => array(__('New Link'), 'manage_links'));
3224 break;
3225 case 'link-add.php':
3226 $default_action = array('link-manager.php' => array(__('Edit Links'), 'manage_links'));
3227 break;
3228 case 'users.php':
3229 $default_action = array('user-new.php' => array(__('New User'), 'create_users'));
3230 break;
3231 case 'user-new.php':
3232 $default_action = array('users.php' => array(__('Edit Users'), 'edit_users'));
3233 break;
3234 case 'plugins.php':
3235 $default_action = array('plugin-install.php' => array(__('Install Plugins'), 'install_plugins'));
3236 break;
3237 case 'plugin-install.php':
3238 $default_action = array('plugins.php' => array(__('Manage Plugins'), 'activate_plugins'));
3239 break;
3240 case 'themes.php':
3241 $default_action = array('theme-install.php' => array(__('Install Themes'), 'install_themes'));
3242 break;
3243 case 'theme-install.php':
3244 $default_action = array('themes.php' => array(__('Manage Themes'), 'switch_themes'));
3245 break;
3246 default:
3247 $default_action = array('post-new.php' => array(__('New Post'), 'edit_posts'));
3248 break;
3249 }
3250
3251 $actions = array(
3252 'post-new.php' => array(__('New Post'), 'edit_posts'),
3253 'edit.php?post_status=draft' => array(__('Drafts'), 'edit_posts'),
3254 'page-new.php' => array(__('New Page'), 'edit_pages'),
3255 'media-new.php' => array(__('Upload'), 'upload_files'),
3256 'edit-comments.php' => array(__('Comments'), 'moderate_comments')
3257 );
3258
3259 $default_key = array_keys($default_action);
3260 $default_key = $default_key[0];
3261 if ( isset($actions[$default_key]) )
3262 unset($actions[$default_key]);
3263 $actions = array_merge($default_action, $actions);
3264 $actions = apply_filters('favorite_actions', $actions);
3265
3266 $allowed_actions = array();
3267 foreach ( $actions as $action => $data ) {
3268 if ( current_user_can($data[1]) )
3269 $allowed_actions[$action] = $data[0];
3270 }
3271
3272 if ( empty($allowed_actions) )
3273 return;
3274
3275 $first = array_keys($allowed_actions);
3276 $first = $first[0];
3277 echo '<div id="favorite-actions">';
3278 echo '<div id="favorite-first"><a href="' . $first . '">' . $allowed_actions[$first] . '</a></div><div id="favorite-toggle"><br /></div>';
3279 echo '<div id="favorite-inside">';
3280
3281 array_shift($allowed_actions);
3282
3283 foreach ( $allowed_actions as $action => $label) {
3284 echo "<div class='favorite-action'><a href='$action'>";
3285 echo $label;
3286 echo "</a></div>\n";
3287 }
3288 echo "</div></div>\n";
3289}
3290
3291/**
3292 * Get the post title.
3293 *
3294 * The post title is fetched and if it is blank then a default string is
3295 * returned.
3296 *
3297 * @since 2.7.0
3298 * @param int $id The post id. If not supplied the global $post is used.
3299 *
3300 */
3301function _draft_or_post_title($post_id = 0)
3302{
3303 $title = get_the_title($post_id);
3304 if ( empty($title) )
3305 $title = __('(no title)');
3306 return $title;
3307}
3308
3309/**
3310 * Display the search query.
3311 *
3312 * A simple wrapper to display the "s" parameter in a GET URI. This function
3313 * should only be used when {@link the_search_query()} cannot.
3314 *
3315 * @uses attr
3316 * @since 2.7.0
3317 *
3318 */
3319function _admin_search_query() {
3320 echo isset($_GET['s']) ? esc_attr( stripslashes( $_GET['s'] ) ) : '';
3321}
3322
3323/**
3324 * Generic Iframe header for use with Thickbox
3325 *
3326 * @since 2.7.0
3327 * @param string $title Title of the Iframe page.
3328 * @param bool $limit_styles Limit styles to colour-related styles only (unless others are enqueued).
3329 *
3330 */
3331function iframe_header( $title = '', $limit_styles = false ) {
3332?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3333<html xmlns="http://www.w3.org/1999/xhtml" <?php do_action('admin_xml_ns'); ?> <?php language_attributes(); ?>>
3334<head>
3335<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php echo get_option('blog_charset'); ?>" />
3336<title><?php bloginfo('name') ?> &rsaquo; <?php echo $title ?> &#8212; <?php _e('WordPress'); ?></title>
3337<?php
3338wp_enqueue_style( 'global' );
3339if ( ! $limit_styles )
3340 wp_enqueue_style( 'wp-admin' );
3341wp_enqueue_style( 'colors' );
3342?>
3343<script type="text/javascript">
3344//<![CDATA[
3345addLoadEvent = function(func){if(typeof jQuery!="undefined")jQuery(document).ready(func);else if(typeof wpOnload!='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
3346function tb_close(){var win=window.dialogArguments||opener||parent||top;win.tb_remove();}
3347//]]>
3348</script>
3349<?php
3350do_action('admin_print_styles');
3351do_action('admin_print_scripts');
3352do_action('admin_head');
3353?>
3354</head>
3355<body<?php if ( isset($GLOBALS['body_id']) ) echo ' id="' . $GLOBALS['body_id'] . '"'; ?>>
3356<?php
3357}
3358
3359/**
3360 * Generic Iframe footer for use with Thickbox
3361 *
3362 * @since 2.7.0
3363 *
3364 */
3365function iframe_footer() {
3366 //We're going to hide any footer output on iframe pages, but run the hooks anyway since they output Javascript or other needed content. ?>
3367 <div class="hidden">
3368<?php
3369 do_action('admin_footer', '');
3370 do_action('admin_print_footer_scripts'); ?>
3371 </div>
3372<script type="text/javascript">if(typeof wpOnload=="function")wpOnload();</script>
3373</body>
3374</html>
3375<?php
3376}
3377
3378function _post_states($post) {
3379 $post_states = array();
3380 if ( isset($_GET['post_status']) )
3381 $post_status = $_GET['post_status'];
3382 else
3383 $post_status = '';
3384
3385 if ( !empty($post->post_password) )
3386 $post_states[] = __('Password protected');
3387 if ( 'private' == $post->post_status && 'private' != $post_status )
3388 $post_states[] = __('Private');
3389 if ( 'draft' == $post->post_status && 'draft' != $post_status )
3390 $post_states[] = __('Draft');
3391 if ( 'pending' == $post->post_status && 'pending' != $post_status )
3392 /* translators: post state */
3393 $post_states[] = _x('Pending', 'post state');
3394 if ( is_sticky($post->ID) )
3395 $post_states[] = __('Sticky');
3396
3397 $post_states = apply_filters( 'display_post_states', $post_states );
3398
3399 if ( ! empty($post_states) ) {
3400 $state_count = count($post_states);
3401 $i = 0;
3402 echo ' - ';
3403 foreach ( $post_states as $state ) {
3404 ++$i;
3405 ( $i == $state_count ) ? $sep = '' : $sep = ', ';
3406 echo "<span class='post-state'>$state$sep</span>";
3407 }
3408 }
3409}
3410
3411function screen_meta($screen) {
3412 global $wp_meta_boxes, $_wp_contextual_help;
3413
3414 $screen = str_replace('.php', '', $screen);
3415 $screen = str_replace('-new', '', $screen);
3416 $screen = str_replace('-add', '', $screen);
3417 $screen = apply_filters('screen_meta_screen', $screen);
3418
3419 $column_screens = get_column_headers($screen);
3420 $meta_screens = array('index' => 'dashboard');
3421
3422 if ( isset($meta_screens[$screen]) )
3423 $screen = $meta_screens[$screen];
3424 $show_screen = false;
3425 $show_on_screen = false;
3426 if ( !empty($wp_meta_boxes[$screen]) || !empty($column_screens) ) {
3427 $show_screen = true;
3428 $show_on_screen = true;
3429 }
3430
3431 $screen_options = screen_options($screen);
3432 if ( $screen_options )
3433 $show_screen = true;
3434
3435 if ( !isset($_wp_contextual_help) )
3436 $_wp_contextual_help = array();
3437
3438 $settings = '';
3439
3440 switch ( $screen ) {
3441 case 'post':
3442 if ( !isset($_wp_contextual_help['post']) ) {
3443 $help = drag_drop_help();
3444 $help .= '<p>' . __('<a href="http://codex.wordpress.org/Writing_Posts" target="_blank">Writing Posts</a>') . '</p>';
3445 $_wp_contextual_help['post'] = $help;
3446 }
3447 break;
3448 case 'page':
3449 if ( !isset($_wp_contextual_help['page']) ) {
3450 $help = drag_drop_help();
3451 $_wp_contextual_help['page'] = $help;
3452 }
3453 break;
3454 case 'dashboard':
3455 if ( !isset($_wp_contextual_help['dashboard']) ) {
3456 $help = '<p>' . __('The modules on this screen can be arranged in several columns. You can select the number of columns from the Screen Options tab.') . "</p>\n";
3457 $help .= drag_drop_help();
3458 $_wp_contextual_help['dashboard'] = $help;
3459 }
3460 break;
3461 case 'link':
3462 if ( !isset($_wp_contextual_help['link']) ) {
3463 $help = drag_drop_help();
3464 $_wp_contextual_help['link'] = $help;
3465 }
3466 break;
3467 case 'options-general':
3468 if ( !isset($_wp_contextual_help['options-general']) )
3469 $_wp_contextual_help['options-general'] = __('<a href="http://codex.wordpress.org/Settings_General_SubPanel" target="_blank">General Settings</a>');
3470 break;
3471 case 'theme-install':
3472 case 'plugin-install':
3473 if ( ( !isset($_GET['tab']) || 'dashboard' == $_GET['tab'] ) && !isset($_wp_contextual_help[$screen]) ) {
3474 $help = plugins_search_help();
3475 $_wp_contextual_help[$screen] = $help;
3476 }
3477 break;
3478 case 'widgets':
3479 if ( !isset($_wp_contextual_help['widgets']) ) {
3480 $help = widgets_help();
3481 $_wp_contextual_help['widgets'] = $help;
3482 }
3483 $settings = '<p><a id="access-on" href="widgets.php?widgets-access=on">' . __('Enable accessibility mode') . '</a><a id="access-off" href="widgets.php?widgets-access=off">' . __('Disable accessibility mode') . "</a></p>\n";
3484 $show_screen = true;
3485 break;
3486 }
3487?>
3488<div id="screen-meta">
3489<?php
3490 if ( $show_screen ) :
3491?>
3492<div id="screen-options-wrap" class="hidden">
3493 <form id="adv-settings" action="" method="post">
3494<?php if ( $show_on_screen ) : ?>
3495 <h5><?php _e('Show on screen') ?></h5>
3496 <div class="metabox-prefs">
3497<?php
3498 if ( !meta_box_prefs($screen) && isset($column_screens) ) {
3499 manage_columns_prefs($screen);
3500 }
3501?>
3502 <br class="clear" />
3503 </div>
3504<?php endif; ?>
3505<?php echo screen_layout($screen); ?>
3506<?php echo $screen_options; ?>
3507<?php echo $settings; ?>
3508<div><?php wp_nonce_field( 'screen-options-nonce', 'screenoptionnonce', false ); ?></div>
3509</form>
3510</div>
3511
3512<?php
3513 endif;
3514
3515 global $title;
3516
3517 $_wp_contextual_help = apply_filters('contextual_help_list', $_wp_contextual_help, $screen);
3518 ?>
3519 <div id="contextual-help-wrap" class="hidden">
3520 <?php
3521 $contextual_help = '';
3522 if ( isset($_wp_contextual_help[$screen]) ) {
3523 if ( !empty($title) )
3524 $contextual_help .= '<h5>' . sprintf(__('Get help with &#8220;%s&#8221;'), $title) . '</h5>';
3525 else
3526 $contextual_help .= '<h5>' . __('Get help with this page') . '</h5>';
3527 $contextual_help .= '<div class="metabox-prefs">' . $_wp_contextual_help[$screen] . "</div>\n";
3528
3529 $contextual_help .= '<h5>' . __('Other Help') . '</h5>';
3530 } else {
3531 $contextual_help .= '<h5>' . __('Help') . '</h5>';
3532 }
3533
3534 $contextual_help .= '<div class="metabox-prefs">';
3535 $default_help = __('<a href="http://codex.wordpress.org/" target="_blank">Documentation</a>');
3536 $default_help .= '<br />';
3537 $default_help .= __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>');
3538 $contextual_help .= apply_filters('default_contextual_help', $default_help);
3539 $contextual_help .= "</div>\n";
3540 echo apply_filters('contextual_help', $contextual_help, $screen);
3541 ?>
3542 </div>
3543
3544<div id="screen-meta-links">
3545<div id="contextual-help-link-wrap" class="hide-if-no-js screen-meta-toggle">
3546<a href="#contextual-help" id="contextual-help-link" class="show-settings"><?php _e('Help') ?></a>
3547</div>
3548<?php if ( $show_screen ) { ?>
3549<div id="screen-options-link-wrap" class="hide-if-no-js screen-meta-toggle">
3550<a href="#screen-options" id="show-settings-link" class="show-settings"><?php _e('Screen Options') ?></a>
3551</div>
3552<?php } ?>
3553</div>
3554</div>
3555<?php
3556}
3557
3558/**
3559 * Add contextual help text for a page
3560 *
3561 * @since 2.7.0
3562 *
3563 * @param string $screen The handle for the screen to add help to. This is usually the hook name returned by the add_*_page() functions.
3564 * @param string $help Arbitrary help text
3565 */
3566function add_contextual_help($screen, $help) {
3567 global $_wp_contextual_help;
3568
3569 if ( !isset($_wp_contextual_help) )
3570 $_wp_contextual_help = array();
3571
3572 $_wp_contextual_help[$screen] = $help;
3573}
3574
3575function drag_drop_help() {
3576 return '
3577 <p>' . __('Most of the modules on this screen can be moved. If you hover your mouse over the title bar of a module you&rsquo;ll notice the 4 arrow cursor appears to let you know it is movable. Click on it, hold down the mouse button and start dragging the module to a new location. As you drag the module, notice the dotted gray box that also moves. This box indicates where the module will be placed when you release the mouse button.') . '</p>
3578 <p>' . __('The same modules can be expanded and collapsed by clicking once on their title bar and also completely hidden from the Screen Options tab.') . '</p>
3579';
3580}
3581
3582function plugins_search_help() {
3583 return '
3584 <p><strong>' . __('Search help') . '</strong></p>' .
3585 '<p>' . __('You may search based on 3 criteria:') . '<br />' .
3586 __('<strong>Term:</strong> Searches theme names and descriptions for the specified term.') . '<br />' .
3587 __('<strong>Tag:</strong> Searches for themes tagged as such.') . '<br />' .
3588 __('<strong>Author:</strong> Searches for themes created by the Author, or which the Author contributed to.') . '</p>
3589';
3590}
3591
3592function widgets_help() {
3593 return '
3594 <p>' . __('Widgets are added and arranged by simple drag &#8217;n&#8217; drop. If you hover your mouse over the titlebar of a widget, you&#8217;ll see a 4-arrow cursor which indicates that the widget is movable. Click on the titlebar, hold down the mouse button and drag the widget to a sidebar. As you drag, you&#8217;ll see a dotted box that also moves. This box shows where the widget will go once you drop it.') . '</p>
3595 <p>' . __('To remove a widget from a sidebar, drag it back to Available Widgets or click on the arrow on its titlebar to reveal its settings, and then click Remove.') . '</p>
3596 <p>' . __('To remove a widget from a sidebar <em>and keep its configuration</em>, drag it to Inactive Widgets.') . '</p>
3597 <p>' . __('The Inactive Widgets area stores widgets that are configured but not curently used. If you change themes and the new theme has fewer sidebars than the old, all extra widgets will be stored to Inactive Widgets automatically.') . '</p>
3598';
3599}
3600
3601function screen_layout($screen) {
3602 global $screen_layout_columns;
3603
3604 $columns = array('dashboard' => 4, 'post' => 2, 'page' => 2, 'link' => 2);
3605 $columns = apply_filters('screen_layout_columns', $columns, $screen);
3606
3607 if ( !isset($columns[$screen]) ) {
3608 $screen_layout_columns = 0;
3609 return '';
3610 }
3611
3612 $screen_layout_columns = get_user_option("screen_layout_$screen");
3613 $num = $columns[$screen];
3614
3615 if ( ! $screen_layout_columns )
3616 $screen_layout_columns = 2;
3617
3618 $i = 1;
3619 $return = '<h5>' . __('Screen Layout') . "</h5>\n<div class='columns-prefs'>" . __('Number of Columns:') . "\n";
3620 while ( $i <= $num ) {
3621 $return .= "<label><input type='radio' name='screen_columns' value='$i'" . ( ($screen_layout_columns == $i) ? " checked='checked'" : "" ) . " /> $i</label>\n";
3622 ++$i;
3623 }
3624 $return .= "</div>\n";
3625 return $return;
3626}
3627
3628function screen_options($screen) {
3629 switch ( $screen ) {
3630 case 'edit':
3631 $per_page_label = __('Posts per page:');
3632 break;
3633 case 'edit-pages':
3634 $per_page_label = __('Pages per page:');
3635 break;
3636 case 'edit-comments':
3637 $per_page_label = __('Comments per page:');
3638 break;
3639 case 'upload':
3640 $per_page_label = __('Media items per page:');
3641 break;
3642 case 'categories':
3643 $per_page_label = __('Categories per page:');
3644 break;
3645 case 'edit-tags':
3646 $per_page_label = __('Tags per page:');
3647 break;
3648 case 'plugins':
3649 $per_page_label = __('Plugins per page:');
3650 break;
3651 default:
3652 return '';
3653 }
3654
3655 $option = str_replace('-', '_', "${screen}_per_page");
3656 $per_page = get_user_option($option);
3657 if ( empty($per_page) ) {
3658 if ( 'plugins' == $screen )
3659 $per_page = 999;
3660 else
3661 $per_page = 20;
3662 }
3663
3664 $return = '<h5>' . __('Options') . "</h5>\n";
3665 $return .= "<div class='screen-options'>\n";
3666 if ( !empty($per_page_label) )
3667 $return .= "<label for='$option'>$per_page_label</label> <input type='text' class='screen-per-page' name='wp_screen_options[value]' id='$option' maxlength='3' value='$per_page' />\n";
3668 $return .= "<input type='submit' class='button' value='" . esc_attr__('Apply') . "' />";
3669 $return .= "<input type='hidden' name='wp_screen_options[option]' value='" . esc_attr($option) . "' />";
3670 $return .= "</div>\n";
3671 return $return;
3672}
3673
3674function screen_icon($name = '') {
3675 global $parent_file, $hook_suffix;
3676
3677 if ( empty($name) ) {
3678 if ( isset($parent_file) && !empty($parent_file) )
3679 $name = substr($parent_file, 0, -4);
3680 else
3681 $name = str_replace(array('.php', '-new', '-add'), '', $hook_suffix);
3682 }
3683?>
3684 <div id="icon-<?php echo $name; ?>" class="icon32"><br /></div>
3685<?php
3686}
3687
3688/**
3689 * Test support for compressing JavaScript from PHP
3690 *
3691 * Outputs JavaScript that tests if compression from PHP works as expected
3692 * and sets an option with the result. Has no effect when the current user
3693 * is not an administrator. To run the test again the option 'can_compress_scripts'
3694 * has to be deleted.
3695 *
3696 * @since 2.8.0
3697 */
3698function compression_test() {
3699?>
3700 <script type="text/javascript">
3701 /* <![CDATA[ */
3702 var testCompression = {
3703 get : function(test) {
3704 var x;
3705 if ( window.XMLHttpRequest ) {
3706 x = new XMLHttpRequest();
3707 } else {
3708 try{x=new ActiveXObject('Msxml2.XMLHTTP');}catch(e){try{x=new ActiveXObject('Microsoft.XMLHTTP');}catch(e){};}
3709 }
3710
3711 if (x) {
3712 x.onreadystatechange = function() {
3713 var r, h;
3714 if ( x.readyState == 4 ) {
3715 r = x.responseText.substr(0, 18);
3716 h = x.getResponseHeader('Content-Encoding');
3717 testCompression.check(r, h, test);
3718 }
3719 }
3720
3721 x.open('GET', 'admin-ajax.php?action=wp-compression-test&test='+test+'&'+(new Date()).getTime(), true);
3722 x.send('');
3723 }
3724 },
3725
3726 check : function(r, h, test) {
3727 if ( ! r && ! test )
3728 this.get(1);
3729
3730 if ( 1 == test ) {
3731 if ( h && ( h.match(/deflate/i) || h.match(/gzip/i) ) )
3732 this.get('no');
3733 else
3734 this.get(2);
3735
3736 return;
3737 }
3738
3739 if ( 2 == test ) {
3740 if ( '"wpCompressionTest' == r )
3741 this.get('yes');
3742 else
3743 this.get('no');
3744 }
3745 }
3746 };
3747 testCompression.check();
3748 /* ]]> */
3749 </script>
3750<?php
3751}
3752
3753?>
Note: See TracBrowser for help on using the repository browser.