X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/449d082fcc4873c1f7d363a0d9f7409be7f6e77d..4f9d63e13cd8c6e275797c75b401b074b82937bc:/wp-admin/includes/template.php diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php index 2566a616..e3981f22 100644 --- a/wp-admin/includes/template.php +++ b/wp-admin/includes/template.php @@ -8,202 +8,23 @@ * @subpackage Administration */ -// Ugly recursive category stuff. -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $parent - * @param unknown_type $level - * @param unknown_type $categories - * @param unknown_type $page - * @param unknown_type $per_page - */ -function cat_rows( $parent = 0, $level = 0, $categories = 0, $page = 1, $per_page = 20 ) { - $count = 0; - _cat_rows($categories, $count, $parent, $level, $page, $per_page); -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $categories - * @param unknown_type $count - * @param unknown_type $parent - * @param unknown_type $level - * @param unknown_type $page - * @param unknown_type $per_page - * @return unknown - */ -function _cat_rows( $categories, &$count, $parent = 0, $level = 0, $page = 1, $per_page = 20 ) { - if ( empty($categories) ) { - $args = array('hide_empty' => 0); - if ( !empty($_GET['s']) ) - $args['search'] = $_GET['s']; - $categories = get_categories( $args ); - } - - if ( !$categories ) - return false; - - $children = _get_term_hierarchy('category'); - - $start = ($page - 1) * $per_page; - $end = $start + $per_page; - $i = -1; - ob_start(); - foreach ( $categories as $category ) { - if ( $count >= $end ) - break; - - $i++; - - if ( $category->parent != $parent ) - continue; - - // If the page starts in a subtree, print the parents. - if ( $count == $start && $category->parent > 0 ) { - $my_parents = array(); - while ( $my_parent) { - $my_parent = get_category($my_parent); - $my_parents[] = $my_parent; - if ( !$my_parent->parent ) - break; - $my_parent = $my_parent->parent; - } - $num_parents = count($my_parents); - while( $my_parent = array_pop($my_parents) ) { - echo "\t" . _cat_row( $my_parent, $level - $num_parents ); - $num_parents--; - } - } - - if ( $count >= $start ) - echo "\t" . _cat_row( $category, $level ); - - unset($categories[$i]); // Prune the working set - $count++; - - if ( isset($children[$category->term_id]) ) - _cat_rows( $categories, $count, $category->term_id, $level + 1, $page, $per_page ); - - } - - $output = ob_get_contents(); - ob_end_clean(); - - echo $output; -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $category - * @param unknown_type $level - * @param unknown_type $name_override - * @return unknown - */ -function _cat_row( $category, $level, $name_override = false ) { - static $row_class = ''; - - $category = get_category( $category, OBJECT, 'display' ); - - $default_cat_id = (int) get_option( 'default_category' ); - $pad = str_repeat( '— ', $level ); - $name = ( $name_override ? $name_override : $pad . ' ' . $category->name ); - $edit_link = "categories.php?action=edit&cat_ID=$category->term_id"; - if ( current_user_can( 'manage_categories' ) ) { - $edit = "name)) . "'>" . attribute_escape( $name ) . '
'; - $actions = array(); - $actions['edit'] = '' . __('Edit') . ''; - $actions['inline hide-if-no-js'] = '' . __('Quick Edit') . ''; - if ( $default_cat_id != $category->term_id ) - $actions['delete'] = "term_id) . "' onclick=\"if ( confirm('" . js_escape(sprintf(__("You are about to delete this category '%s'\n 'Cancel' to stop, 'OK' to delete."), $name )) . "') ) { return true;}return false;\">" . __('Delete') . ""; - $action_count = count($actions); - $i = 0; - $edit .= '
'; - foreach ( $actions as $action => $link ) { - ++$i; - ( $i == $action_count ) ? $sep = '' : $sep = ' | '; - $edit .= "$link$sep"; - } - $edit .= '
'; - } else { - $edit = $name; - } - - $row_class = 'alternate' == $row_class ? '' : 'alternate'; - $qe_data = get_category_to_edit($category->term_id); - - $category->count = number_format_i18n( $category->count ); - $posts_count = ( $category->count > 0 ) ? "$category->count" : $category->count; - $output = ""; - - $columns = get_column_headers('categories'); - $hidden = get_hidden_columns('categories'); - foreach ( $columns as $column_name => $column_display_name ) { - $class = "class=\"$column_name column-$column_name\""; - - $style = ''; - if ( in_array($column_name, $hidden) ) - $style = ' style="display:none;"'; - - $attributes = "$class$style"; - - switch ($column_name) { - case 'cb': - $output .= ""; - if ( $default_cat_id != $category->term_id ) { - $output .= ""; - } else { - $output .= " "; - } - $output .= ''; - break; - case 'name': - $output .= "$edit"; - $output .= ''; - break; - case 'description': - $output .= "$category->description"; - break; - case 'slug': - $output .= "$category->slug"; - break; - case 'posts': - $attributes = 'class="posts column-posts num"' . $style; - $output .= "$posts_count\n"; - } - } - $output .= ''; - - return $output; -} - /** * {@internal Missing Short Description}} * * @since 2.7 * - * Outputs the HTML for the hidden table rows used in Categories, Link Caregories and Tags quick edit. + * Outputs the HTML for the hidden table rows used in Categories, Link Categories and Tags quick edit. * - * @param string $type "tag", "category" or "link-category" + * @param string $type "edit-tags", "categoried" or "edit-link-categories" + * @param string $taxonomy The taxonomy of the row. * @return */ -function inline_edit_term_row($type) { +function inline_edit_term_row($type, $taxonomy) { - if ( ! current_user_can( 'manage_categories' ) ) + $tax = get_taxonomy($taxonomy); + if ( ! current_user_can( $tax->cap->edit_terms ) ) return; - $is_tag = $type == 'edit-tags'; $columns = get_column_headers($type); $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns($type) ) ); $col_count = count($columns) - count($hidden); @@ -219,20 +40,12 @@ function inline_edit_term_row($type) { - + - - - - - - + @@ -243,18 +56,19 @@ function inline_edit_term_row($type) { foreach ( $columns as $column_name => $column_display_name ) { if ( isset( $core_columns[$column_name] ) ) continue; - do_action( 'quick_edit_custom_box', $column_name, $type ); + do_action( 'quick_edit_custom_box', $column_name, $type, $taxonomy ); } ?>

- - - + labels->update_item; ?> + + +

