X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/58f607a1de715c9bca69340a4d6fb9e1b9c2bed2..refs/tags/wordpress-4.0:/wp-admin/includes/template.php diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php index ea1c8056..30dcf0fc 100644 --- a/wp-admin/includes/template.php +++ b/wp-admin/includes/template.php @@ -8,241 +8,144 @@ * @subpackage Administration */ -/** - * {@internal Missing Short Description}} - * - * @since 2.7 - * - * Outputs the HTML for the hidden table rows used in Categories, Link Categories and Tags quick edit. - * - * @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, $taxonomy) { - - $tax = get_taxonomy($taxonomy); - if ( ! current_user_can( $tax->cap->edit_terms ) ) - return; - - $columns = get_column_headers($type); - $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns($type) ) ); - $col_count = count($columns) - count($hidden); - ?> - -
- -
-name ); - $edit_link = "link-category.php?action=edit&cat_ID=$category->term_id"; - if ( current_user_can( 'manage_categories' ) ) { - $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) . "'>" . __('Delete') . ""; - $actions = apply_filters('link_cat_row_actions', $actions, $category); - $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_term_to_edit($category->term_id, 'link_category'); - - $category->count = number_format_i18n( $category->count ); - $count = ( $category->count > 0 ) ? "$category->count" : $category->count; - $output = ""; - $columns = get_column_headers('edit-link-categories'); - $hidden = get_hidden_columns('edit-link-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 ( absint( get_option( 'default_link_category' ) ) != $category->term_id ) { - $output .= ""; - } else { - $output .= " "; - } - $output .= ""; - break; - case 'name': - $output .= "$edit"; - $output .= ''; - break; - case 'description': - $output .= "$category->description"; - break; - case '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 .= ''; - - return $output; -} - // // Category Checklists // /** - * {@internal Missing Short Description}} + * Walker to output an unordered list of category checkbox elements. * - * @since unknown + * @see Walker + * @see wp_category_checklist() + * @see wp_terms_checklist() + * @since 2.5.1 */ class Walker_Category_Checklist extends Walker { - var $tree_type = 'category'; - var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this - - function start_lvl(&$output, $depth, $args) { + public $tree_type = 'category'; + public $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this + + /** + * Starts the list before the elements are added. + * + * @see Walker:start_lvl() + * + * @since 2.5.1 + * + * @param string $output Passed by reference. Used to append additional content. + * @param int $depth Depth of category. Used for tab indentation. + * @param array $args An array of arguments. @see wp_terms_checklist() + */ + public function start_lvl( &$output, $depth = 0, $args = array() ) { $indent = str_repeat("\t", $depth); $output .= "$indent\n"; } - function start_el(&$output, $category, $depth, $args) { - extract($args); - if ( empty($taxonomy) ) + /** + * Start the element output. + * + * @see Walker::start_el() + * + * @since 2.5.1 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $category The current term object. + * @param int $depth Depth of the term in reference to parents. Default 0. + * @param array $args An array of arguments. @see wp_terms_checklist() + * @param int $id ID of the current term. + */ + public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { + if ( empty( $args['taxonomy'] ) ) { $taxonomy = 'category'; + } else { + $taxonomy = $args['taxonomy']; + } - if ( $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
  • " . ''; - } - - function end_el(&$output, $category, $depth, $args) { + } else { + $name = 'tax_input[' . $taxonomy . ']'; + } + $args['popular_cats'] = empty( $args['popular_cats'] ) ? array() : $args['popular_cats']; + $class = in_array( $category->term_id, $args['popular_cats'] ) ? ' class="popular-category"' : ''; + + $args['selected_cats'] = empty( $args['selected_cats'] ) ? array() : $args['selected_cats']; + + /** This filter is documented in wp-includes/category-template.php */ + $output .= "\n
  • " . + ''; + } + + /** + * Ends the element output, if needed. + * + * @see Walker::end_el() + * + * @since 2.5.1 + * + * @param string $output Passed by reference. Used to append additional content. + * @param object $category The current term object. + * @param int $depth Depth of the term in reference to parents. Default 0. + * @param array $args An array of arguments. @see wp_terms_checklist() + */ + public function end_el( &$output, $category, $depth = 0, $args = array() ) { $output .= "
  • \n"; } } /** - * {@internal Missing Short Description}} + * Output an unordered list of checkbox elements labelled + * with category names. * - * @since unknown + * @see wp_terms_checklist() + * @since 2.5.1 * - * @param unknown_type $post_id - * @param unknown_type $descendants_and_self - * @param unknown_type $selected_cats - * @param unknown_type $popular_cats + * @param int $post_id Mark categories associated with this post as checked. $selected_cats must not be an array. + * @param int $descendants_and_self ID of the category to output along with its descendents. + * @param bool|array $selected_cats List of categories to mark as checked. + * @param bool|array $popular_cats Override the list of categories that receive the "popular-category" class. + * @param object $walker Walker object to use to build the output. + * @param bool $checked_ontop Move checked items out of the hierarchy and to the top of the list. */ 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 - )); + 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 + * Output an unordered list of checkbox elements labelled + * with term names. Taxonomy independent version of wp_category_checklist(). + * + * @since 3.0.0 * * @param int $post_id * @param array $args */ -function wp_terms_checklist($post_id = 0, $args = array()) { +function wp_terms_checklist( $post_id = 0, $args = array() ) { $defaults = array( 'descendants_and_self' => 0, 'selected_cats' => false, @@ -251,39 +154,66 @@ function wp_terms_checklist($post_id = 0, $args = array()) { '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; + /** + * Filter the taxonomy terms checklist arguments. + * + * @since 3.4.0 + * + * @see wp_terms_checklist() + * + * @param array $args An array of arguments. + * @param int $post_id The post ID. + */ + $params = apply_filters( 'wp_terms_checklist_args', $args, $post_id ); - $descendants_and_self = (int) $descendants_and_self; + $r = wp_parse_args( $params, $defaults ); - $args = array('taxonomy' => $taxonomy); + if ( empty( $r['walker'] ) || ! is_a( $r['walker'], 'Walker' ) ) { + $walker = new Walker_Category_Checklist; + } else { + $walker = $r['walker']; + } - $tax = get_taxonomy($taxonomy); - $args['disabled'] = !current_user_can($tax->cap->assign_terms); + $taxonomy = $r['taxonomy']; + $descendants_and_self = (int) $r['descendants_and_self']; - if ( is_array( $selected_cats ) ) - $args['selected_cats'] = $selected_cats; - elseif ( $post_id ) - $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids'))); - else - $args['selected_cats'] = array(); + $args = array( 'taxonomy' => $taxonomy ); - if ( is_array( $popular_cats ) ) - $args['popular_cats'] = $popular_cats; - else - $args['popular_cats'] = get_terms( $taxonomy, array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) ); + $tax = get_taxonomy( $taxonomy ); + $args['disabled'] = ! current_user_can( $tax->cap->assign_terms ); + if ( is_array( $r['selected_cats'] ) ) { + $args['selected_cats'] = $r['selected_cats']; + } elseif ( $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( $r['popular_cats'] ) ) { + $args['popular_cats'] = $r['popular_cats']; + } else { + $args['popular_cats'] = get_terms( $taxonomy, array( + 'fields' => 'ids', + 'orderby' => 'count', + 'order' => 'DESC', + 'number' => 10, + 'hierarchical' => false + ) ); + } if ( $descendants_and_self ) { - $categories = (array) get_terms($taxonomy, array( 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0 ) ); + $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 = (array) get_terms($taxonomy, array('get' => 'all')); + $categories = (array) get_terms( $taxonomy, array( 'get' => 'all' ) ); } - if ( $checked_ontop ) { + if ( $r['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 ); @@ -296,38 +226,39 @@ function wp_terms_checklist($post_id = 0, $args = array()) { } // Put checked cats on top - echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args)); + 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)); + echo call_user_func_array( array( $walker, 'walk' ), array( $categories, 0, $args ) ); } /** - * {@internal Missing Short Description}} + * Retrieve a list of the most popular terms from the specified taxonomy. * - * @since unknown + * If the $echo argument is true then the elements for a list of checkbox + * elements labelled with the names of the selected terms is output. + * If the $post_ID global isn't empty then the terms associated with that + * post will be marked as checked. * - * @param unknown_type $taxonomy - * @param unknown_type $default - * @param unknown_type $number - * @param unknown_type $echo - * @return unknown + * @since 2.5.0 + * + * @param string $taxonomy Taxonomy to retrieve terms from. + * @param int $default Unused. + * @param int $number Number of terms to retrieve. Defaults to 10. + * @param bool $echo Optionally output the list as well. Defaults to true. + * @return array List of popular term IDs. */ function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) { - global $post_ID; + $post = get_post(); - if ( $post_ID ) - $checked_terms = wp_get_object_terms($post_ID, $taxonomy, array('fields'=>'ids')); + if ( $post && $post->ID ) + $checked_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields'=>'ids')); else $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) $terms as $term ) { @@ -340,8 +271,11 @@ function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $ech @@ -353,7 +287,7 @@ function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $ech /** * {@internal Missing Short Description}} * - * @since unknown + * @since 2.5.1 * * @param unknown_type $link_id */ @@ -376,1900 +310,167 @@ function wp_link_category_checklist( $link_id = 0 ) { foreach ( $categories as $category ) { $cat_id = $category->term_id; + + /** This filter is documented in wp-includes/category-template.php */ $name = esc_html( apply_filters( 'the_category', $category->name ) ); $checked = in_array( $cat_id, $checked_categories ) ? ' checked="checked"' : ''; echo '"; } } -// Tag stuff - -// Returns a single tag row (see tag_rows below) -// Note: this is also used in admin-ajax.php! -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $tag - * @param unknown_type $class - * @return unknown - */ -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 ); - $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"; - - $out = ''; - $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\""; - - $style = ''; - if ( in_array($column_name, $hidden) ) - $style = ' style="display:none;"'; - - $attributes = "$class$style"; - - switch ($column_name) { - case 'cb': - if ( current_user_can($tax->cap->delete_terms) && $tag->term_id != $default_term ) - $out .= ' '; - else - $out .= ' '; - break; - case 'name': - $out .= '' . $name . '
    '; - $actions = array(); - 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 .= '
    '; - foreach ( $actions as $action => $link ) { - ++$i; - ( $i == $action_count ) ? $sep = '' : $sep = ' | '; - $out .= "$link$sep"; - } - $out .= '
    '; - $out .= ''; - break; - case 'description': - $out .= "$tag->description"; - break; - case 'slug': - $out .= "" . apply_filters('editable_slug', $tag->slug) . ""; - break; - case 'posts': - $attributes = 'class="posts column-posts num"' . $style; - $out .= "$count"; - break; - default: - $out .= ""; - $out .= apply_filters("manage_${taxonomy}_custom_column", '', $column_name, $tag->term_id); - $out .= ""; - } - } - - $out .= "\n"; - - return $out; -} - -// Outputs appropriate rows for the Nth page of the Tag Management screen, -// assuming M tags displayed at a time on the page -// Returns the number of tags displayed -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $page - * @param unknown_type $pagesize - * @param unknown_type $searchterms - * @return unknown - */ -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 ) ) - $args['search'] = $searchterms; - - // convert it to table rows - $out = ''; - $count = 0; - 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. - } - - 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}} - * - * @since unknown - * - * @return unknown - */ -function wp_manage_posts_columns( $screen = '') { - if ( empty($screen) ) - $post_type = 'post'; - else - $post_type = $screen->post_type; - - $posts_columns = array(); - $posts_columns['cb'] = ''; - /* translators: manage posts column name */ - $posts_columns['title'] = _x('Title', 'column name'); - $posts_columns['author'] = __('Author'); - 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'); - - 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; -} - -// define the columns to display, the syntax is 'internal name' => 'display name' -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @return unknown - */ -function wp_manage_media_columns() { - $posts_columns = array(); - $posts_columns['cb'] = ''; - $posts_columns['icon'] = ''; - /* translators: column name */ - $posts_columns['media'] = _x('File', 'column name'); - $posts_columns['author'] = __('Author'); - //$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'); - /* translators: column name */ - $posts_columns['date'] = _x('Date', 'column name'); - $posts_columns = apply_filters('manage_media_columns', $posts_columns); - - return $posts_columns; -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @return unknown - */ -function wp_manage_pages_columns() { - return wp_manage_posts_columns(); -} - -/** - * Get the column headers for a screen - * - * @since 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($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[$screen->id]) ) - return $_wp_column_headers[$screen->id]; - - switch ($screen->base) { - case 'edit': - $_wp_column_headers[$screen->id] = wp_manage_posts_columns( $screen ); - break; - case 'edit-comments': - $_wp_column_headers[$screen->id] = array( - 'cb' => '', - 'author' => __('Author'), - /* translators: column name */ - 'comment' => _x('Comment', 'column name'), - //'date' => __('Submitted'), - 'response' => __('In Response To') - ); - - break; - case 'link-manager': - $_wp_column_headers[$screen->id] = array( - 'cb' => '', - 'name' => __('Name'), - 'url' => __('URL'), - 'categories' => __('Categories'), - 'rel' => __('Relationship'), - 'visible' => __('Visible'), - 'rating' => __('Rating') - ); - - break; - case 'upload': - $_wp_column_headers[$screen->id] = wp_manage_media_columns(); - break; - case 'categories': - $_wp_column_headers[$screen->id] = array( - 'cb' => '', - 'name' => __('Name'), - 'description' => __('Description'), - 'slug' => __('Slug'), - 'posts' => __('Posts') - ); - - break; - case 'edit-link-categories': - $_wp_column_headers[$screen->id] = array( - 'cb' => '', - 'name' => __('Name'), - 'description' => __('Description'), - 'slug' => __('Slug'), - 'links' => __('Links') - ); - - break; - case 'edit-tags': - $_wp_column_headers[$screen->id] = array( - 'cb' => '', - 'name' => __('Name'), - 'description' => __('Description'), - 'slug' => __('Slug'), - 'posts' => __('Posts') - ); - - break; - case 'users': - $_wp_column_headers[$screen->id] = array( - 'cb' => '', - 'username' => __('Username'), - 'name' => __('Name'), - 'email' => __('E-mail'), - 'role' => __('Role'), - 'posts' => __('Posts') - ); - break; - default : - $_wp_column_headers[$screen->id] = array(); - } - - $_wp_column_headers[$screen->id] = apply_filters('manage_' . $screen->id . '_columns', $_wp_column_headers[$screen->id]); - return $_wp_column_headers[$screen->id]; -} - +// adds hidden fields with the data for use in the inline editor for posts and pages /** * {@internal Missing Short Description}} * - * @since unknown - * - * @param unknown_type $screen - * @param unknown_type $id - */ -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(); - - foreach ( $columns as $column_key => $column_display_name ) { - $class = ' class="manage-column'; - - $class .= " column-$column_key"; - - if ( 'cb' == $column_key ) - $class .= ' check-column'; - elseif ( in_array($column_key, array('posts', 'comments', 'links')) ) - $class .= ' num'; - - $class .= '"'; - - $style = ''; - if ( in_array($column_key, $hidden) ) - $style = 'display:none;'; - - if ( isset($styles[$screen->id]) && isset($styles[$screen->id][$column_key]) ) - $style .= ' ' . $styles[$screen>id][$column_key]; - $style = ' style="' . $style . '"'; -?> - > -id] = $columns; -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $screen - */ -function get_hidden_columns($screen) { - if ( is_string($screen) ) - $screen = convert_to_screen($screen); - - return (array) get_user_option( 'manage' . $screen->id. 'columnshidden' ); -} - -/** - * {@internal Missing Short Description}} - * - * Outputs the quick edit and bulk edit table rows for posts and pages - * - * @since 2.7 - * - * @param string $screen + * @param unknown_type $post */ -function inline_edit_row( $screen ) { - global $mode; - - 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; +function get_inline_data($post) { + $post_type_object = get_post_type_object($post->post_type); + if ( ! current_user_can( 'edit_post', $post->ID ) ) + return; - if ( $taxonomy->hierarchical ) - $hierarchical_taxonomies[] = $taxonomy; - else - $flat_taxonomies[] = $taxonomy; - } + $title = esc_textarea( trim( $post->post_title ) ); - $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($post_type_object->cap->publish_posts); - $core_columns = array( 'cb' => true, 'date' => true, 'title' => true, 'categories' => true, 'tags' => true, 'comments' => true, 'author' => true ); + /** This filter is documented in wp-admin/edit-tag-form.php */ + echo ' +'; } /** * {@internal Missing Short Description}} * - * @since unknown + * @since 2.7.0 * * @param unknown_type $position * @param unknown_type $checkbox * @param unknown_type $mode */ function wp_comment_reply($position = '1', $checkbox = false, $mode = 'single', $table_row = true) { - // allow plugin to replace the popup content - $content = apply_filters( 'wp_comment_reply', '', array('position' => $position, 'checkbox' => $checkbox, 'mode' => $mode) ); + + /** + * Filter the in-line comment reply-to form output in the Comments + * list table. + * + * Returning a non-empty value here will short-circuit display + * of the in-line comment-reply form in the Comments list table, + * echoing the returned value instead. + * + * @since 2.7.0 + * + * @see wp_comment_reply() + * + * @param string $content The reply-to form content. + * @param array $args An array of default args. + */ + $content = apply_filters( 'wp_comment_reply', '', array( 'position' => $position, 'checkbox' => $checkbox, 'mode' => $mode ) ); if ( ! empty($content) ) { echo $content; return; } - $columns = get_column_headers('edit-comments'); - $hidden = array_intersect( array_keys( $columns ), array_filter( get_hidden_columns('edit-comments') ) ); - $col_count = count($columns) - count($hidden); + if ( $mode == 'single' ) { + $wp_list_table = _get_list_table('WP_Post_Comments_List_Table'); + } else { + $wp_list_table = _get_list_table('WP_Comments_List_Table'); + } ?>
    -'; + echo ''; if ( !empty($field['args']['label_for']) ) - echo ''; + echo ''; else echo ''; echo '
    ' . $field['title'] . ''; @@ -3108,6 +1306,8 @@ function do_settings_fields($page, $section) { * Additional calls to settings_errors() can be used to show errors even when the settings * page is first accessed. * + * @since 3.0.0 + * * @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 @@ -3118,16 +1318,12 @@ function do_settings_fields($page, $section) { 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( + $wp_settings_errors[] = array( 'setting' => $setting, - 'code' => $code, + 'code' => $code, 'message' => $message, - 'type' => $type + 'type' => $type ); - $wp_settings_errors[] = $new_error; } /** @@ -3136,7 +1332,7 @@ function add_settings_error( $setting, $code, $message, $type = '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 + * If changes were just submitted ($_GET['settings-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. * @@ -3144,40 +1340,46 @@ function add_settings_error( $setting, $code, $message, $type = 'error' ) { * 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) * + * @since 3.0.0 + * * @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 ) { +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 is true, manually re-run the sanitization 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; + sanitize_option( $setting, get_option( $setting ) ); + + // If settings were passed back from options.php then use them. + if ( isset( $_GET['settings-updated'] ) && $_GET['settings-updated'] && get_transient( 'settings_errors' ) ) { + $wp_settings_errors = array_merge( (array) $wp_settings_errors, get_transient( 'settings_errors' ) ); + delete_transient( 'settings_errors' ); } - // Filter the results to those of a specific setting if one was set + // Check global in case errors have been added on this pageload. + if ( ! count( $wp_settings_errors ) ) + return array(); + + // 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] ); + $setting_errors = array(); + foreach ( (array) $wp_settings_errors as $key => $details ) { + if ( $setting == $details['setting'] ) + $setting_errors[] = $wp_settings_errors[$key]; + } + return $setting_errors; } - return $settings_errors; + + return $wp_settings_errors; } /** @@ -3196,18 +1398,21 @@ function get_settings_errors( $setting = '', $sanitize = FALSE ) { * 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. * + * @since 3.0.0 + * * @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 ) { +function settings_errors( $setting = '', $sanitize = false, $hide_on_update = false ) { - if ($hide_on_update AND $_GET['updated']) return; + if ( $hide_on_update && ! empty( $_GET['settings-updated'] ) ) + return; $settings_errors = get_settings_errors( $setting, $sanitize ); - if ( !is_array($settings_errors) ) return; + if ( empty( $settings_errors ) ) + return; $output = ''; foreach ( $settings_errors as $key => $details ) { @@ -3223,185 +1428,53 @@ function settings_errors ( $setting = '', $sanitize = FALSE, $hide_on_update = F /** * {@internal Missing Short Description}} * - * @since unknown - * - * @param unknown_type $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 or they are special - if ( in_array( $column, $special ) ) - continue; - if ( empty( $title ) ) - continue; - - if ( 'comments' == $column ) - $title = __( 'Comments' ); - $id = "$column-hide"; - echo '\n"; - } -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown + * @since 2.7.0 * * @param unknown_type $found_action */ function find_posts_div($found_action = '') { ?> - \n"; +/** + * Display the post password. + * + * The password is passed through {@link esc_attr()} to ensure that it + * is safe for placing in an html attribute. + * + * @uses attr + * @since 2.7.0 + */ +function the_post_password() { + $post = get_post(); + if ( isset( $post->post_password ) ) + echo esc_attr( $post->post_password ); } /** @@ -3411,13 +1484,14 @@ function favorite_actions( $screen = null ) { * returned. * * @since 2.7.0 - * @param int $id The post id. If not supplied the global $post is used. * + * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global $post. + * @return string The post title if set. */ -function _draft_or_post_title($post_id = 0) { - $title = get_the_title($post_id); - if ( empty($title) ) - $title = __('(no title)'); +function _draft_or_post_title( $post = 0 ) { + $title = get_the_title( $post ); + if ( empty( $title ) ) + $title = __( '(no title)' ); return $title; } @@ -3432,7 +1506,7 @@ function _draft_or_post_title($post_id = 0) { * */ function _admin_search_query() { - echo isset($_GET['s']) ? esc_attr( stripslashes( $_GET['s'] ) ) : ''; + echo isset($_REQUEST['s']) ? esc_attr( wp_unslash( $_REQUEST['s'] ) ) : ''; } /** @@ -3444,33 +1518,63 @@ function _admin_search_query() { * */ function iframe_header( $title = '', $limit_styles = false ) { -global $hook_suffix; -?> - > - - + show_admin_bar( false ); + global $hook_suffix, $current_user, $admin_body_class, $wp_locale; + $admin_body_class = preg_replace('/[^a-z0-9_-]+/i', '-', $hook_suffix); + + $current_screen = get_current_screen(); + + @header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) ); + _wp_admin_html_begin(); +?> <?php bloginfo('name') ?> › <?php echo $title ?> — <?php _e('WordPress'); ?> - class="no-js "> + + class="wp-admin wp-core-ui no-js iframe "> @@ -3504,24 +1617,33 @@ function iframe_footer() { function _post_states($post) { $post_states = array(); - if ( isset($_GET['post_status']) ) - $post_status = $_GET['post_status']; + if ( isset( $_REQUEST['post_status'] ) ) + $post_status = $_REQUEST['post_status']; else $post_status = ''; if ( !empty($post->post_password) ) - $post_states[] = __('Password protected'); + $post_states['protected'] = __('Password protected'); if ( 'private' == $post->post_status && 'private' != $post_status ) - $post_states[] = __('Private'); + $post_states['private'] = __('Private'); if ( 'draft' == $post->post_status && 'draft' != $post_status ) - $post_states[] = __('Draft'); + $post_states['draft'] = __('Draft'); if ( 'pending' == $post->post_status && 'pending' != $post_status ) /* translators: post state */ - $post_states[] = _x('Pending', 'post state'); + $post_states['pending'] = _x('Pending', 'post state'); if ( is_sticky($post->ID) ) - $post_states[] = __('Sticky'); - - $post_states = apply_filters( 'display_post_states', $post_states ); + $post_states['sticky'] = __('Sticky'); + + /** + * Filter the default post display states used in the Posts list table. + * + * @since 2.8.0 + * + * @param array $post_states An array of post display states. Values include 'Password protected', + * 'Private', 'Draft', 'Pending', and 'Sticky'. + * @param int $post The post ID. + */ + $post_states = apply_filters( 'display_post_states', $post_states, $post ); if ( ! empty($post_states) ) { $state_count = count($post_states); @@ -3533,288 +1655,45 @@ function _post_states($post) { echo "$state$sep"; } } -} - -/** - * 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, $title; - - 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->id]) ) { - $screen->id = $meta_screens[$screen->id]; - $screen->base = $screen->id; - } - - $show_screen = false; - if ( !empty($wp_meta_boxes[$screen->id]) || !empty($column_screens) ) - $show_screen = true; - - $screen_options = screen_options($screen); - if ( $screen_options ) - $show_screen = true; - - if ( !isset($_wp_contextual_help) ) - $_wp_contextual_help = array(); - - $settings = apply_filters('screen_settings', '', $screen); - - switch ( $screen->id ) { - case 'widgets': - $settings = '

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

    \n"; - $show_screen = true; - break; - } - if( ! empty( $settings ) ) - $show_screen = true; -?> -
    - - - - - - - -
    -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.') . '

    -

    ' . __('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 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 ''; - } +function _media_states( $post ) { + $media_states = array(); + $stylesheet = get_option('stylesheet'); - $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'; + if ( current_theme_supports( 'custom-header') ) { + $meta_header = get_post_meta($post->ID, '_wp_attachment_is_custom_header', true ); + if ( ! empty( $meta_header ) && $meta_header == $stylesheet ) + $media_states[] = __( 'Header Image' ); } - $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 ( current_theme_supports( 'custom-background') ) { + $meta_background = get_post_meta($post->ID, '_wp_attachment_is_custom_background', true ); + if ( ! empty( $meta_background ) && $meta_background == $stylesheet ) + $media_states[] = __( 'Background Image' ); } - 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 ( !empty($screen->parent_base) ) - $name = $screen->parent_base; - else - $name = $screen->base; + /** + * Filter the default media display states for items in the Media list table. + * + * @since 3.2.0 + * + * @param array $media_states An array of media states. Default 'Header Image', + * 'Background Image'. + */ + $media_states = apply_filters( 'display_media_states', $media_states ); - if ( 'edit' == $name && isset($screen->post_type) && 'page' == $screen->post_type ) - $name = 'edit-pages'; + if ( ! empty( $media_states ) ) { + $state_count = count( $media_states ); + $i = 0; + echo ' - '; + foreach ( $media_states as $state ) { + ++$i; + ( $i == $state_count ) ? $sep = '' : $sep = ', '; + echo "$state$sep"; + } } - -?> -

    - $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 = ''; - } +function submit_button( $text = null, $type = 'primary', $name = 'submit', $wrap = true, $other_attributes = null ) { + echo get_submit_button( $text, $type, $name, $wrap, $other_attributes ); +} + +/** + * Returns a submit button, with provided text and appropriate class + * + * @since 3.1.0 + * + * @param string $text The text of the button (defaults to 'Save Changes') + * @param string $type The type of button. One of: primary, secondary, delete + * @param string $name The HTML name of the submit button. Defaults to "submit". If no id attribute + * is given in $other_attributes below, $name will be used as the button's id. + * @param bool $wrap True if the output button should be wrapped in a paragraph tag, + * false otherwise. Defaults to true + * @param array|string $other_attributes Other attributes that should be output with the button, + * mapping attributes to their values, such as array( 'tabindex' => '1' ). + * These attributes will be output as attribute="value", such as tabindex="1". + * Defaults to no other attributes. Other attributes can also be provided as a + * string such as 'tabindex="1"', though the array format is typically cleaner. + */ +function get_submit_button( $text = null, $type = 'primary large', $name = 'submit', $wrap = true, $other_attributes = null ) { + if ( ! is_array( $type ) ) + $type = explode( ' ', $type ); + + $button_shorthand = array( 'primary', 'small', 'large' ); + $classes = array( 'button' ); + foreach ( $type as $t ) { + if ( 'secondary' === $t || 'button-secondary' === $t ) + continue; + $classes[] = in_array( $t, $button_shorthand ) ? 'button-' . $t : $t; + } + $class = implode( ' ', array_unique( $classes ) ); + + if ( 'delete' === $type ) + $class = 'button-secondary delete'; + + $text = $text ? $text : __( 'Save Changes' ); + + // Default the id attribute to $name unless an id was specifically provided in $other_attributes + $id = $name; + if ( is_array( $other_attributes ) && isset( $other_attributes['id'] ) ) { + $id = $other_attributes['id']; + unset( $other_attributes['id'] ); + } + + $attributes = ''; + if ( is_array( $other_attributes ) ) { + foreach ( $other_attributes as $attribute => $value ) { + $attributes .= $attribute . '="' . esc_attr( $value ) . '" '; // Trailing space is important } - $current_screen = array('id' => $id, 'base' => $id); + } else if ( !empty( $other_attributes ) ) { // Attributes provided as a string + $attributes = $other_attributes; } - $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; + $button = ''; + + if ( $wrap ) { + $button = '

    ' . $button . '

    '; } - $current_screen = apply_filters('current_screen', $current_screen); + return $button; } +function _wp_admin_html_begin() { + global $is_IE; + + $admin_html_class = ( is_admin_bar_showing() ) ? 'wp-toolbar' : ''; + + if ( $is_IE ) + @header('X-UA-Compatible: IE=edge'); + +/** + * Fires inside the HTML tag in the admin header. + * + * @since 2.2.0 + */ ?> + + + + + > + + + + pointer_id ) + */ + + $registered_pointers = array( + 'post-new.php' => 'wp350_media', + 'post.php' => array( 'wp350_media', 'wp360_revisions' ), + 'edit.php' => 'wp360_locks', + 'widgets.php' => 'wp390_widgets', + 'themes.php' => 'wp390_widgets', + ); + + // Check if screen related pointer is registered + if ( empty( $registered_pointers[ $hook_suffix ] ) ) + return; + + $pointers = (array) $registered_pointers[ $hook_suffix ]; + + $caps_required = array( + 'wp350_media' => array( 'upload_files' ), + 'wp390_widgets' => array( 'edit_theme_options' ), + ); + + // Get dismissed pointers + $dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) ); + + $got_pointers = false; + foreach ( array_diff( $pointers, $dismissed ) as $pointer ) { + if ( isset( $caps_required[ $pointer ] ) ) { + foreach ( $caps_required[ $pointer ] as $cap ) { + if ( ! current_user_can( $cap ) ) + continue 2; + } + } + + // Bind pointer print function + add_action( 'admin_print_footer_scripts', array( 'WP_Internal_Pointers', 'pointer_' . $pointer ) ); + $got_pointers = true; + } + + if ( ! $got_pointers ) + return; + + // Add pointers script and style to queue + wp_enqueue_style( 'wp-pointer' ); + wp_enqueue_script( 'wp-pointer' ); + } + + /** + * Print the pointer javascript data. + * + * @since 3.3.0 + * + * @param string $pointer_id The pointer ID. + * @param string $selector The HTML elements, on which the pointer should be attached. + * @param array $args Arguments to be passed to the pointer JS (see wp-pointer.js). + */ + private static function print_js( $pointer_id, $selector, $args ) { + if ( empty( $pointer_id ) || empty( $selector ) || empty( $args ) || empty( $args['content'] ) ) + return; + + ?> + + ' . __( 'New Media Manager' ) . ''; + $content .= '

    ' . __( 'Uploading files and creating image galleries has a whole new look. Check it out!' ) . '

    '; + + self::print_js( 'wp350_media', '.insert-media', array( + 'content' => $content, + 'position' => array( 'edge' => is_rtl() ? 'right' : 'left', 'align' => 'center' ), + ) ); + } + + public static function pointer_wp360_revisions() { + $content = '

    ' . __( 'Compare Revisions' ) . '

    '; + $content .= '

    ' . __( 'View, compare, and restore other versions of this content on the improved revisions screen.' ) . '

    '; + + self::print_js( 'wp360_revisions', '.misc-pub-section.misc-pub-revisions', array( + 'content' => $content, + 'position' => array( 'edge' => is_rtl() ? 'left' : 'right', 'align' => 'center' ), + ) ); + } + + public static function pointer_wp360_locks() { + if ( ! is_multi_author() ) { + return; + } + + $content = '

    ' . __( 'Edit Lock' ) . '

    '; + $content .= '

    ' . __( 'Someone else is editing this. No need to refresh; the lock will disappear when they’re done.' ) . '

    '; + + self::print_js( 'wp360_locks', 'tr.wp-locked .locked-indicator', array( + 'content' => $content, + 'position' => array( 'edge' => 'left', 'align' => 'left' ), + ) ); + } + + public static function pointer_wp390_widgets() { + if ( ! current_theme_supports( 'widgets' ) ) { + return; + } + + $content = '

    ' . __( 'New Feature: Live Widget Previews' ) . '

    '; + $content .= '

    ' . __( 'Add, edit, and play around with your widgets from the theme customizer.' ) . ' ' . __( 'Preview your changes in real-time and only save them when you’re ready.' ) . '

    '; + + if ( 'themes' === get_current_screen()->id ) { + $selector = '.theme.active .customize'; + $position = array( 'edge' => is_rtl() ? 'right' : 'left', 'align' => 'center' ); + } else { + $selector = 'a[href="customize.php"]'; + if ( is_rtl() ) { + $position = array( 'edge' => 'right', 'align' => 'center', 'my' => 'right-5px' ); + } else { + $position = array( 'edge' => 'left', 'align' => 'center', 'my' => 'left-5px' ); + } + } + + self::print_js( 'wp390_widgets', $selector, array( + 'content' => $content, + 'position' => $position, + ) ); + } + + /** + * Prevents new users from seeing existing 'new feature' pointers. + * + * @since 3.3.0 + */ + public static function dismiss_pointers_for_new_users( $user_id ) { + add_user_meta( $user_id, 'dismissed_wp_pointers', 'wp350_media,wp360_revisions,wp360_locks,wp390_widgets' ); + } +} + +add_action( 'admin_enqueue_scripts', array( 'WP_Internal_Pointers', 'enqueue_scripts' ) ); +add_action( 'user_register', array( 'WP_Internal_Pointers', 'dismiss_pointers_for_new_users' ) ); + +/** + * Convert a screen string to a screen object + * + * @since 3.0.0 + * + * @param string $hook_name The hook name (also known as the hook suffix) used to determine the screen. + * @return WP_Screen Screen object. + */ +function convert_to_screen( $hook_name ) { + if ( ! class_exists( 'WP_Screen' ) ) { + _doing_it_wrong( 'convert_to_screen(), add_meta_box()', __( "Likely direct inclusion of wp-admin/includes/template.php in order to use add_meta_box(). This is very wrong. Hook the add_meta_box() call into the add_meta_boxes action instead." ), '3.3' ); + return (object) array( 'id' => '_invalid', 'base' => '_are_belong_to_us' ); + } + + return WP_Screen::get( $hook_name ); +} + +/** + * Output the HTML for restoring the post data from DOM storage + * + * @since 3.6.0 + * @access private + */ +function _local_storage_notice() { + ?> + + 0, + 'type' => 'rating', + 'number' => 0, + ); + $r = wp_parse_args( $args, $defaults ); + + // Non-english decimal places when the $rating is coming from a string + $rating = str_replace( ',', '.', $r['rating'] ); + + // Convert Percentage to star rating, 0..5 in .5 increments + if ( 'percent' == $r['type'] ) { + $rating = round( $rating / 10, 0 ) / 2; + } + + // Calculate the number of each type of star needed + $full_stars = floor( $rating ); + $half_stars = ceil( $rating - $full_stars ); + $empty_stars = 5 - $full_stars - $half_stars; + + if ( $r['number'] ) { + /* translators: 1: The rating, 2: The number of ratings */ + $format = _n( '%1$s rating based on %2$s rating', '%1$s rating based on %2$s ratings', $r['number'] ); + $title = sprintf( $format, number_format_i18n( $rating, 1 ), number_format_i18n( $r['number'] ) ); + } else { + /* translators: 1: The rating */ + $title = sprintf( __( '%s rating' ), number_format_i18n( $rating, 1 ) ); + } + + echo '
    '; + echo '' . $title . ''; + echo str_repeat( '
    ', $full_stars ); + echo str_repeat( '
    ', $half_stars ); + echo str_repeat( '
    ', $empty_stars); + echo '
    '; +}