X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/9b5673a7aae863ab45c3b73460060352c5b3810b..5d244c8fd9a27c9f89dd08da2af6fbc67d4fce63:/wp-admin/includes/template.php diff --git a/wp-admin/includes/template.php b/wp-admin/includes/template.php index fd7e76f9..1087837c 100644 --- a/wp-admin/includes/template.php +++ b/wp-admin/includes/template.php @@ -8,241 +8,151 @@ * @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 input elements. * - * @since unknown + * @since 2.5.1 + * + * @see Walker + * @see wp_category_checklist() + * @see wp_terms_checklist() */ 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 input elements labelled + * with category names. + * + * @since 2.5.1 * - * @since unknown + * @todo Properly document optional arguments as such. * - * @param unknown_type $post_id - * @param unknown_type $descendants_and_self - * @param unknown_type $selected_cats - * @param unknown_type $popular_cats + * @see wp_terms_checklist() + * + * @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 input elements labelled with term names. * - * @param int $post_id - * @param array $args + * Taxonomy independent version of {@see wp_category_checklist()}. + * + * @since 3.0.0 + * + * @todo Properly document optional default arguments. + * + * @param int $post_id Post ID. + * @param array $args Arguments to form the terms checklist. */ -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 +161,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 +233,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. + * + * 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. * - * @since unknown + * @since 2.5.0 * - * @param unknown_type $taxonomy - * @param unknown_type $default - * @param unknown_type $number - * @param unknown_type $echo - * @return unknown + * @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 +278,11 @@ function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $ech @@ -353,9 +294,9 @@ 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 + * @param int $link_id */ function wp_link_category_checklist( $link_id = 0 ) { $default = 1; @@ -376,1900 +317,168 @@ 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 WP_Post $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; - - if ( $taxonomy->hierarchical ) - $hierarchical_taxonomies[] = $taxonomy; - else - $flat_taxonomies[] = $taxonomy; - } - - $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 ); - -?> - -
    - - - 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"> - -
    - -
    -

    - +function get_inline_data($post) { + $post_type_object = get_post_type_object($post->post_type); + if ( ! current_user_can( 'edit_post', $post->ID ) ) + return; -post_title ) ); -if ( post_type_supports( $screen->post_type, 'title' ) ) : - if ( $bulk ) : ?> -
    -
    -
    + /** This filter is documented in wp-admin/edit-tag-form.php */ + echo ' +
    - - - -
    - - - - 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 ) ) : ?> - - - - - - - - - - - - - -
    - -
    - - $column_display_name ) { - if ( isset( $core_columns[$column_name] ) ) - continue; - do_action( $bulk ? 'bulk_edit_custom_box' : 'quick_edit_custom_box', $column_name, $screen->post_type ); - } -?> -

    - - - - - - - - - -
    -

    -
    -post_type); - if ( ! current_user_can($post_type_object->cap->edit_post, $post->ID) ) - return; - - $title = htmlspecialchars( trim( $post->post_title ), ENT_QUOTES ); - - echo ' -'; -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $posts - */ -function post_rows( $posts = array() ) { - global $wp_query, $post, $mode; - - add_filter('the_title','esc_html'); - - // Create array of post IDs. - $post_ids = array(); - - if ( empty($posts) ) - $posts = &$wp_query->posts; - - foreach ( $posts as $a_post ) - $post_ids[] = $a_post->ID; - - $comment_pending_count = get_pending_comments_num($post_ids); - - foreach ( $posts as $post ) { - if ( empty($comment_pending_count[$post->ID]) ) - $comment_pending_count[$post->ID] = 0; - - _post_row($post, $comment_pending_count[$post->ID], $mode); - } -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $a_post - * @param unknown_type $pending_comments - * @param unknown_type $mode - */ -function _post_row($a_post, $pending_comments, $mode) { - global $post, $current_screen; - static $rowclass; - - $global_post = $post; - $post = $a_post; - setup_postdata($post); - - $rowclass = 'alternate' == $rowclass ? '' : 'alternate'; - $post_owner = ( get_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\""; - - $style = ''; - if ( in_array($column_name, $hidden) ) - $style = ' style="display:none;"'; - - $attributes = "$class$style"; - - switch ($column_name) { - - case 'cb': - ?> - cap->edit_post, $post->ID ) ) { ?> - 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; - $time = get_post_time('G', true, $post); - - $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 ''; - if ( 'excerpt' == $mode ) - echo apply_filters('post_date_column_time', $t_time, $post, $column_name, $mode); - else - echo '' . apply_filters('post_date_column_time', $h_time, $post, $column_name, $mode) . ''; - echo '
    '; - if ( 'publish' == $post->post_status ) { - _e('Published'); - } elseif ( 'future' == $post->post_status ) { - if ( $time_diff > 0 ) - echo '' . __('Missed schedule') . ''; - else - _e('Scheduled'); - } else { - _e('Last Modified'); - } - echo ''; - break; - - case 'title': - $attributes = 'class="post-title column-title"' . $style; - ?> - >cap->edit_post, $post->ID) && $post->post_status != 'trash' ) { ?> - 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($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 '
    '; - foreach ( $actions as $action => $link ) { - ++$i; - ( $i == $action_count ) ? $sep = '' : $sep = ' | '; - echo "$link$sep"; - } - echo '
    '; - - get_inline_data($post); - ?> - - - >post_type}&category_name={$c->slug}'> " . esc_html(sanitize_term_field('name', $c->name, $c->term_id, 'category', 'display')) . ""; - echo join( ', ', $out ); - } else { - _e('Uncategorized'); - } - ?> - - >ID); - if ( !empty( $tags ) ) { - $out = array(); - foreach ( $tags as $c ) - $out[] = " " . esc_html(sanitize_term_field('name', $c->name, $c->term_id, 'post_tag', 'display')) . ""; - echo join( ', ', $out ); - } else { - _e('No Tags'); - } - ?> - - >
    - '; - 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 ''; - ?> -
    - - > - - - - cap->edit_post, $post->ID) ) { echo "" . __('Edit') . ""; } ?> - - cap->delete_post, $post->ID) ) { echo "ID) . "' class='delete'>" . __('Delete') . ""; } ?> - - >ID); ?> - - -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( $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 ) { - $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': - ?> - cap->edit_post, $page->ID ) ) { ?> - 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); - - $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 ''; - echo '' . apply_filters('post_date_column_time', $h_time, $page, $column_name, '') . ''; - echo '
    '; - if ( 'publish' == $page->post_status ) { - _e('Published'); - } elseif ( 'future' == $page->post_status ) { - if ( $time_diff > 0 ) - echo '' . __('Missed schedule') . ''; - else - _e('Scheduled'); - } else { - _e('Last Modified'); - } - echo ''; - break; - case 'title': - $attributes = 'class="post-title page-title column-title"' . $style; - $edit_link = get_edit_post_link( $page->ID ); - ?> - >cap->edit_post, $page->ID) && $post->post_status != 'trash' ) { ?>labels->parent_item_colon . ' ' . esc_html($parent_name) : ''; ?> - cap->edit_post, $page->ID) && $post->post_status != 'trash' ) { - $actions['edit'] = '' . __('Edit') . ''; - $actions['inline'] = '' . __('Quick Edit') . ''; - } - 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($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; - echo '
    '; - foreach ( $actions as $action => $link ) { - ++$i; - ( $i == $action_count ) ? $sep = '' : $sep = ' | '; - echo "$link$sep"; - } - echo '
    '; - - get_inline_data($post); - echo ''; - break; - - case 'comments': - ?> - >
    - ID ); - $pending_phrase = sprintf( __('%s pending'), number_format( $left ) ); - if ( $left ) - echo ''; - 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 ''; - ?> -
    - - > - - > - - - - - 'menu_order') ); - - if ( ! $pages ) - return false; - } - - /* - * arrange pages into two parts: top level pages and children_pages - * children_pages is two dimensional array, eg. - * children_pages[10][] contains all sub-pages whose parent is 10. - * It only takes O(N) to arrange this and it takes O(1) for subsequent lookup operations - * If searching, ignore hierarchy and treat everything as top level - */ - if ( empty($_GET['s']) ) { - - $top_level_pages = array(); - $children_pages = array(); - - foreach ( $pages as $page ) { - - // catch and repair bad pages - if ( $page->post_parent == $page->ID ) { - $page->post_parent = 0; - $wpdb->update($wpdb->posts, array('post_parent' => 0), array('ID' => $page->ID)); - clean_page_cache( $page->ID ); - } - - if ( 0 == $page->post_parent ) - $top_level_pages[] = $page; - else - $children_pages[ $page->post_parent ][] = $page; - } - - $pages = &$top_level_pages; - } - - $count = 0; - $start = ($pagenum - 1) * $per_page; - $end = $start + $per_page; - - foreach ( $pages as $page ) { - if ( $count >= $end ) - break; - - if ( $count >= $start ) - echo "\t" . display_page_row( $page, $level ); - - $count++; - - if ( isset($children_pages) ) - _page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page ); - } - - // if it is the last pagenum and there are orphaned pages, display them with paging as well - if ( isset($children_pages) && $count < $end ){ - foreach( $children_pages as $orphans ){ - foreach ( $orphans as $op ) { - if ( $count >= $end ) - break; - if ( $count >= $start ) - echo "\t" . display_page_row( $op, 0 ); - $count++; - } - } - } -} - -/** - * Given a top level page ID, display the nested hierarchy of sub-pages - * together with paging support - * - * @since unknown - * - * @param unknown_type $children_pages - * @param unknown_type $count - * @param unknown_type $parent - * @param unknown_type $level - * @param unknown_type $pagenum - * @param unknown_type $per_page - */ -function _page_rows( &$children_pages, &$count, $parent, $level, $pagenum, $per_page ) { - - if ( ! isset( $children_pages[$parent] ) ) - return; - - $start = ($pagenum - 1) * $per_page; - $end = $start + $per_page; - - foreach ( $children_pages[$parent] as $page ) { - - if ( $count >= $end ) - break; - - // If the page starts in a subtree, print the parents. - if ( $count == $start && $page->post_parent > 0 ) { - $my_parents = array(); - $my_parent = $page->post_parent; - while ( $my_parent) { - $my_parent = get_post($my_parent); - $my_parents[] = $my_parent; - if ( !$my_parent->post_parent ) - break; - $my_parent = $my_parent->post_parent; - } - $num_parents = count($my_parents); - while( $my_parent = array_pop($my_parents) ) { - echo "\t" . display_page_row( $my_parent, $level - $num_parents ); - $num_parents--; - } - } - - if ( $count >= $start ) - echo "\t" . display_page_row( $page, $level ); - - $count++; - - _page_rows( $children_pages, $count, $page->ID, $level + 1, $pagenum, $per_page ); - } - - unset( $children_pages[$parent] ); //required in order to keep track of orphans -} - -/** - * Generate HTML for a single row on the users.php admin panel. - * - * @since 2.1.0 - * - * @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 = '', $numposts = 0 ) { - global $wp_roles; - - 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 ); - $short_url = str_replace( 'www.', '', $short_url ); - if ('/' == substr( $short_url, -1 )) - $short_url = substr( $short_url, 0, -1 ); - if ( strlen( $short_url ) > 35 ) - $short_url = substr( $short_url, 0, 32 ).'...'; - $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 ( get_current_user_id() == $user_object->ID) { - $edit_link = 'profile.php'; - } else { - $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(); - - 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() && get_current_user_id() != $user_object->ID && current_user_can('delete_user', $user_object->ID) ) - $actions['delete'] = "" . __('Delete') . ""; - if ( is_multisite() && get_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 .= '
    '; - foreach ( $actions as $action => $link ) { - ++$i; - ( $i == $action_count ) ? $sep = '' : $sep = ' | '; - $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_user_role($wp_roles->role_names[$role] ) : __('None'); - $r = ""; - $columns = get_column_headers('users'); - $hidden = get_hidden_columns('users'); - $avatar = get_avatar( $user_object->ID, 32 ); - 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': - $r .= "$checkbox"; - break; - case 'username': - $r .= "$avatar $edit"; - break; - case 'name': - $r .= "$user_object->first_name $user_object->last_name"; - break; - case 'email': - $r .= "$email"; - break; - case 'role': - $r .= "$role_name"; - break; - case 'posts': - $attributes = 'class="posts column-posts num"' . $style; - $r .= ""; - if ( $numposts > 0 ) { - $r .= ""; - $r .= $numposts; - $r .= ''; - } else { - $r .= 0; - } - $r .= ""; - break; - default: - $r .= ""; - $r .= apply_filters('manage_users_custom_column', '', $column_name, $user_object->ID); - $r .= ""; - } - } - $r .= ''; - - return $r; -} - -/** - * {@internal Missing Short Description}} - * - * @since 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; - - $start = abs( (int) $start ); - $num = (int) $num; - $post = (int) $post; - $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 ) { - $total = ''; - $post = " AND c.comment_post_ID = '$post'"; - } else { - $post = ''; - } - - $orderby = "ORDER BY c.comment_date_gmt DESC LIMIT $start, $num"; - - if ( 'comment' == $type ) - $typesql = "AND c.comment_type = ''"; - elseif ( 'pings' == $type ) - $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); - $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"; - } else { - $query .= "AND $approved $post $typesql"; - } - - $comments = $wpdb->get_results("SELECT * $query $orderby"); - if ( '' === $total ) - $total = $wpdb->get_var("SELECT COUNT(c.comment_ID) $query"); - - update_comment_cache($comments); - - return array($comments, $total); -} - -/** - * {@internal Missing Short Description}} - * - * @since unknown - * - * @param unknown_type $comment_id - * @param unknown_type $mode - * @param unknown_type $comment_status - * @param unknown_type $checkbox - */ -function _wp_comment_row( $comment_id, $mode, $comment_status, $checkbox = true, $from_ajax = false ) { - global $comment, $post, $_comment_pending_count; - $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 = preg_replace('|http://(www\.)?|i', '', $author_url); - if ( strlen($author_url_display) > 50 ) - $author_url_display = substr($author_url_display, 0, 49) . '...'; - - $ptime = date('G', strtotime( $comment->comment_date ) ); - if ( ( abs(time() - $ptime) ) < 86400 ) - $ptime = sprintf( __('%s ago'), human_time_diff( $ptime ) ); - else - $ptime = mysql2date(__('Y/m/d \a\t g:i A'), $comment->comment_date ); - - 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'); - $hidden = get_hidden_columns('edit-comments'); - foreach ( $columns as $column_name => $column_display_name ) { - $class = "class=\"$column_name column-$column_name\""; + echo '
    ' . esc_html( get_post_meta( $post->ID, '_wp_page_template', true ) ) . '
    '; - $style = ''; - if ( in_array($column_name, $hidden) ) - $style = ' style="display:none;"'; - - $attributes = "$class$style"; - - switch ($column_name) { - case 'cb': - if ( !$checkbox ) break; - echo ''; - if ( $user_can ) echo ""; - echo ''; - break; - case 'comment': - echo ""; - echo '
    '; - /* 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 ); - } + if ( post_type_supports( $post->post_type, 'page-attributes' ) ) + echo ''; - echo '
    '; - comment_text(); - if ( $user_can ) { ?> - - post_type ); + foreach ( $taxonomy_names as $taxonomy_name) { + $taxonomy = get_taxonomy( $taxonomy_name ); - 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 ( $taxonomy->hierarchical && $taxonomy->show_ui ) { - 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' ) . ''; - } + $terms = get_object_term_cache( $post->ID, $taxonomy_name ); + if ( false === $terms ) { + $terms = wp_get_object_terms( $post->ID, $taxonomy_name ); + wp_cache_add( $post->ID, $terms, $taxonomy_name . '_relationships' ); + } + $term_ids = empty( $terms ) ? array() : wp_list_pluck( $terms, 'term_id' ); - if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) { - $actions['delete'] = "" . __('Delete Permanently') . ''; - } else { - $actions['trash'] = "" . _x('Trash', 'verb') . ''; - } + echo '
    ' . implode( ',', $term_ids ) . '
    '; - if ( 'trash' != $the_comment_status ) { - $actions['edit'] = "". __('Edit') . ''; - $actions['quickedit'] = '' . __('Quick Edit') . ''; - if ( 'spam' != $the_comment_status ) - $actions['reply'] = '' . __('Reply') . ''; - } + } elseif ( $taxonomy->show_ui ) { - $actions = apply_filters( 'comment_row_actions', array_filter($actions), $comment ); - - $i = 0; - echo '
    '; - foreach ( $actions as $action => $link ) { - ++$i; - ( ( ('approve' == $action || 'unapprove' == $action) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | '; - - // 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"; - } - echo '
    '; - } + echo '
    ' + . esc_html( str_replace( ',', ', ', get_terms_to_edit( $post->ID, $taxonomy_name ) ) ) . '
    '; - echo ''; - break; - case 'author': - echo ""; comment_author(); echo '
    '; - if ( !empty($author_url) ) - echo "$author_url_display
    "; - if ( $user_can ) { - if ( !empty($comment->comment_author_email) ) { - comment_author_email_link(); - echo '
    '; - } - echo ''; - comment_author_IP(); - echo ''; - } //current_user_can - echo ''; - break; - case 'date': - echo "" . get_comment_date(__('Y/m/d \a\t g:ia')) . ''; - break; - case 'response': - if ( 'single' !== $mode ) { - if ( isset( $_comment_pending_count[$post->ID] ) ) { - $pending_comments = $_comment_pending_count[$post->ID]; - } else { - $_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 ( $user_can ) { - $post_link = ""; - $post_link .= get_the_title($post->ID) . ''; - } else { - $post_link = get_the_title($post->ID); - } - echo "\n"; - echo ''; - if ( 'attachment' == $post->post_type && ( $thumb = wp_get_attachment_image( $post->ID, array(80, 60), true ) ) ) - echo $thumb; - echo ''; - } - break; - default: - echo "\n"; - do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID ); - echo "\n"; - break; } } - echo "\n"; + + if ( !$post_type_object->hierarchical ) + echo '
    ' . (is_sticky($post->ID) ? 'sticky' : '') . '
    '; + + if ( post_type_supports( $post->post_type, 'post-formats' ) ) + echo '
    ' . esc_html( get_post_format( $post->ID ) ) . '
    '; + + echo ''; } /** * {@internal Missing Short Description}} * - * @since unknown + * @since 2.7.0 * - * @param unknown_type $position - * @param unknown_type $checkbox - * @param unknown_type $mode + * @param int $position + * @param bool $checkbox + * @param string $mode + * @param bool $table_row */ 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,26 +1313,27 @@ 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 + * + * @todo Properly document optional arguments as such. + * * @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'. + * @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 `

    ` tags). + * @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( + $wp_settings_errors[] = array( 'setting' => $setting, - 'code' => $code, + 'code' => $code, 'message' => $message, - 'type' => $type + 'type' => $type ); - $wp_settings_errors[] = $new_error; } /** @@ -3136,7 +1342,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,70 +1350,83 @@ 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; } /** - * Display settings errors registered by add_settings_error() + * Display settings errors registered by {@see add_settings_error()}. * - * Part of the Settings API. Outputs a

    for each error retrieved by get_settings_errors(). + * Part of the Settings API. Outputs a div for each error retrieved by + * {@see 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() + * 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 {@see register_setting()} * - * The $sanitize option is passed into get_settings_errors() and will re-run the setting sanitization + * The $sanitize option is passed into {@see 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. + * 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. + * + * @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 +1442,52 @@ 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 + * @param string $found_action */ function find_posts_div($found_action = '') { ?> - + $label) { - echo "\n"; - } - echo "
    \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. + * + * @since 2.7.0 + */ +function the_post_password() { + $post = get_post(); + if ( isset( $post->post_password ) ) + echo esc_attr( $post->post_password ); } /** @@ -3411,14 +1497,15 @@ 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)'); - return $title; +function _draft_or_post_title( $post = 0 ) { + $title = get_the_title( $post ); + if ( empty( $title ) ) + $title = __( '(no title)' ); + return esc_html( $title ); } /** @@ -3427,12 +1514,11 @@ 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 attr * @since 2.7.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 +1530,66 @@ 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 +1632,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 +1670,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'); + ?> + + + + > + + + + pointer_id ) + */ + + $registered_pointers = array( + 'post-new.php' => 'wp410_dfw', + 'post.php' => 'wp410_dfw', + '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( + '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; + + ?> + + ' . __( '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 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, + ) ); + } + + public static function pointer_wp410_dfw() { + // Don't show when editor-scrolling is not used. + if ( empty( $GLOBALS['_wp_editor_expand'] ) ) { + return; + } + + $content = '

    ' . __( 'Distraction-Free Writing' ) . '

    '; + $content .= '

    ' . __( 'Enable distraction-free writing mode, and everything surrounding the editor will fade away when you start typing. Move your mouse out of the editor to reveal everything again.' ) . '

    '; + + if ( is_rtl() ) { + $position = array( 'edge' => 'left', 'align' => 'center', 'my' => 'left+40 top-11', 'at' => 'left top' ); + } else { + $position = array( 'edge' => 'right', 'align' => 'center', 'my' => 'right-40 top-11', 'at' => 'right top' ); + } + + self::print_js( 'wp410_dfw', '#wp-content-wrap', 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', '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 '
    '; +}