@@ -283,12 +97,13 @@ function link_cat_row( $category, $name_override = false ) { $name = ( $name_override ? $name_override : $category->name ); $edit_link = "link-category.php?action=edit&cat_ID=$category->term_id"; if ( current_user_can( 'manage_categories' ) ) { - $edit = "name)) . "'>$name
"; + $edit = "name)) . "'>$name
"; $actions = array(); $actions['edit'] = '' . __('Edit') . ''; $actions['inline hide-if-no-js'] = '' . __('Quick Edit') . ''; if ( $default_cat_id != $category->term_id ) - $actions['delete'] = "term_id) . "' onclick=\"if ( confirm('" . js_escape(sprintf(__("You are about to delete this category '%s'\n 'Cancel' to stop, 'OK' to delete."), $name )) . "') ) { return true;}return false;\">" . __('Delete') . ""; + $actions['delete'] = "term_id) . "'>" . __('Delete') . ""; + $actions = apply_filters('link_cat_row_actions', $actions, $category); $action_count = count($actions); $i = 0; $edit .= '
'; @@ -333,18 +148,23 @@ function link_cat_row( $category, $name_override = false ) { $output .= "$edit"; $output .= ''; break; case 'description': $output .= "$category->description"; break; case 'slug': - $output .= "$category->slug"; + $output .= "" . apply_filters('editable_slug', $category->slug) . ""; break; case 'links': $attributes = 'class="links column-links num"' . $style; $output .= "$count"; + break; + default: + $output .= ""; + $output .= apply_filters('manage_link_categories_custom_column', '', $column_name, $category->term_id); + $output .= ""; } } $output .= ''; @@ -352,52 +172,10 @@ function link_cat_row( $category, $name_override = false ) { return $output; } -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $checked - * @param unknown_type $current - */ -function checked( $checked, $current) { - if ( $checked == $current) - echo ' checked="checked"'; -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $selected - * @param unknown_type $current - */ -function selected( $selected, $current) { - if ( $selected == $current) - echo ' selected="selected"'; -} - // // Category Checklists // -/** - * {@internal Missing Short Description}} - * - * @since unknown - * @deprecated Use {@link wp_link_category_checklist()} - * @see wp_link_category_checklist() - * - * @param unknown_type $default - * @param unknown_type $parent - * @param unknown_type $popular_ids - */ -function dropdown_categories( $default = 0, $parent = 0, $popular_ids = array() ) { - global $post_ID; - wp_category_checklist($post_ID); -} - /** * {@internal Missing Short Description}} * @@ -419,9 +197,16 @@ class Walker_Category_Checklist extends Walker { function start_el(&$output, $category, $depth, $args) { extract($args); + if ( empty($taxonomy) ) + $taxonomy = 'category'; + + if ( $taxonomy == 'category' ) + $name = 'post_category'; + else + $name = 'tax_input['.$taxonomy.']'; $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : ''; - $output .= "\n
  • " . ''; + $output .= "\n
  • " . ''; } function end_el(&$output, $category, $depth, $args) { @@ -439,45 +224,80 @@ class Walker_Category_Checklist extends Walker { * @param unknown_type $selected_cats * @param unknown_type $popular_cats */ -function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null ) { +function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true ) { + wp_terms_checklist($post_id, + array( + 'taxonomy' => 'category', + 'descendants_and_self' => $descendants_and_self, + 'selected_cats' => $selected_cats, + 'popular_cats' => $popular_cats, + 'walker' => $walker, + 'checked_ontop' => $checked_ontop + )); +} + +/** + * Taxonomy independent version of wp_category_checklist + * + * @param int $post_id + * @param array $args + */ +function wp_terms_checklist($post_id = 0, $args = array()) { + $defaults = array( + 'descendants_and_self' => 0, + 'selected_cats' => false, + 'popular_cats' => false, + 'walker' => null, + 'taxonomy' => 'category', + 'checked_ontop' => true + ); + extract( wp_parse_args($args, $defaults), EXTR_SKIP ); + if ( empty($walker) || !is_a($walker, 'Walker') ) $walker = new Walker_Category_Checklist; $descendants_and_self = (int) $descendants_and_self; - $args = array(); + $args = array('taxonomy' => $taxonomy); + + $tax = get_taxonomy($taxonomy); + $args['disabled'] = !current_user_can($tax->cap->assign_terms); if ( is_array( $selected_cats ) ) $args['selected_cats'] = $selected_cats; elseif ( $post_id ) - $args['selected_cats'] = wp_get_post_categories($post_id); + $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids'))); else $args['selected_cats'] = array(); if ( is_array( $popular_cats ) ) $args['popular_cats'] = $popular_cats; else - $args['popular_cats'] = get_terms( 'category', array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) ); + $args['popular_cats'] = get_terms( $taxonomy, array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) ); if ( $descendants_and_self ) { - $categories = get_categories( "child_of=$descendants_and_self&hierarchical=0&hide_empty=0" ); - $self = get_category( $descendants_and_self ); + $categories = (array) get_terms($taxonomy, array( 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0 ) ); + $self = get_term( $descendants_and_self, $taxonomy ); array_unshift( $categories, $self ); } else { - $categories = get_categories('get=all'); + $categories = (array) get_terms($taxonomy, array('get' => 'all')); } - // 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) - $checked_categories = array(); - for ( $i = 0; isset($categories[$i]); $i++ ) { - if ( in_array($categories[$i]->term_id, $args['selected_cats']) ) { - $checked_categories[] = $categories[$i]; - unset($categories[$i]); + if ( $checked_ontop ) { + // 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) + $checked_categories = array(); + $keys = array_keys( $categories ); + + foreach( $keys as $k ) { + if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) { + $checked_categories[] = $categories[$k]; + unset( $categories[$k] ); + } } - } - // Put checked cats on top - echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args)); + // Put checked cats on top + echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args)); + } // Then the rest of them echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args)); } @@ -495,24 +315,33 @@ function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $select */ function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) { global $post_ID; + if ( $post_ID ) - $checked_categories = wp_get_post_categories($post_ID); + $checked_terms = wp_get_object_terms($post_ID, $taxonomy, array('fields'=>'ids')); else - $checked_categories = array(); - $categories = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number, 'hierarchical' => false ) ); + $checked_terms = array(); + + $terms = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number, 'hierarchical' => false ) ); + + $tax = get_taxonomy($taxonomy); + if ( ! current_user_can($tax->cap->assign_terms) ) + $disabled = 'disabled="disabled"'; + else + $disabled = ''; $popular_ids = array(); - foreach ( (array) $categories as $category ) { - $popular_ids[] = $category->term_id; + foreach ( (array) $terms as $term ) { + $popular_ids[] = $term->term_id; if ( !$echo ) // hack for AJAX use continue; - $id = "popular-category-$category->term_id"; + $id = "popular-$taxonomy-$term->term_id"; + $checked = in_array( $term->term_id, $checked_terms ) ? 'checked="checked"' : ''; ?>
  • @@ -521,21 +350,6 @@ function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $ech return $popular_ids; } -/** - * {@internal Missing Short Description}} - * - * @since unknown - * @deprecated Use {@link wp_link_category_checklist()} - * @see wp_link_category_checklist() - * - * @param unknown_type $default - */ -function dropdown_link_categories( $default = 0 ) { - global $link_id; - - wp_link_category_checklist($link_id); -} - /** * {@internal Missing Short Description}} * @@ -547,26 +361,24 @@ function wp_link_category_checklist( $link_id = 0 ) { $default = 1; if ( $link_id ) { - $checked_categories = wp_get_link_cats($link_id); - - if ( count( $checked_categories ) == 0 ) { - // No selected categories, strange + $checked_categories = wp_get_link_cats( $link_id ); + // No selected categories, strange + if ( ! count( $checked_categories ) ) $checked_categories[] = $default; - } } else { $checked_categories[] = $default; } - $categories = get_terms('link_category', 'orderby=count&hide_empty=0'); + $categories = get_terms( 'link_category', array( 'orderby' => 'name', 'hide_empty' => 0 ) ); - if ( empty($categories) ) + if ( empty( $categories ) ) return; foreach ( $categories as $category ) { $cat_id = $category->term_id; - $name = wp_specialchars( apply_filters('the_category', $category->name)); - $checked = in_array( $cat_id, $checked_categories ); - echo '"; + $name = esc_html( apply_filters( 'the_category', $category->name ) ); + $checked = in_array( $cat_id, $checked_categories ) ? ' checked="checked"' : ''; + echo '"; } } @@ -583,17 +395,36 @@ function wp_link_category_checklist( $link_id = 0 ) { * @param unknown_type $class * @return unknown */ -function _tag_row( $tag, $class = '' ) { +function _tag_row( $tag, $level, $taxonomy = 'post_tag' ) { + global $post_type, $current_screen; + static $row_class = ''; + $row_class = ($row_class == '' ? ' class="alternate"' : ''); + $count = number_format_i18n( $tag->count ); - $count = ( $count > 0 ) ? "$count" : $count; + $tax = get_taxonomy($taxonomy); + + if ( 'post_tag' == $taxonomy ) { + $tagsel = 'tag'; + } elseif ( 'category' == $taxonomy ) { + $tagsel = 'category_name'; + } elseif ( ! empty($tax->query_var) ) { + $tagsel = $tax->query_var; + } else { + $tagsel = $taxonomy; + } + + $pad = str_repeat( '— ', max(0, $level) ); + $name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag ); + $qe_data = get_term($tag->term_id, $taxonomy, object, 'edit'); + $edit_link = "edit-tags.php?action=edit&taxonomy=$taxonomy&post_type=$post_type&tag_ID=$tag->term_id"; - $name = apply_filters( 'term_name', $tag->name ); - $qe_data = get_term($tag->term_id, 'post_tag', object, 'edit'); - $edit_link = "edit-tags.php?action=edit&tag_ID=$tag->term_id"; $out = ''; - $out .= ''; - $columns = get_column_headers('edit-tags'); - $hidden = get_hidden_columns('edit-tags'); + $out .= ''; + + + $columns = get_column_headers($current_screen); + $hidden = get_hidden_columns($current_screen); + $default_term = get_option('default_' . $taxonomy); foreach ( $columns as $column_name => $column_display_name ) { $class = "class=\"$column_name column-$column_name\""; @@ -605,14 +436,24 @@ function _tag_row( $tag, $class = '' ) { switch ($column_name) { case 'cb': - $out .= ' '; + if ( current_user_can($tax->cap->delete_terms) && $tag->term_id != $default_term ) + $out .= ' '; + else + $out .= ' '; break; case 'name': - $out .= '' . $name . '
    '; + $out .= '' . $name . '
    '; $actions = array(); - $actions['edit'] = '' . __('Edit') . ''; - $actions['inline hide-if-no-js'] = '' . __('Quick Edit') . ''; - $actions['delete'] = "term_id) . "' onclick=\"if ( confirm('" . js_escape(sprintf(__("You are about to delete this tag '%s'\n 'Cancel' to stop, 'OK' to delete."), $name )) . "') ) { return true;}return false;\">" . __('Delete') . ""; + if ( current_user_can($tax->cap->edit_terms) ) { + $actions['edit'] = '' . __('Edit') . ''; + $actions['inline hide-if-no-js'] = '' . __('Quick Edit') . ''; + } + if ( current_user_can($tax->cap->delete_terms) && $tag->term_id != $default_term ) + $actions['delete'] = "term_id) . "'>" . __('Delete') . ""; + + $actions = apply_filters('tag_row_actions', $actions, $tag); + $actions = apply_filters("${taxonomy}_row_actions", $actions, $tag); + $action_count = count($actions); $i = 0; $out .= '
    '; @@ -624,19 +465,27 @@ function _tag_row( $tag, $class = '' ) { $out .= '
    '; $out .= ''; + $out .= '
    ' . apply_filters('editable_slug', $qe_data->slug) . '
    '; + $out .= '
    ' . $qe_data->parent . '
    '; + break; + case 'description': + $out .= "$tag->description"; break; case 'slug': - $out .= "$tag->slug"; + $out .= "" . apply_filters('editable_slug', $tag->slug) . ""; break; case 'posts': $attributes = 'class="posts column-posts num"' . $style; - $out .= "$count"; + $out .= "$count"; break; + default: + $out .= ""; + $out .= apply_filters("manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id); + $out .= ""; } } - $out .= ''; + $out .= "\n"; return $out; } @@ -654,30 +503,91 @@ function _tag_row( $tag, $class = '' ) { * @param unknown_type $searchterms * @return unknown */ -function tag_rows( $page = 1, $pagesize = 20, $searchterms = '' ) { +function tag_rows( $page = 1, $pagesize = 20, $searchterms = '', $taxonomy = 'post_tag' ) { // Get a page worth of tags $start = ($page - 1) * $pagesize; $args = array('offset' => $start, 'number' => $pagesize, 'hide_empty' => 0); - if ( !empty( $searchterms ) ) { + if ( !empty( $searchterms ) ) $args['search'] = $searchterms; - } - - $tags = get_terms( 'post_tag', $args ); // convert it to table rows $out = ''; $count = 0; - foreach( $tags as $tag ) - $out .= _tag_row( $tag, ++$count % 2 ? ' class="iedit alternate"' : ' class="iedit"' ); + if ( is_taxonomy_hierarchical($taxonomy) ) { + // We'll need the full set of terms then. + $args['number'] = $args['offset'] = 0; + + $terms = get_terms( $taxonomy, $args ); + if ( !empty( $searchterms ) ) // Ignore children on searches. + $children = array(); + else + $children = _get_term_hierarchy($taxonomy); + + // Some funky recursion to get the job done(Paging & parents mainly) is contained within, Skip it for non-hierarchical taxonomies for performance sake + $out .= _term_rows($taxonomy, $terms, $children, $page, $pagesize, $count); + } else { + $terms = get_terms( $taxonomy, $args ); + foreach( $terms as $term ) + $out .= _tag_row( $term, 0, $taxonomy ); + $count = $pagesize; // Only displaying a single page. + } - // filter and send to screen echo $out; return $count; } +function _term_rows( $taxonomy, $terms, &$children, $page = 1, $per_page = 20, &$count, $parent = 0, $level = 0 ) { + + $start = ($page - 1) * $per_page; + $end = $start + $per_page; + + $output = ''; + foreach ( $terms as $key => $term ) { + + if ( $count >= $end ) + break; + + if ( $term->parent != $parent && empty($_GET['s']) ) + continue; + + // If the page starts in a subtree, print the parents. + if ( $count == $start && $term->parent > 0 && empty($_GET['s']) ) { + $my_parents = $parent_ids = array(); + $p = $term->parent; + while ( $p ) { + $my_parent = get_term( $p, $taxonomy ); + $my_parents[] = $my_parent; + $p = $my_parent->parent; + if ( in_array($p, $parent_ids) ) // Prevent parent loops. + break; + $parent_ids[] = $p; + } + unset($parent_ids); + + $num_parents = count($my_parents); + while ( $my_parent = array_pop($my_parents) ) { + $output .= "\t" . _tag_row( $my_parent, $level - $num_parents, $taxonomy ); + $num_parents--; + } + } + + if ( $count >= $start ) + $output .= "\t" . _tag_row( $term, $level, $taxonomy ); + + ++$count; + + unset($terms[$key]); + + if ( isset($children[$term->term_id]) && empty($_GET['s']) ) + $output .= _term_rows( $taxonomy, $terms, $children, $page, $per_page, $count, $term->term_id, $level + 1 ); + } + + return $output; +} + // define the columns to display, the syntax is 'internal name' => 'display name' /** * {@internal Missing Short Description}} @@ -686,17 +596,31 @@ function tag_rows( $page = 1, $pagesize = 20, $searchterms = '' ) { * * @return unknown */ -function wp_manage_posts_columns() { +function wp_manage_posts_columns( $screen = '') { + if ( empty($screen) ) + $post_type = 'post'; + else + $post_type = $screen->post_type; + $posts_columns = array(); $posts_columns['cb'] = ''; - $posts_columns['title'] = _c('Post|noun'); + /* translators: manage posts column name */ + $posts_columns['title'] = _x('Title', 'column name'); $posts_columns['author'] = __('Author'); - $posts_columns['categories'] = __('Categories'); - $posts_columns['tags'] = __('Tags'); - if ( !isset($_GET['post_status']) || !in_array($_GET['post_status'], array('pending', 'draft', 'future')) ) - $posts_columns['comments'] = '
    Comments
    '; + if ( empty($post_type) || is_object_in_taxonomy($post_type, 'category') ) + $posts_columns['categories'] = __('Categories'); + if ( empty($post_type) || is_object_in_taxonomy($post_type, 'post_tag') ) + $posts_columns['tags'] = __('Tags'); + $post_status = !empty($_REQUEST['post_status']) ? $_REQUEST['post_status'] : 'all'; + if ( !in_array( $post_status, array('pending', 'draft', 'future') ) && ( empty($post_type) || post_type_supports($post_type, 'comments') ) ) + $posts_columns['comments'] = '
    Comments
    '; $posts_columns['date'] = __('Date'); - $posts_columns = apply_filters('manage_posts_columns', $posts_columns); + + if ( 'page' == $post_type ) + $posts_columns = apply_filters( 'manage_pages_columns', $posts_columns ); + else + $posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type ); + $posts_columns = apply_filters( "manage_{$post_type}_posts_columns", $posts_columns ); return $posts_columns; } @@ -713,13 +637,16 @@ function wp_manage_media_columns() { $posts_columns = array(); $posts_columns['cb'] = ''; $posts_columns['icon'] = ''; - $posts_columns['media'] = _c('File|media column header'); + /* translators: column name */ + $posts_columns['media'] = _x('File', 'column name'); $posts_columns['author'] = __('Author'); - //$posts_columns['tags'] = _c('Tags|media column header'); - $posts_columns['parent'] = _c('Attached to|media column header'); - $posts_columns['comments'] = '
    Comments
    '; + //$posts_columns['tags'] = _x('Tags', 'column name'); + /* translators: column name */ + $posts_columns['parent'] = _x('Attached to', 'column name'); + $posts_columns['comments'] = '
    Comments
    '; //$posts_columns['comments'] = __('Comments'); - $posts_columns['date'] = _c('Date|media column header'); + /* translators: column name */ + $posts_columns['date'] = _x('Date', 'column name'); $posts_columns = apply_filters('manage_media_columns', $posts_columns); return $posts_columns; @@ -733,72 +660,62 @@ function wp_manage_media_columns() { * @return unknown */ function wp_manage_pages_columns() { - $posts_columns = array(); - $posts_columns['cb'] = ''; - $posts_columns['title'] = __('Title'); - $posts_columns['author'] = __('Author'); - $post_status = 'all'; - if ( !empty($_GET['post_status']) ) - $post_status = $_GET['post_status']; - if ( !in_array($post_status, array('pending', 'draft', 'future')) ) - $posts_columns['comments'] = '
    '; - $posts_columns['date'] = __('Date'); - $posts_columns = apply_filters('manage_pages_columns', $posts_columns); - - return $posts_columns; + return wp_manage_posts_columns(); } /** - * {@internal Missing Short Description}} + * Get the column headers for a screen * * @since unknown * - * @param unknown_type $page - * @return unknown + * @param string|object $screen The screen you want the headers for + * @return array Containing the headers in the format id => UI String */ -function get_column_headers($page) { +function get_column_headers($screen) { global $_wp_column_headers; if ( !isset($_wp_column_headers) ) $_wp_column_headers = array(); + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + // Store in static to avoid running filters on each call - if ( isset($_wp_column_headers[$page]) ) - return $_wp_column_headers[$page]; + if ( isset($_wp_column_headers[$screen->id]) ) + return $_wp_column_headers[$screen->id]; - switch ($page) { + switch ($screen->base) { case 'edit': - $_wp_column_headers[$page] = wp_manage_posts_columns(); + $_wp_column_headers[$screen->id] = wp_manage_posts_columns( $screen ); break; - case 'edit-pages': - $_wp_column_headers[$page] = wp_manage_pages_columns(); - break; case 'edit-comments': - $_wp_column_headers[$page] = array( + $_wp_column_headers[$screen->id] = array( 'cb' => '', 'author' => __('Author'), - 'comment' => _c('Comment|noun'), + /* translators: column name */ + 'comment' => _x('Comment', 'column name'), //'date' => __('Submitted'), 'response' => __('In Response To') ); break; case 'link-manager': - $_wp_column_headers[$page] = array( + $_wp_column_headers[$screen->id] = array( 'cb' => '', 'name' => __('Name'), 'url' => __('URL'), 'categories' => __('Categories'), - 'rel' => __('rel'), - 'visible' => __('Visible') + 'rel' => __('Relationship'), + 'visible' => __('Visible'), + 'rating' => __('Rating') ); break; case 'upload': - $_wp_column_headers[$page] = wp_manage_media_columns(); + $_wp_column_headers[$screen->id] = wp_manage_media_columns(); break; case 'categories': - $_wp_column_headers[$page] = array( + $_wp_column_headers[$screen->id] = array( 'cb' => '', 'name' => __('Name'), 'description' => __('Description'), @@ -808,7 +725,7 @@ function get_column_headers($page) { break; case 'edit-link-categories': - $_wp_column_headers[$page] = array( + $_wp_column_headers[$screen->id] = array( 'cb' => '', 'name' => __('Name'), 'description' => __('Description'), @@ -818,16 +735,17 @@ function get_column_headers($page) { break; case 'edit-tags': - $_wp_column_headers[$page] = array( + $_wp_column_headers[$screen->id] = array( 'cb' => '', 'name' => __('Name'), + 'description' => __('Description'), 'slug' => __('Slug'), 'posts' => __('Posts') ); break; case 'users': - $_wp_column_headers[$page] = array( + $_wp_column_headers[$screen->id] = array( 'cb' => '', 'username' => __('Username'), 'name' => __('Name'), @@ -837,11 +755,11 @@ function get_column_headers($page) { ); break; default : - $_wp_column_headers[$page] = array(); + $_wp_column_headers[$screen->id] = array(); } - $_wp_column_headers[$page] = apply_filters('manage_' . $page . '_columns', $_wp_column_headers[$page]); - return $_wp_column_headers[$page]; + $_wp_column_headers[$screen->id] = apply_filters('manage_' . $screen->id . '_columns', $_wp_column_headers[$screen->id]); + return $_wp_column_headers[$screen->id]; } /** @@ -849,18 +767,16 @@ function get_column_headers($page) { * * @since unknown * - * @param unknown_type $type + * @param unknown_type $screen * @param unknown_type $id */ -function print_column_headers( $type, $id = true ) { - $type = str_replace('.php', '', $type); - $columns = get_column_headers( $type ); - $hidden = get_hidden_columns($type); +function print_column_headers( $screen, $id = true ) { + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + $columns = get_column_headers( $screen ); + $hidden = get_hidden_columns($screen); $styles = array(); -// $styles['tag']['posts'] = 'width: 90px;'; -// $styles['link-category']['links'] = 'width: 90px;'; -// $styles['category']['posts'] = 'width: 90px;'; -// $styles['link']['visible'] = 'text-align: center;'; foreach ( $columns as $column_key => $column_display_name ) { $class = ' class="manage-column'; @@ -878,8 +794,8 @@ function print_column_headers( $type, $id = true ) { if ( in_array($column_key, $hidden) ) $style = 'display:none;'; - if ( isset($styles[$type]) && isset($styles[$type][$column_key]) ) - $style .= ' ' . $styles[$type][$column_key]; + if ( isset($styles[$screen->id]) && isset($styles[$screen->id][$column_key]) ) + $style .= ' ' . $styles[$screen>id][$column_key]; $style = ' style="' . $style . '"'; ?> > @@ -898,10 +814,13 @@ function print_column_headers( $type, $id = true ) { function register_column_headers($screen, $columns) { global $_wp_column_headers; + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + if ( !isset($_wp_column_headers) ) $_wp_column_headers = array(); - $_wp_column_headers[$screen] = $columns; + $_wp_column_headers[$screen->id] = $columns; } /** @@ -909,11 +828,13 @@ function register_column_headers($screen, $columns) { * * @since unknown * - * @param unknown_type $page + * @param unknown_type $screen */ -function get_hidden_columns($page) { - $page = str_replace('.php', '', $page); - return (array) get_user_option( 'manage-' . $page . '-columns-hidden', 0, false ); +function get_hidden_columns($screen) { + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + return (array) get_user_option( 'manage' . $screen->id. 'columnshidden' ); } /** @@ -923,43 +844,61 @@ function get_hidden_columns($page) { * * @since 2.7 * - * @param string $type 'post' or 'page' + * @param string $screen */ -function inline_edit_row( $type ) { +function inline_edit_row( $screen ) { global $current_user, $mode; - $is_page = 'page' == $type; - if ( $is_page ) { - $screen = 'edit-pages'; - $post = get_default_page_to_edit(); - } else { - $screen = 'edit'; - $post = get_default_post_to_edit(); + if ( is_string($screen) ) { + $screen = array('id' => 'edit-' . $screen, 'base' => 'edit', 'post_type' => $screen ); + $screen = (object) $screen; + } + + $post = get_default_post_to_edit( $screen->post_type ); + $post_type_object = get_post_type_object( $screen->post_type ); + + $taxonomy_names = get_object_taxonomies( $screen->post_type ); + $hierarchical_taxonomies = array(); + $flat_taxonomies = array(); + foreach ( $taxonomy_names as $taxonomy_name ) { + $taxonomy = get_taxonomy( $taxonomy_name); + + if ( !$taxonomy->show_ui ) + continue; + + if ( $taxonomy->hierarchical ) + $hierarchical_taxonomies[] = $taxonomy; + else + $flat_taxonomies[] = $taxonomy; } - $columns = $is_page ? wp_manage_pages_columns() : wp_manage_posts_columns(); + $columns = wp_manage_posts_columns($screen); $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns($screen) ) ); $col_count = count($columns) - count($hidden); $m = ( isset($mode) && 'excerpt' == $mode ) ? 'excerpt' : 'list'; - $can_publish = current_user_can("publish_{$type}s"); + $can_publish = current_user_can($post_type_object->cap->publish_posts); $core_columns = array( 'cb' => true, 'date' => true, 'title' => true, 'categories' => true, 'tags' => true, 'comments' => true, 'author' => true ); ?>
    - post_type "; + echo $bulk ? "bulk-edit-row bulk-edit-row-$hclass bulk-edit-$screen->post_type" : "quick-edit-row quick-edit-row-$hclass inline-edit-$screen->post_type"; ?>" style="display: none"> @@ -1215,39 +1181,49 @@ function inline_edit_row( $type ) { * @param unknown_type $post */ function get_inline_data($post) { - - if ( ! current_user_can('edit_' . $post->post_type, $post->ID) ) + $post_type_object = get_post_type_object($post->post_type); + if ( ! current_user_can($post_type_object->cap->edit_post, $post->ID) ) return; - $title = attribute_escape($post->post_title); + $title = esc_attr( get_the_title( $post->ID ) ); echo ' '; } @@ -1262,7 +1238,7 @@ function get_inline_data($post) { function post_rows( $posts = array() ) { global $wp_query, $post, $mode; - add_filter('the_title','wp_specialchars'); + add_filter('the_title','esc_html'); // Create array of post IDs. $post_ids = array(); @@ -1274,8 +1250,6 @@ function post_rows( $posts = array() ) { $post_ids[] = $a_post->ID; $comment_pending_count = get_pending_comments_num($post_ids); - if ( empty($comment_pending_count) ) - $comment_pending_count = array(); foreach ( $posts as $post ) { if ( empty($comment_pending_count[$post->ID]) ) @@ -1295,7 +1269,7 @@ function post_rows( $posts = array() ) { * @param unknown_type $mode */ function _post_row($a_post, $pending_comments, $mode) { - global $post; + global $post, $current_user, $current_screen; static $rowclass; $global_post = $post; @@ -1303,15 +1277,15 @@ function _post_row($a_post, $pending_comments, $mode) { setup_postdata($post); $rowclass = 'alternate' == $rowclass ? '' : 'alternate'; - global $current_user; $post_owner = ( $current_user->ID == $post->post_author ? 'self' : 'other' ); $edit_link = get_edit_post_link( $post->ID ); $title = _draft_or_post_title(); + $post_type_object = get_post_type_object($post->post_type); ?> post_status ); ?> iedit' valign="top"> $column_display_name ) { $class = "class=\"$column_name column-$column_name\""; @@ -1325,13 +1299,14 @@ function _post_row($a_post, $pending_comments, $mode) { case 'cb': ?> - + post_date && 'date' == $column_name ) { $t_time = $h_time = __('Unpublished'); + $time_diff = 0; } else { $t_time = get_the_time(__('Y/m/d g:i:s A')); $m_time = $post->post_date; @@ -1339,20 +1314,10 @@ function _post_row($a_post, $pending_comments, $mode) { $time_diff = time() - $time; - if ( ( 'future' == $post->post_status) ) { - if ( $time_diff <= 0 ) { - $h_time = sprintf( __('%s from now'), human_time_diff( $time ) ); - } else { - $h_time = $t_time; - $missed = true; - } - } else { - - if ( $time_diff > 0 && $time_diff < 24*60*60 ) - $h_time = sprintf( __('%s ago'), human_time_diff( $time ) ); - else - $h_time = mysql2date(__('Y/m/d'), $m_time); - } + if ( $time_diff > 0 && $time_diff < 24*60*60 ) + $h_time = sprintf( __('%s ago'), human_time_diff( $time ) ); + else + $h_time = mysql2date(__('Y/m/d'), $m_time); } echo ' + - + - + post_title = wp_specialchars( $page->post_title ); + if ( 0 == $level && (int)$page->post_parent > 0 ) { + //sent level 0 by accident, by default, or because we don't know the actual level + $find_main_page = (int)$page->post_parent; + while ( $find_main_page > 0 ) { + $parent = get_page($find_main_page); + + if ( is_null($parent) ) + break; + + $level++; + $find_main_page = (int)$parent->post_parent; + + if ( !isset($parent_name) ) + $parent_name = $parent->post_title; + } + } + + $page->post_title = esc_html( $page->post_title ); $pad = str_repeat( '— ', $level ); $id = (int) $page->ID; $rowclass = 'alternate' == $rowclass ? '' : 'alternate'; - $posts_columns = get_column_headers('edit-pages'); - $hidden = get_hidden_columns('edit-pages'); + $posts_columns = get_column_headers( $current_screen ); + $hidden = get_hidden_columns( $current_screen ); $title = _draft_or_post_title(); + $post_type = $page->post_type; + $post_type_object = get_post_type_object($post_type); ?> $column_display_name) { +foreach ( $posts_columns as $column_name => $column_display_name ) { $class = "class=\"$column_name column-$column_name\""; $style = ''; @@ -1537,53 +1529,66 @@ foreach ($posts_columns as $column_name=>$column_display_name) { case 'cb': ?> - + post_date && 'date' == $column_name ) { $t_time = $h_time = __('Unpublished'); + $time_diff = 0; } else { $t_time = get_the_time(__('Y/m/d g:i:s A')); $m_time = $page->post_date; $time = get_post_time('G', true); - if ( ( abs(time() - $time) ) < 86400 ) { - if ( ( 'future' == $page->post_status) ) - $h_time = sprintf( __('%s from now'), human_time_diff( $time ) ); - else - $h_time = sprintf( __('%s ago'), human_time_diff( $time ) ); - } else { + $time_diff = time() - $time; + + if ( $time_diff > 0 && $time_diff < 24*60*60 ) + $h_time = sprintf( __('%s ago'), human_time_diff( $time ) ); + else $h_time = mysql2date(__('Y/m/d'), $m_time); - } } echo ''; break; case 'title': $attributes = 'class="post-title page-title column-title"' . $style; $edit_link = get_edit_post_link( $page->ID ); ?> - + post_parent == $page->ID ) { $page->post_parent = 0; - $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET post_parent = '0' WHERE ID = %d", $page->ID) ); + $wpdb->update($wpdb->posts, array('post_parent' => 0), array('ID' => $page->ID)); clean_page_cache( $page->ID ); } @@ -1721,12 +1726,9 @@ function page_rows($pages, $pagenum = 1, $per_page = 20) { } } -/* +/** * Given a top level page ID, display the nested hierarchy of sub-pages * together with paging support - */ -/** - * {@internal Missing Short Description}} * * @since unknown * @@ -1780,22 +1782,24 @@ function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_ } /** - * {@internal Missing Short Description}} + * Generate HTML for a single row on the users.php admin panel. * - * @since unknown + * @since 2.1.0 * - * @param unknown_type $user_object - * @param unknown_type $style - * @param unknown_type $role - * @return unknown + * @param object $user_object + * @param string $style Optional. Attributes added to the TR element. Must be sanitized. + * @param string $role Key for the $wp_roles array. + * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts. + * @return string */ -function user_row( $user_object, $style = '', $role = '' ) { +function user_row( $user_object, $style = '', $role = '', $numposts = 0 ) { global $wp_roles; $current_user = wp_get_current_user(); if ( !( is_object( $user_object) && is_a( $user_object, 'WP_User' ) ) ) $user_object = new WP_User( (int) $user_object ); + $user_object = sanitize_user_object($user_object, 'display'); $email = $user_object->user_email; $url = $user_object->user_url; $short_url = str_replace( 'http://', '', $url ); @@ -1804,18 +1808,33 @@ function user_row( $user_object, $style = '', $role = '' ) { $short_url = substr( $short_url, 0, -1 ); if ( strlen( $short_url ) > 35 ) $short_url = substr( $short_url, 0, 32 ).'...'; - $numposts = get_usernumposts( $user_object->ID ); - if ( current_user_can( 'edit_user', $user_object->ID ) ) { + $checkbox = ''; + // Check if the user for this row is editable + if ( current_user_can( 'list_users' ) ) { + // Set up the user editing link + // TODO: make profile/user-edit determination a separate function if ($current_user->ID == $user_object->ID) { $edit_link = 'profile.php'; } else { - $edit_link = clean_url( add_query_arg( 'wp_http_referer', urlencode( clean_url( stripslashes( $_SERVER['REQUEST_URI'] ) ) ), "user-edit.php?user_id=$user_object->ID" ) ); + $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" ) ); } $edit = "$user_object->user_login
    "; + + // Set up the hover actions for this user $actions = array(); - $actions['edit'] = '' . __('Edit') . ''; - if ( $current_user->ID != $user_object->ID ) + + if ( current_user_can('edit_user', $user_object->ID) ) { + $edit = "$user_object->user_login
    "; + $actions['edit'] = '' . __('Edit') . ''; + } else { + $edit = "$user_object->user_login
    "; + } + + if ( !is_multisite() && $current_user->ID != $user_object->ID && current_user_can('delete_user', $user_object->ID) ) $actions['delete'] = "" . __('Delete') . ""; + if ( is_multisite() && $current_user->ID != $user_object->ID && current_user_can('remove_user', $user_object->ID) ) + $actions['remove'] = "" . __('Remove') . ""; + $actions = apply_filters('user_row_actions', $actions, $user_object); $action_count = count($actions); $i = 0; $edit .= '
    '; @@ -1825,14 +1844,18 @@ function user_row( $user_object, $style = '', $role = '' ) { $edit .= "$link$sep"; } $edit .= '
    '; + + // Set up the checkbox (because the user is editable, otherwise its empty) + $checkbox = ""; + } else { $edit = '' . $user_object->user_login . ''; } - $role_name = isset($wp_roles->role_names[$role]) ? translate_with_context($wp_roles->role_names[$role]) : __('None'); + $role_name = isset($wp_roles->role_names[$role]) ? translate_user_role($wp_roles->role_names[$role] ) : __('None'); $r = ""; $columns = get_column_headers('users'); $hidden = get_hidden_columns('users'); - $avatar = get_avatar( $user_object->user_email, 32 ); + $avatar = get_avatar( $user_object->ID, 32 ); foreach ( $columns as $column_name => $column_display_name ) { $class = "class=\"$column_name column-$column_name\""; @@ -1844,7 +1867,7 @@ function user_row( $user_object, $style = '', $role = '' ) { switch ($column_name) { case 'cb': - $r .= ""; + $r .= ""; break; case 'username': $r .= ""; @@ -1853,7 +1876,7 @@ function user_row( $user_object, $style = '', $role = '' ) { $r .= ""; break; case 'email': - $r .= ""; + $r .= ""; break; case 'role': $r .= ""; @@ -1869,6 +1892,11 @@ function user_row( $user_object, $style = '', $role = '' ) { $r .= 0; } $r .= ""; + break; + default: + $r .= ""; } } $r .= ''; @@ -1881,13 +1909,13 @@ function user_row( $user_object, $style = '', $role = '' ) { * * @since unknown * - * @param unknown_type $status - * @param unknown_type $s - * @param unknown_type $start - * @param unknown_type $num - * @param unknown_type $post - * @param unknown_type $type - * @return unknown + * @param string $status Comment status (approved, spam, trash, etc) + * @param string $s Term to search for + * @param int $start Offset to start at for pagination + * @param int $num Maximum number of comments to return + * @param int $post Post ID or 0 to return all comments + * @param string $type Comment type (comment, trackback, pingback, etc) + * @return array [0] contains the comments and [1] contains the total number of comments that match (ignoring $start and $num) */ function _wp_get_comment_list( $status = '', $s = false, $start, $num, $post = 0, $type = '' ) { global $wpdb; @@ -1895,53 +1923,71 @@ function _wp_get_comment_list( $status = '', $s = false, $start, $num, $post = 0 $start = abs( (int) $start ); $num = (int) $num; $post = (int) $post; - - if ( 'moderated' == $status ) - $approved = "comment_approved = '0'"; - elseif ( 'approved' == $status ) - $approved = "comment_approved = '1'"; - elseif ( 'spam' == $status ) - $approved = "comment_approved = 'spam'"; - else - $approved = "( comment_approved = '0' OR comment_approved = '1' )"; + $count = wp_count_comments(); + $index = ''; + + if ( 'moderated' == $status ) { + $approved = "c.comment_approved = '0'"; + $total = $count->moderated; + } elseif ( 'approved' == $status ) { + $approved = "c.comment_approved = '1'"; + $total = $count->approved; + } elseif ( 'spam' == $status ) { + $approved = "c.comment_approved = 'spam'"; + $total = $count->spam; + } elseif ( 'trash' == $status ) { + $approved = "c.comment_approved = 'trash'"; + $total = $count->trash; + } else { + $approved = "( c.comment_approved = '0' OR c.comment_approved = '1' )"; + $total = $count->moderated + $count->approved; + $index = 'USE INDEX (c.comment_date_gmt)'; + } if ( $post ) { - $post = " AND comment_post_ID = '$post'"; - $orderby = "ORDER BY comment_date_gmt ASC LIMIT $start, $num"; + $total = ''; + $post = " AND c.comment_post_ID = '$post'"; } else { $post = ''; - $orderby = "ORDER BY comment_date_gmt DESC LIMIT $start, $num"; } + $orderby = "ORDER BY c.comment_date_gmt DESC LIMIT $start, $num"; + if ( 'comment' == $type ) - $typesql = "AND comment_type = ''"; - elseif ( 'pingback' == $type ) - $typesql = "AND comment_type = 'pingback'"; - elseif ( 'trackback' == $type ) - $typesql = "AND comment_type = 'trackback'"; + $typesql = "AND c.comment_type = ''"; elseif ( 'pings' == $type ) - $typesql = "AND ( comment_type = 'pingback' OR comment_type = 'trackback' )"; + $typesql = "AND ( c.comment_type = 'pingback' OR c.comment_type = 'trackback' )"; + elseif ( 'all' == $type ) + $typesql = ''; + elseif ( !empty($type) ) + $typesql = $wpdb->prepare("AND c.comment_type = %s", $type); else $typesql = ''; + if ( !empty($type) ) + $total = ''; + + $query = "FROM $wpdb->comments c LEFT JOIN $wpdb->posts p ON c.comment_post_ID = p.ID WHERE p.post_status != 'trash' "; if ( $s ) { + $total = ''; $s = $wpdb->escape($s); - $comments = $wpdb->get_results("SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->comments WHERE - (comment_author LIKE '%$s%' OR - comment_author_email LIKE '%$s%' OR - comment_author_url LIKE ('%$s%') OR - comment_author_IP LIKE ('%$s%') OR - comment_content LIKE ('%$s%') ) AND + $query .= "AND + (c.comment_author LIKE '%$s%' OR + c.comment_author_email LIKE '%$s%' OR + c.comment_author_url LIKE ('%$s%') OR + c.comment_author_IP LIKE ('%$s%') OR + c.comment_content LIKE ('%$s%') ) AND $approved - $typesql - $orderby"); + $typesql"; } else { - $comments = $wpdb->get_results( "SELECT SQL_CALC_FOUND_ROWS * FROM $wpdb->comments WHERE $approved $post $typesql $orderby" ); + $query .= "AND $approved $post $typesql"; } - update_comment_cache($comments); + $comments = $wpdb->get_results("SELECT * $query $orderby"); + if ( '' === $total ) + $total = $wpdb->get_var("SELECT COUNT(c.comment_ID) $query"); - $total = $wpdb->get_var( "SELECT FOUND_ROWS()" ); + update_comment_cache($comments); return array($comments, $total); } @@ -1961,13 +2007,14 @@ function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, $comment = get_comment( $comment_id ); $post = get_post($comment->comment_post_ID); $the_comment_status = wp_get_comment_status($comment->comment_ID); + $post_type_object = get_post_type_object($post->post_type); + $user_can = current_user_can($post_type_object->cap->edit_post, $post->ID); + $comment_url = esc_url(get_comment_link($comment->comment_ID)); $author_url = get_comment_author_url(); if ( 'http://' == $author_url ) $author_url = ''; - $author_url_display = $author_url; - $author_url_display = str_replace('http://www.', '', $author_url_display); - $author_url_display = str_replace('http://', '', $author_url_display); + $author_url_display = preg_replace('|http://(www\.)?|i', '', $author_url); if ( strlen($author_url_display) > 50 ) $author_url_display = substr($author_url_display, 0, 49) . '...'; @@ -1977,10 +2024,18 @@ function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, else $ptime = mysql2date(__('Y/m/d \a\t g:i A'), $comment->comment_date ); - $delete_url = clean_url( wp_nonce_url( "comment.php?action=deletecomment&p=$post->ID&c=$comment->comment_ID", "delete-comment_$comment->comment_ID" ) ); - $approve_url = clean_url( wp_nonce_url( "comment.php?action=approvecomment&p=$post->ID&c=$comment->comment_ID", "approve-comment_$comment->comment_ID" ) ); - $unapprove_url = clean_url( wp_nonce_url( "comment.php?action=unapprovecomment&p=$post->ID&c=$comment->comment_ID", "unapprove-comment_$comment->comment_ID" ) ); - $spam_url = clean_url( wp_nonce_url( "comment.php?action=deletecomment&dt=spam&p=$post->ID&c=$comment->comment_ID", "delete-comment_$comment->comment_ID" ) ); + if ( $user_can ) { + $del_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "delete-comment_$comment->comment_ID" ) ); + $approve_nonce = esc_html( '_wpnonce=' . wp_create_nonce( "approve-comment_$comment->comment_ID" ) ); + + $approve_url = esc_url( "comment.php?action=approvecomment&p=$post->ID&c=$comment->comment_ID&$approve_nonce" ); + $unapprove_url = esc_url( "comment.php?action=unapprovecomment&p=$post->ID&c=$comment->comment_ID&$approve_nonce" ); + $spam_url = esc_url( "comment.php?action=spamcomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" ); + $unspam_url = esc_url( "comment.php?action=unspamcomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" ); + $trash_url = esc_url( "comment.php?action=trashcomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" ); + $untrash_url = esc_url( "comment.php?action=untrashcomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" ); + $delete_url = esc_url( "comment.php?action=deletecomment&p=$post->ID&c=$comment->comment_ID&$del_nonce" ); + } echo ""; $columns = get_column_headers('edit-comments'); @@ -1998,46 +2053,80 @@ function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, case 'cb': if ( !$checkbox ) break; echo ''; break; case 'comment': echo "'; + echo ''; + if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array(80, 60), true ) ) ) + echo $thumb; + echo ''; } + break; + default: + echo "\n"; + break; } } echo "\n"; @@ -2139,9 +2242,9 @@ function wp_comment_reply($position = '1', $checkbox = false, $mode = 'single', ?> -
    -

    +

    - +post_type, 'title' ) ) : + if ( $bulk ) : ?>
    @@ -971,16 +910,15 @@ function inline_edit_row( $type ) { - - - - - + + +
    @@ -989,24 +927,26 @@ function inline_edit_row( $type ) { id, true, $type ); // TODO: ROLE SYSTEM + if ( post_type_supports( $screen->post_type, 'author' ) ) : + $authors = get_editable_user_ids( $current_user->id, true, $screen->post_type ); // TODO: ROLE SYSTEM + $authors_dropdown = ''; if ( $authors && count( $authors ) > 1 ) : - $users_opt = array('include' => $authors, 'name' => 'post_author', 'class'=> 'authors', 'multi' => 1); + $users_opt = array('include' => $authors, 'name' => 'post_author', 'class'=> 'authors', 'multi' => 1, 'echo' => 0); if ( $bulk ) - $users_opt['show_option_none'] = __('- No Change -'); -?> - + $users_opt['show_option_none'] = __('— No Change —'); + $authors_dropdown = ''; - - +
    - - + + +
    @@ -1026,41 +970,49 @@ function inline_edit_row( $type ) {
    - +
    - + + + + labels->name) ?> -
      - + +
        + $taxonomy->name)) ?>
      + + +
    - +
    post_type, 'author' ) && $bulk ) echo $authors_dropdown; ?> - +hierarchical ) : ?> - +post_type, 'page-attributes' ) ) : + if ( !$bulk ) : ?> - +hierarchical ?> + + + + - + - + + +post_type, 'comments' ) || post_type_supports( $screen->post_type, 'trackbacks' ) ) : + if ( $bulk ) : ?>
    + post_type, 'comments' ) ) : ?> - + post_type, 'trackbacks' ) ) : ?> +
    + post_type, 'comments' ) ) : ?> - + post_type, 'trackbacks' ) ) : ?> +
    - - +
    - +post_type && $can_publish && current_user_can( $post_type_object->cap->edit_others_posts ) ) : ?>
    @@ -1179,23 +1144,24 @@ function inline_edit_row( $type ) { foreach ( $columns as $column_name => $column_display_name ) { if ( isset( $core_columns[$column_name] ) ) continue; - do_action( $bulk ? 'bulk_edit_custom_box' : 'quick_edit_custom_box', $column_name, $type); + do_action( $bulk ? 'bulk_edit_custom_box' : 'quick_edit_custom_box', $column_name, $screen->post_type ); } ?>

    - - + + - + - + +

    ID ) ) { ?>cap->edit_post, $post->ID ) ) { ?> '; @@ -1364,7 +1329,7 @@ function _post_row($a_post, $pending_comments, $mode) { if ( 'publish' == $post->post_status ) { _e('Published'); } elseif ( 'future' == $post->post_status ) { - if ( isset($missed) ) + if ( $time_diff > 0 ) echo '' . __('Missed schedule') . ''; else _e('Scheduled'); @@ -1377,23 +1342,31 @@ function _post_row($a_post, $pending_comments, $mode) { case 'title': $attributes = 'class="post-title column-title"' . $style; ?> - >ID ) ) { ?>"> + >cap->edit_post, $post->ID) && $post->post_status != 'trash' ) { ?> ID) ) { - $actions['edit'] = '' . __('Edit') . ''; - $actions['inline hide-if-no-js'] = '' . __('Quick Edit') . ''; - $actions['delete'] = "ID) . "' onclick=\"if ( confirm('" . js_escape(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') . ""; + if ( current_user_can($post_type_object->cap->edit_post, $post->ID) && 'trash' != $post->post_status ) { + $actions['edit'] = '' . __('Edit') . ''; + $actions['inline hide-if-no-js'] = '' . __('Quick Edit') . ''; + } + if ( current_user_can($post_type_object->cap->delete_post, $post->ID) ) { + if ( 'trash' == $post->post_status ) + $actions['untrash'] = "ID) ), 'untrash-' . $post->post_type . '_' . $post->ID ) . "'>" . __('Restore') . ""; + elseif ( EMPTY_TRASH_DAYS ) + $actions['trash'] = "" . __('Trash') . ""; + if ( 'trash' == $post->post_status || !EMPTY_TRASH_DAYS ) + $actions['delete'] = "" . __('Delete Permanently') . ""; } if ( in_array($post->post_status, array('pending', 'draft')) ) { - if ( current_user_can('edit_post', $post->ID) ) - $actions['view'] = '' . __('Preview') . ''; - } else { - $actions['view'] = '' . __('View') . ''; + if ( current_user_can($post_type_object->cap->edit_post, $post->ID) ) + $actions['view'] = '' . __('Preview') . ''; + } elseif ( 'trash' != $post->post_status ) { + $actions['view'] = '' . __('View') . ''; } + $actions = apply_filters('post_row_actions', $actions, $post); $action_count = count($actions); $i = 0; echo '
    '; @@ -1417,7 +1390,7 @@ function _post_row($a_post, $pending_comments, $mode) { if ( !empty( $categories ) ) { $out = array(); foreach ( $categories as $c ) - $out[] = " " . wp_specialchars(sanitize_term_field('name', $c->name, $c->term_id, 'category', 'display')) . ""; + $out[] = " " . esc_html(sanitize_term_field('name', $c->name, $c->term_id, 'category', 'display')) . ""; echo join( ', ', $out ); } else { _e('Uncategorized'); @@ -1433,7 +1406,7 @@ function _post_row($a_post, $pending_comments, $mode) { if ( !empty( $tags ) ) { $out = array(); foreach ( $tags as $c ) - $out[] = " " . wp_specialchars(sanitize_term_field('name', $c->name, $c->term_id, 'post_tag', 'display')) . ""; + $out[] = " " . esc_html(sanitize_term_field('name', $c->name, $c->term_id, 'post_tag', 'display')) . ""; echo join( ', ', $out ); } else { _e('No Tags'); @@ -1449,7 +1422,7 @@ function _post_row($a_post, $pending_comments, $mode) { $pending_phrase = sprintf( __('%s pending'), number_format( $pending_comments ) ); if ( $pending_comments ) echo ''; - comments_number("" . __('0') . '', "" . __('1') . '', "" . __('%') . ''); + comments_number("" . /* translators: comment count link */ _x('0', 'comment count') . '', "" . /* translators: comment count link */ _x('1', 'comment count') . '', "" . /* translators: comment count link: % will be substituted by comment count */ _x('%', 'comment count') . ''); if ( $pending_comments ) echo ''; ?> @@ -1459,7 +1432,7 @@ function _post_row($a_post, $pending_comments, $mode) { case 'author': ?> -
    >> ID) ) { echo "" . __('Edit') . ""; } ?>cap->edit_post, $post->ID) ) { echo "" . __('Edit') . ""; } ?> ID) ) { echo "ID) . "' class='delete'>" . __('Delete') . ""; } ?>cap->delete_post, $post->ID) ) { echo "ID) . "' class='delete'>" . __('Delete') . ""; } ?>
    cap->edit_post, $page->ID ) ) { ?> '; echo '' . apply_filters('post_date_column_time', $h_time, $page, $column_name, '') . ''; echo '
    '; - if ( 'publish' == $page->post_status || 'future' == $page->post_status ) + if ( 'publish' == $page->post_status ) { _e('Published'); - else + } elseif ( 'future' == $page->post_status ) { + if ( $time_diff > 0 ) + echo '' . __('Missed schedule') . ''; + else + _e('Scheduled'); + } else { _e('Last Modified'); + } echo '
    >ID ) ) { ?>"> + >cap->edit_post, $page->ID) && $post->post_status != 'trash' ) { ?>labels->parent_item_colon . ' ' . esc_html($parent_name) : ''; ?> ID) ) { - $actions['edit'] = '' . __('Edit') . ''; + if ( current_user_can($post_type_object->cap->edit_post, $page->ID) && $post->post_status != 'trash' ) { + $actions['edit'] = '' . __('Edit') . ''; $actions['inline'] = '' . __('Quick Edit') . ''; - $actions['delete'] = "ID) . "' onclick=\"if ( confirm('" . js_escape(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') . ""; + } + if ( current_user_can($post_type_object->cap->delete_post, $page->ID) ) { + if ( $post->post_status == 'trash' ) + $actions['untrash'] = "post_type . '_' . $page->ID) . "'>" . __('Restore') . ""; + elseif ( EMPTY_TRASH_DAYS ) + $actions['trash'] = "" . __('Trash') . ""; + if ( $post->post_status == 'trash' || !EMPTY_TRASH_DAYS ) + $actions['delete'] = "post_type . '_' . $page->ID) . "'>" . __('Delete Permanently') . ""; } if ( in_array($post->post_status, array('pending', 'draft')) ) { - if ( current_user_can('edit_page', $page->ID) ) - $actions['view'] = '' . __('Preview') . ''; - } else { - $actions['view'] = '' . __('View') . ''; + if ( current_user_can($post_type_object->cap->edit_post, $page->ID) ) + $actions['view'] = '' . __('Preview') . ''; + } elseif ( $post->post_status != 'trash' ) { + $actions['view'] = '' . __('View') . ''; } + $actions = apply_filters('page_row_actions', $actions, $page); $action_count = count($actions); $i = 0; @@ -1607,7 +1612,7 @@ foreach ($posts_columns as $column_name=>$column_display_name) { $pending_phrase = sprintf( __('%s pending'), number_format( $left ) ); if ( $left ) echo ''; - comments_number("" . __('0') . '', "" . __('1') . '', "" . __('%') . ''); + comments_number("" . /* translators: comment count link */ _x('0', 'comment count') . '', "" . /* translators: comment count link */ _x('1', 'comment count') . '', "" . /* translators: comment count link: % will be substituted by comment count */ _x('%', 'comment count') . ''); if ( $left ) echo ''; ?> @@ -1617,7 +1622,7 @@ foreach ($posts_columns as $column_name=>$column_display_name) { case 'author': ?> - >>
    $checkbox$avatar $edit$user_object->first_name $user_object->last_name$email$email$role_name"; + $r .= apply_filters('manage_users_custom_column', '', $column_name, $user_object->ID); + $r .= "
    '; - if ( current_user_can('edit_post', $post->ID) ) echo ""; + if ( $user_can ) echo ""; echo '"; echo '
    '; - printf(__('Submitted on %2$s at %3$s'), get_comment_link($comment->comment_ID), get_comment_date(__('Y/m/d')), get_comment_date(__('g:ia'))); + /* translators: 2: comment date, 3: comment time */ + printf( __( '%2$s at %3$s' ), $comment_url, + /* translators: comment date format. See http://php.net/date */ get_comment_date( __('Y/m/d') ), + /* translators: comment time format. See http://php.net/date */ get_comment_date( get_option( 'time_format' ) ) ); + + if ( $comment->comment_parent ) { + $parent = get_comment( $comment->comment_parent ); + $parent_link = esc_url( get_comment_link( $comment->comment_parent ) ); + $name = apply_filters( 'get_comment_author', $parent->comment_author ); // there's no API function for this + printf( ' | '.__( 'In reply to %2$s.' ), $parent_link, $name ); + } + echo '
    '; - comment_text(); ?> + comment_text(); + if ( $user_can ) { ?> ID) ) { - $actions['approve'] = "" . __( 'Approve' ) . ''; - $actions['unapprove'] = "" . __( 'Unapprove' ) . ''; - if ( $comment_status ) { // not looking at all comments - if ( 'approved' == $the_comment_status ) { - $actions['unapprove'] = "" . __( 'Unapprove' ) . ''; - unset($actions['approve']); - } else { - $actions['approve'] = "" . __( 'Approve' ) . ''; - unset($actions['unapprove']); - } + } + + if ( $user_can ) { + // preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash + $actions = array( + 'approve' => '', 'unapprove' => '', + 'reply' => '', + 'quickedit' => '', + 'edit' => '', + 'spam' => '', 'unspam' => '', + 'trash' => '', 'untrash' => '', 'delete' => '' + ); + + if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments + if ( 'approved' == $the_comment_status ) + $actions['unapprove'] = "" . __( 'Unapprove' ) . ''; + else if ( 'unapproved' == $the_comment_status ) + $actions['approve'] = "" . __( 'Approve' ) . ''; + } else { + $actions['approve'] = "" . __( 'Approve' ) . ''; + $actions['unapprove'] = "" . __( 'Unapprove' ) . ''; + } + + if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) { + $actions['spam'] = "" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . ''; + } elseif ( 'spam' == $the_comment_status ) { + $actions['unspam'] = "" . _x( 'Not Spam', 'comment' ) . ''; + } elseif ( 'trash' == $the_comment_status ) { + $actions['untrash'] = "" . __( 'Restore' ) . ''; } - if ( 'spam' != $the_comment_status ) - $actions['spam'] = "" . _c( 'Spam|verb' ) . ''; - $actions['delete'] = "" . __('Delete') . ''; - $actions['edit'] = "". __('Edit') . ''; - $actions['quickedit'] = '' . __('Quick Edit') . ''; - if ( 'spam' != $the_comment_status ) - $actions['reply'] = '' . __('Reply') . ''; - $actions = apply_filters( 'comment_row_actions', $actions, $comment ); + if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) { + $actions['delete'] = "" . __('Delete Permanently') . ''; + } else { + $actions['trash'] = "" . _x('Trash', 'verb') . ''; + } + + if ( 'trash' != $the_comment_status ) { + $actions['edit'] = "". __('Edit') . ''; + $actions['quickedit'] = '' . __('Quick Edit') . ''; + if ( 'spam' != $the_comment_status ) + $actions['reply'] = '' . __('Reply') . ''; + } + + $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment ); $i = 0; echo '
    '; @@ -2048,6 +2137,12 @@ function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, // Reply and quickedit need a hide-if-no-js span when not added with ajax if ( ('reply' == $action || 'quickedit' == $action) && ! $from_ajax ) $action .= ' hide-if-no-js'; + elseif ( ($action == 'untrash' && $the_comment_status == 'trash') || ($action == 'unspam' && $the_comment_status == 'spam') ) { + if ('1' == get_comment_meta($comment_id, '_wp_trash_meta_status', true)) + $action .= ' approve'; + else + $action .= ' unapprove'; + } echo "$sep$link"; } @@ -2060,7 +2155,7 @@ function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, echo "
    "; comment_author(); echo '
    '; if ( !empty($author_url) ) echo "$author_url_display
    "; - if ( current_user_can( 'edit_post', $post->ID ) ) { + if ( $user_can ) { if ( !empty($comment->comment_author_email) ) { comment_author_email_link(); echo '
    '; @@ -2082,31 +2177,39 @@ function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, case 'response': if ( 'single' !== $mode ) { if ( isset( $_comment_pending_count[$post->ID] ) ) { - $pending_comments = absint( $_comment_pending_count[$post->ID] ); + $pending_comments = $_comment_pending_count[$post->ID]; } else { - $_comment_pending_count_temp = (array) get_pending_comments_num( array( $post->ID ) ); + $_comment_pending_count_temp = get_pending_comments_num( array( $post->ID ) ); $pending_comments = $_comment_pending_count[$post->ID] = $_comment_pending_count_temp[$post->ID]; } - if ( current_user_can( 'edit_post', $post->ID ) ) { + if ( $user_can ) { $post_link = ""; $post_link .= get_the_title($post->ID) . ''; } else { $post_link = get_the_title($post->ID); } echo "
    \n"; - echo $post_link; - echo '\n"; + do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID ); + echo "
    "; - $r .= "\n\t\t"; - $r .= "\n\t\t\n\t"; + $r .= "\n\t\t\n\t"; return $r; } @@ -2334,14 +2420,14 @@ function meta_form() { $keys = $wpdb->get_col( " SELECT meta_key FROM $wpdb->postmeta - WHERE meta_key NOT LIKE '\_%' GROUP BY meta_key - ORDER BY meta_id DESC + HAVING meta_key NOT LIKE '\_%' + ORDER BY meta_key LIMIT $limit" ); if ( $keys ) natcasesort($keys); ?> -

    +

    +
    @@ -2195,36 +2298,19 @@ function wp_comment_reply($position = '1', $checkbox = false, $mode = 'single', } /** - * {@internal Missing Short Description}} + * Output 'undo move to trash' text for comments * - * @since unknown - * - * @param unknown_type $currentcat - * @param unknown_type $currentparent - * @param unknown_type $parent - * @param unknown_type $level - * @param unknown_type $categories - * @return unknown + * @since 2.9.0 */ -function wp_dropdown_cats( $currentcat = 0, $currentparent = 0, $parent = 0, $level = 0, $categories = 0 ) { - if (!$categories ) - $categories = get_categories( array('hide_empty' => 0) ); - - if ( $categories ) { - foreach ( $categories as $category ) { - if ( $currentcat != $category->term_id && $parent == $category->parent) { - $pad = str_repeat( '– ', $level ); - $category->name = wp_specialchars( $category->name ); - echo "\n\t"; - wp_dropdown_cats( $currentcat, $currentparent, $category->term_id, $level +1, $categories ); - } - } - } else { - return false; - } +function wp_comment_trashnotice() { +?> + + + $entry['meta_id'] = (int) $entry['meta_id']; $delete_nonce = wp_create_nonce( 'delete-meta_' . $entry['meta_id'] ); $r .= "\n\t
    "; + $r .= "\n\t\t"; $r .= "\n\t\t
    "; - $r .= "\n\t\t
    "; + $r .= "class='delete:the-list:meta-{$entry['meta_id']}::_ajax_nonce=$delete_nonce deletemeta' tabindex='6' value='". esc_attr__( 'Delete' ) ."' />"; + $r .= "\n\t\t"; $r .= wp_nonce_field( 'change-meta', '_ajax_nonce', false, false ); $r .= "
    @@ -2355,12 +2441,11 @@ function meta_form() {
    @@ -2376,8 +2461,8 @@ function meta_form() {
    - - + +
    @@ -2399,7 +2484,7 @@ function touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) { global $wp_locale, $post, $comment; if ( $for_post ) - $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; + $edit = ! ( in_array($post->post_status, array('draft', 'pending') ) && (!$post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) ); $tab_index_attribute = ''; if ( (int) $tab_index > 0 ) @@ -2407,14 +2492,14 @@ function touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) { // echo '
    '; - $time_adj = time() + (get_option( 'gmt_offset' ) * 3600 ); + $time_adj = current_time('timestamp'); $post_date = ($for_post) ? $post->post_date : $comment->comment_date; - $jj = ($edit) ? mysql2date( 'd', $post_date ) : gmdate( 'd', $time_adj ); - $mm = ($edit) ? mysql2date( 'm', $post_date ) : gmdate( 'm', $time_adj ); - $aa = ($edit) ? mysql2date( 'Y', $post_date ) : gmdate( 'Y', $time_adj ); - $hh = ($edit) ? mysql2date( 'H', $post_date ) : gmdate( 'H', $time_adj ); - $mn = ($edit) ? mysql2date( 'i', $post_date ) : gmdate( 'i', $time_adj ); - $ss = ($edit) ? mysql2date( 's', $post_date ) : gmdate( 's', $time_adj ); + $jj = ($edit) ? mysql2date( 'd', $post_date, false ) : gmdate( 'd', $time_adj ); + $mm = ($edit) ? mysql2date( 'm', $post_date, false ) : gmdate( 'm', $time_adj ); + $aa = ($edit) ? mysql2date( 'Y', $post_date, false ) : gmdate( 'Y', $time_adj ); + $hh = ($edit) ? mysql2date( 'H', $post_date, false ) : gmdate( 'H', $time_adj ); + $mn = ($edit) ? mysql2date( 'i', $post_date, false ) : gmdate( 'i', $time_adj ); + $ss = ($edit) ? mysql2date( 's', $post_date, false ) : gmdate( 's', $time_adj ); $cur_jj = gmdate( 'd', $time_adj ); $cur_mm = gmdate( 'm', $time_adj ); @@ -2432,12 +2517,15 @@ function touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) { $month .= ''; $day = ''; - $year = ''; + $year = ''; $hour = ''; $minute = ''; - printf(_c('%1$s%2$s, %3$s @ %4$s : %5$s|1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input'), $month, $day, $year, $hour, $minute); - echo ''; + echo '
    '; + /* translators: 1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input */ + printf(__('%1$s%2$s, %3$s @ %4$s : %5$s'), $month, $day, $year, $hour, $minute); + + echo '
    '; if ( $multi ) return; @@ -2449,8 +2537,6 @@ function touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) { } ?> - -

    @@ -2505,7 +2591,7 @@ function parent_dropdown( $default = 0, $parent = 0, $level = 0 ) { else $current = ''; - echo "\n\t"; + echo "\n\t"; parent_dropdown( $default, $item->ID, $level +1 ); } } else { @@ -2513,18 +2599,6 @@ function parent_dropdown( $default = 0, $parent = 0, $level = 0 ) { } } -/** - * {@internal Missing Short Description}} - * - * @since unknown - */ -function browse_happy() { - $getit = __( 'WordPress recommends a better browser' ); - echo ' -

    Browse Happy
    -'; -} - /** * {@internal Missing Short Description}} * @@ -2540,7 +2614,7 @@ function the_attachment_links( $id = false ) { if ( $post->post_type != 'attachment' ) return false; - $icon = get_attachment_icon( $post->ID ); + $icon = wp_get_attachment_image( $post->ID, 'thumbnail', true ); $attachment_data = wp_get_attachment_metadata( $id ); $thumb = isset( $attachment_data['thumb'] ); ?> @@ -2576,23 +2650,29 @@ function the_attachment_links( $id = false ) { html elements for role selectors based on $wp_roles * - * @since unknown + * @package WordPress + * @subpackage Administration + * @since 2.1 * - * @param unknown_type $default + * @uses $wp_roles + * @param string $default slug for the role that should be already selected */ -function wp_dropdown_roles( $default = false ) { - global $wp_roles; +function wp_dropdown_roles( $selected = false ) { $p = ''; $r = ''; - foreach( $wp_roles->role_names as $role => $name ) { - $name = translate_with_context($name); - if ( $default == $role ) // Make default first in list - $p = "\n\t"; + + $editable_roles = get_editable_roles(); + + foreach ( $editable_roles as $role => $details ) { + $name = translate_user_role($details['name'] ); + if ( $selected == $role ) // Make default first in list + $p = "\n\t"; else - $r .= "\n\t"; + $r .= "\n\t"; } echo $p . $r; } @@ -2648,41 +2728,34 @@ function wp_max_upload_size() { } /** - * {@internal Missing Short Description}} + * Outputs the form used by the importers to accept the data to be imported * - * @since unknown + * @since 2.0 * - * @param unknown_type $action + * @param string $action The action attribute for the form. */ function wp_import_upload_form( $action ) { $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() ); $size = wp_convert_bytes_to_hr( $bytes ); + $upload_dir = wp_upload_dir(); + if ( ! empty( $upload_dir['error'] ) ) : + ?>

    +

    - +

    - ()

    -

    - -

    -
    -post_name); // just in case - if ( strlen($name) ) - echo ''; +

    + +

    + + $id, 'title' => $title, 'callback' => $callback); + $wp_meta_boxes[$page][$context][$priority][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $callback_args); } /** - * {@internal Missing Short Description}} + * Meta-Box template function * - * @since unknown + * @since 2.5.0 * - * @param unknown_type $page - * @param unknown_type $context - * @param unknown_type $object + * @param string $page page identifier, also known as screen identifier + * @param string $context box context + * @param mixed $object gets passed to the box callback function as first parameter * @return int number of meta_boxes */ function do_meta_boxes($page, $context, $object) { global $wp_meta_boxes; static $already_sorted = false; - //do_action('do_meta_boxes', $page, $context, $object); - $hidden = get_hidden_meta_boxes($page); - echo "
    \n"; + printf('
    ', htmlspecialchars($context)); $i = 0; do { // Grab the ones the user has manually sorted. Pull them out of their previous context/priority and into the one the user chose - if ( !$already_sorted && $sorted = get_user_option( "meta-box-order_$page", 0, false ) ) { + if ( !$already_sorted && $sorted = get_user_option( "meta-box-order_$page" ) ) { foreach ( $sorted as $box_context => $ids ) foreach ( explode(',', $ids) as $id ) if ( $id ) @@ -2788,9 +2860,8 @@ function do_meta_boxes($page, $context, $object) { continue; $i++; $style = ''; - if ( in_array($box['id'], $hidden) ) - $style = 'style="display:none;"'; - echo '
    ' . "\n"; + $hidden_class = in_array($box['id'], $hidden) ? ' hide-if-js' : ''; + echo '
    ' . "\n"; echo '

    '; echo "

    {$box['title']}

    \n"; echo '
    ' . "\n"; @@ -2836,19 +2907,22 @@ function remove_meta_box($id, $page, $context) { * * @since unknown * - * @param unknown_type $page + * @param unknown_type $screen */ -function meta_box_prefs($page) { +function meta_box_prefs($screen) { global $wp_meta_boxes; - if ( empty($wp_meta_boxes[$page]) ) + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + if ( empty($wp_meta_boxes[$screen->id]) ) return; - $hidden = get_hidden_meta_boxes($page); + $hidden = get_hidden_meta_boxes($screen); - foreach ( array_keys($wp_meta_boxes[$page]) as $context ) { - foreach ( array_keys($wp_meta_boxes[$page][$context]) as $priority ) { - foreach ( $wp_meta_boxes[$page][$context][$priority] as $box ) { + foreach ( array_keys($wp_meta_boxes[$screen->id]) as $context ) { + foreach ( array_keys($wp_meta_boxes[$screen->id][$context]) as $priority ) { + foreach ( $wp_meta_boxes[$screen->id][$context][$priority] as $box ) { if ( false == $box || ! $box['title'] ) continue; // Submit box cannot be hidden @@ -2863,16 +2937,23 @@ function meta_box_prefs($page) { } } -function get_hidden_meta_boxes($page) { - $hidden = (array) get_user_option( "meta-box-hidden_$page", 0, false ); +/** + * Get Hidden Meta Boxes + * + * @since 2.7 + * + * @param string|object $screen Screen identifier + * @return array Hidden Meta Boxes + */ +function get_hidden_meta_boxes( $screen ) { + if ( is_string( $screen ) ) + $screen = convert_to_screen( $screen ); + + $hidden = get_user_option( "metaboxhidden_{$screen->id}" ); // Hide slug boxes by default - if ( empty($hidden[0]) ) { - if ( 'page' == $page ) - $hidden = array('pageslugdiv'); - elseif ( 'post' == $page ) - $hidden = array('slugdiv'); - } + if ( !is_array( $hidden ) ) + $hidden = array('slugdiv'); return $hidden; } @@ -2880,16 +2961,31 @@ function get_hidden_meta_boxes($page) { /** * Add a new section to a settings page. * + * Part of the Settings API. Use this to define new settings sections for an admin page. + * Show settings sections in your admin page callback function with do_settings_sections(). + * Add settings fields to your section with add_settings_field() + * + * The $callback argument should be the name of a function that echoes out any + * content you want to show at the top of the settings section before the actual + * fields. It can output nothing if you want. + * * @since 2.7.0 * - * @param string $id String for use in the 'id' attribute of tags. - * @param string $title Title of the section. - * @param string $callback Function that fills the section with the desired content. The function should echo its output. - * @param string $page The type of settings page on which to show the section (general, reading, writing, ...). + * @global $wp_settings_sections Storage array of all settings sections added to admin pages + * + * @param string $id Slug-name to identify the section. Used in the 'id' attribute of tags. + * @param string $title Formatted title of the section. Shown as the heading for the section. + * @param string $callback Function that echos out any content at the top of the section (between heading and fields). + * @param string $page The slug-name of the settings page on which to show the section. Built-in pages include 'general', 'reading', 'writing', 'discussion', 'media', etc. Create your own using add_options_page(); */ function add_settings_section($id, $title, $callback, $page) { global $wp_settings_sections; + if ( 'misc' == $page ) { + _deprecated_argument( __FUNCTION__, '3.0', __( 'The miscellaneous options group has been removed. Use another settings group.' ) ); + $page = 'general'; + } + if ( !isset($wp_settings_sections) ) $wp_settings_sections = array(); if ( !isset($wp_settings_sections[$page]) ) @@ -2901,20 +2997,35 @@ function add_settings_section($id, $title, $callback, $page) { } /** - * Add a new field to a settings page. + * Add a new field to a section of a settings page + * + * Part of the Settings API. Use this to define a settings field that will show + * as part of a settings section inside a settings page. The fields are shown using + * do_settings_fields() in do_settings-sections() + * + * The $callback argument should be the name of a function that echoes out the + * html input tags for this setting field. Use get_option() to retrive existing + * values to show. * * @since 2.7.0 * - * @param string $id String for use in the 'id' attribute of tags. - * @param string $title Title of the field. - * @param string $callback Function that fills the field with the desired content. The function should echo its output. - * @param string $page The type of settings page on which to show the field (general, reading, writing, ...). - * @param string $section The section of the settingss page in which to show the box (default, ...). + * @global $wp_settings_fields Storage array of settings fields and info about their pages/sections + * + * @param string $id Slug-name to identify the field. Used in the 'id' attribute of tags. + * @param string $title Formatted title of the field. Shown as the label for the field during output. + * @param string $callback Function that fills the field with the desired form inputs. The function should echo its output. + * @param string $page The slug-name of the settings page on which to show the section (general, reading, writing, ...). + * @param string $section The slug-name of the section of the settingss page in which to show the box (default, ...). * @param array $args Additional arguments */ function add_settings_field($id, $title, $callback, $page, $section = 'default', $args = array()) { global $wp_settings_fields; + if ( 'misc' == $page ) { + _deprecated_argument( __FUNCTION__, '3.0', __( 'The miscellaneous options group has been removed. Use another settings group.' ) ); + $page = 'general'; + } + if ( !isset($wp_settings_fields) ) $wp_settings_fields = array(); if ( !isset($wp_settings_fields[$page]) ) @@ -2926,11 +3037,17 @@ function add_settings_field($id, $title, $callback, $page, $section = 'default', } /** - * {@internal Missing Short Description}} + * Prints out all settings sections added to a particular settings page + * + * Part of the Settings API. Use this in a settings page callback function + * to output all the sections and fields that were added to that $page with + * add_settings_section() and add_settings_field() * + * @global $wp_settings_sections Storage array of all settings sections added to admin pages + * @global $wp_settings_fields Storage array of settings fields and info about their pages/sections * @since unknown * - * @param unknown_type $page + * @param string $page The slug name of the page whos settings sections you want to output */ function do_settings_sections($page) { global $wp_settings_sections, $wp_settings_fields; @@ -2950,12 +3067,18 @@ function do_settings_sections($page) { } /** - * {@internal Missing Short Description}} + * Print out the settings fields for a particular settings section + * + * Part of the Settings API. Use this in a settings page to output + * a specific section. Should normally be called by do_settings_sections() + * rather than directly. + * + * @global $wp_settings_fields Storage array of settings fields and their pages/sections * * @since unknown * - * @param unknown_type $page - * @param unknown_type $section + * @param string $page Slug title of the admin page who's settings fields you want to show. + * @param section $section Slug title of the settings section who's fields you want to show. */ function do_settings_fields($page, $section) { global $wp_settings_fields; @@ -2970,12 +3093,137 @@ function do_settings_fields($page, $section) { else echo '' . $field['title'] . ''; echo ''; - call_user_func($field['callback']); + call_user_func($field['callback'], $field['args']); echo ''; echo ''; } } +/** + * Register a settings error to be displayed to the user + * + * Part of the Settings API. Use this to show messages to users about settings validation + * problems, missing settings or anything else. + * + * Settings errors should be added inside the $sanitize_callback function defined in + * register_setting() for a given setting to give feedback about the submission. + * + * By default messages will show immediately after the submission that generated the error. + * Additional calls to settings_errors() can be used to show errors even when the settings + * page is first accessed. + * + * @global array $wp_settings_errors Storage array of errors registered during this pageload + * + * @param string $setting Slug title of the setting to which this error applies + * @param string $code Slug-name to identify the error. Used as part of 'id' attribute in HTML output. + * @param string $message The formatted message text to display to the user (will be shown inside styled
    and

    ) + * @param string $type The type of message it is, controls HTML class. Use 'error' or 'updated'. + */ +function add_settings_error( $setting, $code, $message, $type = 'error' ) { + global $wp_settings_errors; + + if ( !isset($wp_settings_errors) ) + $wp_settings_errors = array(); + + $new_error = array( + 'setting' => $setting, + 'code' => $code, + 'message' => $message, + 'type' => $type + ); + $wp_settings_errors[] = $new_error; +} + +/** + * Fetch settings errors registered by add_settings_error() + * + * Checks the $wp_settings_errors array for any errors declared during the current + * pageload and returns them. + * + * If changes were just submitted ($_GET['updated']) and settings errors were saved + * to the 'settings_errors' transient then those errors will be returned instead. This + * is used to pass errors back across pageloads. + * + * Use the $sanitize argument to manually re-sanitize the option before returning errors. + * This is useful if you have errors or notices you want to show even when the user + * hasn't submitted data (i.e. when they first load an options page, or in admin_notices action hook) + * + * @global array $wp_settings_errors Storage array of errors registered during this pageload + * + * @param string $setting Optional slug title of a specific setting who's errors you want. + * @param boolean $sanitize Whether to re-sanitize the setting value before returning errors. + * @return array Array of settings errors + */ +function get_settings_errors( $setting = '', $sanitize = FALSE ) { + global $wp_settings_errors; + + // If $sanitize is true, manually re-run the sanitizisation for this option + // This allows the $sanitize_callback from register_setting() to run, adding + // any settings errors you want to show by default. + if ( $sanitize ) + sanitize_option( $setting, get_option($setting)); + + // If settings were passed back from options.php then use them + // Ignore transients if $sanitize is true, we dont' want the old values anyway + if ( isset($_GET['updated']) && $_GET['updated'] && get_transient('settings_errors') ) { + $settings_errors = get_transient('settings_errors'); + delete_transient('settings_errors'); + // Otherwise check global in case validation has been run on this pageload + } elseif ( count( $wp_settings_errors ) ) { + $settings_errors = $wp_settings_errors; + } else { + return; + } + + // Filter the results to those of a specific setting if one was set + if ( $setting ) { + foreach ( (array) $settings_errors as $key => $details ) + if ( $setting != $details['setting'] ) + unset( $settings_errors[$key] ); + } + return $settings_errors; +} + +/** + * Display settings errors registered by add_settings_error() + * + * Part of the Settings API. Outputs a

    for each error retrieved by get_settings_errors(). + * + * This is called automatically after a settings page based on the Settings API is submitted. + * Errors should be added during the validation callback function for a setting defined in register_setting() + * + * The $sanitize option is passed into get_settings_errors() and will re-run the setting sanitization + * on its current value. + * + * The $hide_on_update option will cause errors to only show when the settings page is first loaded. + * if the user has already saved new values it will be hidden to avoid repeating messages already + * shown in the default error reporting after submission. This is useful to show general errors like missing + * settings when the user arrives at the settings page. + * + * @param string $setting Optional slug title of a specific setting who's errors you want. + * @param boolean $sanitize Whether to re-sanitize the setting value before returning errors. + * @param boolean $hide_on_update If set to true errors will not be shown if the settings page has already been submitted. + * @return + */ +function settings_errors ( $setting = '', $sanitize = FALSE, $hide_on_update = FALSE ) { + + if ($hide_on_update AND $_GET['updated']) return; + + $settings_errors = get_settings_errors( $setting, $sanitize ); + + if ( !is_array($settings_errors) ) return; + + $output = ''; + foreach ( $settings_errors as $key => $details ) { + $css_id = 'setting-error-' . $details['code']; + $css_class = $details['type'] . ' settings-error'; + $output .= "
    \n"; + $output .= "

    {$details['message']}

    "; + $output .= "
    \n"; + } + echo $output; +} + /** * {@internal Missing Short Description}} * @@ -2983,20 +3231,20 @@ function do_settings_fields($page, $section) { * * @param unknown_type $page */ -function manage_columns_prefs($page) { - $columns = get_column_headers($page); - - $hidden = get_hidden_columns($page); +function manage_columns_prefs( $page ) { + $columns = get_column_headers( $page ); + $hidden = get_hidden_columns( $page ); + $special = array('_title', 'cb', 'comment', 'media', 'name', 'title', 'username'); foreach ( $columns as $column => $title ) { - // Can't hide these - if ( 'cb' == $column || 'title' == $column || 'name' == $column || 'username' == $column || 'media' == $column || 'comment' == $column ) + // Can't hide these or they are special + if ( in_array( $column, $special ) ) continue; - if ( empty($title) ) + if ( empty( $title ) ) continue; if ( 'comments' == $column ) - $title = __('Comments'); + $title = __( 'Comments' ); $id = "$column-hide"; echo '
    - post_password ) ) echo attribute_escape( $post->post_password ); + if ( isset( $post->post_password ) ) echo esc_attr( $post->post_password ); } /** @@ -3159,15 +3315,72 @@ function the_post_password() { * * @since unknown */ -function favorite_actions() { +function favorite_actions( $screen = null ) { + $default_action = false; + + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + if ( isset($screen->post_type) ) { + $post_type_object = get_post_type_object($screen->post_type); + if ( 'add' != $screen->action ) + $default_action = array('post-new.php?post_type=' . $post_type_object->name => array($post_type_object->labels->new_item, $post_type_object->cap->edit_posts)); + else + $default_action = array('edit.php?post_type=' . $post_type_object->name => array($post_type_object->labels->name, $post_type_object->cap->edit_posts)); + } + + if ( !$default_action ) { + switch ( $screen->id ) { + case 'upload': + $default_action = array('media-new.php' => array(__('New Media'), 'upload_files')); + break; + case 'media': + $default_action = array('upload.php' => array(__('Edit Media'), 'upload_files')); + break; + case 'link-manager': + case 'link': + if ( 'add' != $screen->action ) + $default_action = array('link-add.php' => array(__('New Link'), 'manage_links')); + else + $default_action = array('link-manager.php' => array(__('Edit Links'), 'manage_links')); + break; + case 'users': + $default_action = array('user-new.php' => array(__('New User'), 'create_users')); + break; + case 'user': + $default_action = array('users.php' => array(__('Edit Users'), 'edit_users')); + break; + case 'plugins': + $default_action = array('plugin-install.php' => array(__('Install Plugins'), 'install_plugins')); + break; + case 'plugin-install': + $default_action = array('plugins.php' => array(__('Manage Plugins'), 'activate_plugins')); + break; + case 'themes': + $default_action = array('theme-install.php' => array(__('Install Themes'), 'install_themes')); + break; + case 'theme-install': + $default_action = array('themes.php' => array(__('Manage Themes'), 'switch_themes')); + break; + default: + $default_action = array('post-new.php' => array(__('New Post'), 'edit_posts')); + break; + } + } + $actions = array( 'post-new.php' => array(__('New Post'), 'edit_posts'), 'edit.php?post_status=draft' => array(__('Drafts'), 'edit_posts'), - 'page-new.php' => array(__('New Page'), 'edit_pages'), + 'post-new.php?post_type=page' => array(__('New Page'), 'edit_pages'), 'media-new.php' => array(__('Upload'), 'upload_files'), 'edit-comments.php' => array(__('Comments'), 'moderate_comments') ); + $default_key = array_keys($default_action); + $default_key = $default_key[0]; + if ( isset($actions[$default_key]) ) + unset($actions[$default_key]); + $actions = array_merge($default_action, $actions); $actions = apply_filters('favorite_actions', $actions); $allowed_actions = array(); @@ -3205,8 +3418,7 @@ function favorite_actions() { * @param int $id The post id. If not supplied the global $post is used. * */ -function _draft_or_post_title($post_id = 0) -{ +function _draft_or_post_title($post_id = 0) { $title = get_the_title($post_id); if ( empty($title) ) $title = __('(no title)'); @@ -3219,12 +3431,12 @@ function _draft_or_post_title($post_id = 0) * A simple wrapper to display the "s" parameter in a GET URI. This function * should only be used when {@link the_search_query()} cannot. * - * @uses attribute_escape + * @uses attr * @since 2.7.0 * */ function _admin_search_query() { - echo isset($_GET['s']) ? attribute_escape( stripslashes( $_GET['s'] ) ) : ''; + echo isset($_GET['s']) ? esc_attr( stripslashes( $_GET['s'] ) ) : ''; } /** @@ -3235,7 +3447,8 @@ function _admin_search_query() { * @param bool $limit_styles Limit styles to colour-related styles only (unless others are enqueued). * */ -function iframe_header( $title = '', $limit_styles = false) { +function iframe_header( $title = '', $limit_styles = false ) { +global $hook_suffix; ?> > @@ -3243,22 +3456,34 @@ function iframe_header( $title = '', $limit_styles = false) { <?php bloginfo('name') ?> › <?php echo $title ?> — <?php _e('WordPress'); ?> -> + class="no-js "> + -'; + //We're going to hide any footer output on iframe pages, but run the hooks anyway since they output Javascript or other needed content. ?> + + + + +post_status && 'draft' != $post_status ) $post_states[] = __('Draft'); if ( 'pending' == $post->post_status && 'pending' != $post_status ) - $post_states[] = __('Pending'); + /* translators: post state */ + $post_states[] = _x('Pending', 'post state'); + if ( is_sticky($post->ID) ) + $post_states[] = __('Sticky'); + + $post_states = apply_filters( 'display_post_states', $post_states ); if ( ! empty($post_states) ) { $state_count = count($post_states); @@ -3302,96 +3539,108 @@ function _post_states($post) { } } +/** + * Convert a screen string to a screen object + * + * @since 3.0.0 + * + * @param string $screen The name of the screen + * @return object An object containing the safe screen name and id + */ +function convert_to_screen( $screen ) { + $screen = str_replace( array('.php', '-new', '-add' ), '', $screen); + $screen = (string) apply_filters( 'screen_meta_screen', $screen ); + $screen = (object) array('id' => $screen, 'base' => $screen); + return $screen; +} + function screen_meta($screen) { - global $wp_meta_boxes, $_wp_contextual_help; + global $wp_meta_boxes, $_wp_contextual_help, $title; - $screen = str_replace('.php', '', $screen); - $screen = str_replace('-new', '', $screen); - $screen = str_replace('-add', '', $screen); - $screen = apply_filters('screen_meta_screen', $screen); + if ( is_string($screen) ) + $screen = convert_to_screen($screen); $column_screens = get_column_headers($screen); $meta_screens = array('index' => 'dashboard'); - if ( isset($meta_screens[$screen]) ) - $screen = $meta_screens[$screen]; - $show_screen = false; - if ( !empty($wp_meta_boxes[$screen]) || !empty($column_screens) ) - $show_screen = true; -?> -
    - - -id]) || !empty($column_screens) ) + $show_screen = true; - global $title; + $screen_options = screen_options($screen); + if ( $screen_options ) + $show_screen = true; if ( !isset($_wp_contextual_help) ) $_wp_contextual_help = array(); - if ( !isset($_wp_contextual_help['post']) ) { - $help = drag_drop_help(); - $help .= '

    ' . __('Writing Posts') . '

    '; - $_wp_contextual_help['post'] = $help; - } + $settings = apply_filters('screen_settings', '', $screen); - if ( !isset($_wp_contextual_help['page']) ) { - $help = drag_drop_help(); - $_wp_contextual_help['page'] = $help; + switch ( $screen->id ) { + case 'widgets': + $settings = '

    ' . __('Enable accessibility mode') . '' . __('Disable accessibility mode') . "

    \n"; + $show_screen = true; + break; } + if( ! empty( $settings ) ) + $show_screen = true; +?> +
    + + - if ( !isset($_wp_contextual_help['options-general']) ) - $_wp_contextual_help['options-general'] = __('General Settings'); + @@ -3420,32 +3669,286 @@ function screen_meta($screen) { function add_contextual_help($screen, $help) { global $_wp_contextual_help; + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + if ( !isset($_wp_contextual_help) ) $_wp_contextual_help = array(); - $_wp_contextual_help[$screen] = $help; + $_wp_contextual_help[$screen->id] = $help; } function drag_drop_help() { return ' -

    ' . __('Most of the modules on this screen can be moved. If you hover your mouse over the title bar of a module you’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.') . '

    +

    ' . __('Most of the modules on this screen can be moved. If you hover your mouse over the title bar of a module you’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.') . '

    ' . __('The same modules can be expanded and collapsed by clicking once on their title bar and also completely hidden from the Screen Options tab.') . '

    '; } -function screen_icon($name = '') { - global $parent_file, $hook_suffix; +function plugins_search_help() { + return ' +

    ' . __('Search help') . '

    ' . + '

    ' . __('You may search based on 3 criteria:') . '
    ' . + __('Term: Searches theme names and descriptions for the specified term.') . '
    ' . + __('Tag: Searches for themes tagged as such.') . '
    ' . + __('Author: Searches for themes created by the Author, or which the Author contributed to.') . '

    +'; +} + +function screen_layout($screen) { + global $screen_layout_columns; + + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + $columns = array('dashboard' => 4, 'link' => 2); + + // Add custom post types + foreach ( get_post_types( array('show_ui' => true) ) as $post_type ) + $columns[$post_type] = 2; + + $columns = apply_filters('screen_layout_columns', $columns, $screen->id, $screen); + + if ( !isset($columns[$screen->id]) ) { + $screen_layout_columns = 0; + return ''; + } + + $screen_layout_columns = get_user_option("screen_layout_$screen->id"); + $num = $columns[$screen->id]; + + if ( ! $screen_layout_columns ) + $screen_layout_columns = 2; + + $i = 1; + $return = '
    ' . __('Screen Layout') . "
    \n
    " . __('Number of Columns:') . "\n"; + while ( $i <= $num ) { + $return .= "\n"; + ++$i; + } + $return .= "
    \n"; + return $return; +} + +function screen_options($screen) { + if ( is_string($screen) ) + $screen = convert_to_screen($screen); + + switch ( $screen->base ) { + case 'edit': + case 'edit-pages': + $post_type = 'post'; + if ( isset($_GET['post_type']) && in_array( $_GET['post_type'], get_post_types( array('public' => true ) ) ) ) + $post_type = $_GET['post_type']; + $post_type_object = get_post_type_object($post_type); + $per_page_label = $post_type_object->labels->name; + break; + case 'ms-sites': + $per_page_label = _x( 'Sites', 'sites per page (screen options)' ); + break; + case 'ms-users': + $per_page_label = _x( 'Users', 'users per page (screen options)' ); + break; + case 'edit-comments': + $per_page_label = _x( 'Comments', 'comments per page (screen options)' ); + break; + case 'upload': + $per_page_label = _x( 'Media items', 'items per page (screen options)' ); + break; + case 'edit-tags': + global $tax; + $per_page_label = $tax->labels->name; + break; + case 'plugins': + $per_page_label = _x( 'Plugins', 'plugins per page (screen options)' ); + break; + default: + return ''; + } + + $option = str_replace( '-', '_', "{$screen->id}_per_page" ); + if ( 'edit_tags_per_page' == $option ) { + if ( 'category' == $tax->name ) + $option = 'categories_per_page'; + elseif ( 'post_tag' != $tax->name ) + $option = 'edit_' . $tax->name . '_per_page'; + } + + $per_page = (int) get_user_option( $option ); + if ( empty( $per_page ) || $per_page < 1 ) { + if ( 'plugins' == $screen->id ) + $per_page = 999; + else + $per_page = 20; + } + + if ( 'edit_comments_per_page' == $option ) + $per_page = apply_filters( 'comments_per_page', $per_page, isset($_REQUEST['comment_status']) ? $_REQUEST['comment_status'] : 'all' ); + elseif ( 'categories_per_page' == $option ) + $per_page = apply_filters( 'edit_categories_per_page', $per_page ); + else + $per_page = apply_filters( $option, $per_page ); + + $return = "
    \n"; + if ( !empty($per_page_label) ) + $return .= " \n"; + $return .= ""; + $return .= ""; + $return .= "
    \n"; + return $return; +} + +function screen_icon($screen = '') { + global $current_screen; + + if ( empty($screen) ) + $screen = $current_screen; + elseif ( is_string($screen) ) + $name = $screen; if ( empty($name) ) { - if ( isset($parent_file) && !empty($parent_file) ) - $name = substr($parent_file, 0, -4); + if ( !empty($screen->parent_base) ) + $name = $screen->parent_base; else - $name = str_replace(array('.php', '-new', '-add'), '', $hook_suffix); + $name = $screen->base; + + if ( 'edit' == $name && isset($screen->post_type) && 'page' == $screen->post_type ) + $name = 'edit-pages'; } - unset($hook_suffix); + ?>

    + + $current_screen, 'base' => $current_screen); + } else { + $id = sanitize_key($id); + if ( false !== strpos($id, '-') ) { + list( $id, $typenow ) = explode('-', $id, 2); + if ( taxonomy_exists( $typenow ) ) { + $id = 'edit-tags'; + $taxnow = $typenow; + $typenow = ''; + } + } + $current_screen = array('id' => $id, 'base' => $id); + } + + $current_screen = (object) $current_screen; + + $current_screen->action = $action; + + // Map index to dashboard + if ( 'index' == $current_screen->base ) + $current_screen->base = 'dashboard'; + if ( 'index' == $current_screen->id ) + $current_screen->id = 'dashboard'; + + if ( 'edit' == $current_screen->id ) { + if ( empty($typenow) ) + $typenow = 'post'; + $current_screen->id .= '-' . $typenow; + $current_screen->post_type = $typenow; + } elseif ( 'post' == $current_screen->id ) { + if ( empty($typenow) ) + $typenow = 'post'; + $current_screen->id = $typenow; + $current_screen->post_type = $typenow; + } elseif ( 'edit-tags' == $current_screen->id ) { + if ( empty($taxnow) ) + $taxnow = 'post_tag'; + $current_screen->id = 'edit-' . $taxnow; + $current_screen->taxonomy = $taxnow; + } + + $current_screen = apply_filters('current_screen', $current_screen); +} + ?>