WordPress.org

Make WordPress Core

Ticket #12706: 12706.diff

File 12706.diff, 77.5 KB (added by benbalter, 2 years ago)

Updated patch to run with trunk, few bug fixes here and there

  • .

  • wp-comments-post.php

    Property changes on: .
    ___________________________________________________________________
    Added: svn:ignore
    ## -0,0 +1 ##
    +wp-content/plugins/
     
    3737} elseif ( 'trash' == $status ) { 
    3838        do_action('comment_on_trash', $comment_post_ID); 
    3939        exit; 
    40 } elseif ( !$status_obj->public && !$status_obj->private ) { 
     40} elseif ( empty($status_obj->public) && empty($status_obj->private) ) { 
    4141        do_action('comment_on_draft', $comment_post_ID); 
    4242        exit; 
    4343} elseif ( post_password_required($comment_post_ID) ) { 
  • wp-includes/post-template.php

     
    107107        $id = isset($post->ID) ? $post->ID : (int) $id; 
    108108 
    109109        if ( !is_admin() ) { 
    110                 if ( !empty($post->post_password) ) { 
    111                         $protected_title_format = apply_filters('protected_title_format', __('Protected: %s')); 
     110                if ( ! empty($post->post_password) ) { 
     111                        $protected_title_format = apply_filters( 'protected_title_format', __( 'Protected: %s' ) ); 
    112112                        $title = sprintf($protected_title_format, $title); 
    113                 } else if ( isset($post->post_status) && 'private' == $post->post_status ) { 
    114                         $private_title_format = apply_filters('private_title_format', __('Private: %s')); 
    115                         $title = sprintf($private_title_format, $title); 
     113                } elseif ( isset($post->post_status) ) { 
     114                        $post_status_obj = get_post_status_object( $post->post_status ); 
     115                        if ( $post_status_obj && $post_status_obj->private ) { 
     116                                if ( 'private' == $post->post_status ) { 
     117                                        $format_string = __( 'Private: %s' );  // preserve existing translation string 
     118                                        $private_title_format = apply_filters( 'private_title_format', $format_string ); 
     119                                        $title = sprintf( $private_title_format, $title ); 
     120                                } else { 
     121                                        $format_string = _x( '%1$s: %2$s', 'post status: title' );       
     122                                        $private_title_format = apply_filters( 'post_title_format', $format_string, $_status ); 
     123                                        $title = sprintf( $private_title_format, $post_status_obj->labels->name, $title ); 
     124                                } 
     125                        } 
    116126                } 
    117127        } 
    118128        return apply_filters( 'the_title', $title, $id ); 
     
    700710        if ( 1 == $i ) { 
    701711                $url = get_permalink(); 
    702712        } else { 
    703                 if ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) ) 
     713                if ( '' == get_option('permalink_structure') || in_array( $post->post_status, array('draft', 'auto-draft', 'pending') ) || ! empty( $GLOBALS['wp_post_statuses'][$post->post_status]->moderation ) ) 
    704714                        $url = add_query_arg( 'page', $i, get_permalink() ); 
    705715                elseif ( 'page' == get_option('show_on_front') && get_option('page_on_front') == $post->ID ) 
    706716                        $url = trailingslashit(get_permalink()) . user_trailingslashit("$wp_rewrite->pagination_base/" . $i, 'single_paged'); 
  • wp-includes/taxonomy.php

     
    132132 
    133133        $field = ('names' == $output) ? 'name' : false; 
    134134 
     135        if ( isset( $args['object_type'] ) ) 
     136                $args['object_type'] = (array) $args['object_type']; 
     137 
    135138        return wp_filter_object_list($wp_taxonomies, $args, $operator, $field); 
    136139} 
    137140 
     
    28392842        // Get the object and term ids and stick them in a lookup table 
    28402843        $tax_obj = get_taxonomy($taxonomy); 
    28412844        $object_types = esc_sql($tax_obj->object_type); 
    2842         $results = $wpdb->get_results("SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (" . implode(',', array_keys($term_ids)) . ") AND post_type IN ('" . implode("', '", $object_types) . "') AND post_status = 'publish'"); 
     2845         
     2846        $public_stati = apply_filters( 'term_count_stati', get_post_stati( array( 'public' => true, 'object_type' => $tax_obj->object_type ) ) ); 
     2847        $public_csv = implode( "', '", $public_stati ); 
     2848 
     2849        $results = $wpdb->get_results("SELECT object_id, term_taxonomy_id FROM $wpdb->term_relationships INNER JOIN $wpdb->posts ON object_id = ID WHERE term_taxonomy_id IN (" . implode(',', array_keys($term_ids)) . ") AND post_type IN ('" . implode("', '", $object_types) . "') AND post_status IN ('$public_csv')"); 
    28432850        foreach ( $results as $row ) { 
    28442851                $id = $term_ids[$row->term_taxonomy_id]; 
    28452852                $term_items[$id][$row->object_id] = isset($term_items[$id][$row->object_id]) ? ++$term_items[$id][$row->object_id] : 1; 
     
    29002907        if ( $object_types ) 
    29012908                $object_types = esc_sql( array_filter( $object_types, 'post_type_exists' ) ); 
    29022909 
     2910        $public_stati = apply_filters( 'term_count_stati', get_post_stati( array( 'public' => true, 'object_type' => $taxonomy->object_type ) ) ); 
     2911        $public_csv = implode( "', '", $public_stati ); 
     2912         
    29032913        foreach ( (array) $terms as $term ) { 
     2914 
    29042915                $count = 0; 
    29052916 
    29062917                // Attachments can be 'inherit' status, we need to base count off the parent's status if so 
    29072918                if ( $check_attachments ) 
    2908                         $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status = 'publish' OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) = 'publish' ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d", $term ) ); 
     2919                        $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts p1 WHERE p1.ID = $wpdb->term_relationships.object_id AND ( post_status IN ('$public_csv') OR ( post_status = 'inherit' AND post_parent > 0 AND ( SELECT post_status FROM $wpdb->posts WHERE ID = p1.post_parent ) IN ('$public_csv') ) ) AND post_type = 'attachment' AND term_taxonomy_id = %d", $term ) ); 
    29092920 
    29102921                if ( $object_types ) 
    2911                         $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type IN ('" . implode("', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) ); 
     2922                        $count += (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status IN ('$public_csv') AND post_type IN ('" . implode("', '", $object_types ) . "') AND term_taxonomy_id = %d", $term ) ); 
    29122923 
    29132924                do_action( 'edit_term_taxonomy', $term, $taxonomy ); 
    29142925                $wpdb->update( $wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ) ); 
  • wp-includes/default-widgets.php

     
    562562                if ( empty( $instance['number'] ) || ! $number = absint( $instance['number'] ) ) 
    563563                        $number = 10; 
    564564 
     565                $public_stati = apply_filters( 'recent_posts_stati', get_post_stati( array( 'public' => true ) ) ); 
     566                $status_arg = implode( ',', $public_stati ); 
     567 
    565568                $r = new WP_Query( apply_filters( 'widget_posts_args', array( 'posts_per_page' => $number, 'no_found_rows' => true, 'post_status' => 'publish', 'ignore_sticky_posts' => true ) ) ); 
    566569                if ($r->have_posts()) : 
    567570?> 
  • wp-includes/link-template.php

     
    114114 
    115115        $permalink = apply_filters('pre_post_link', $permalink, $post, $leavename); 
    116116 
    117         if ( '' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) { 
     117        if ( '' != $permalink && ! in_array( $post->post_status, array('draft', 'auto-draft', 'pending') ) && empty( $GLOBALS['wp_post_statuses'][$post->post_status]->moderation ) ) { 
    118118                $unixtime = strtotime($post->post_date); 
    119119 
    120120                $category = ''; 
     
    185185 
    186186        $slug = $post->post_name; 
    187187 
    188         $draft_or_pending = isset($post->post_status) && in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft' ) ); 
     188        $draft_or_pending = isset($post->post_status) && in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft' ) ) || ! empty( $GLOBALS['wp_post_statuses'][$post->post_status]->moderation ); 
    189189 
    190190        $post_type = get_post_type_object($post->post_type); 
    191191 
     
    275275 
    276276        $link = $wp_rewrite->get_page_permastruct(); 
    277277 
    278         if ( !empty($link) && ( ( isset($post->post_status) && !$draft_or_pending ) || $sample ) ) { 
     278        if ( !empty($link) && ( ( isset($post->post_status) && !$draft_or_pending ) && empty( $GLOBALS['wp_post_statuses'][$post->post_status]->moderation ) ) || $sample ) { 
    279279                if ( ! $leavename ) { 
    280280                        $link = str_replace('%pagename%', get_page_uri($id), $link); 
    281281                } 
  • wp-includes/nav-menu.php

     
    482482        if ( empty( $items ) ) 
    483483                return $items; 
    484484 
     485        $public_stati = apply_filters( 'nav_menu_stati', get_post_stati( array( 'public' => true ) ), $menu ); 
     486        $public_csv = implode( ',', $public_stati ); 
     487 
    485488        $defaults = array( 'order' => 'ASC', 'orderby' => 'menu_order', 'post_type' => 'nav_menu_item', 
    486                 'post_status' => 'publish', 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true, 
     489                'post_status' => $public_csv, 'output' => ARRAY_A, 'output_key' => 'menu_order', 'nopaging' => true, 
    487490                'update_post_term_cache' => false ); 
    488491        $args = wp_parse_args( $args, $defaults ); 
    489492        if ( count( $items ) > 1 ) 
  • wp-includes/post.php

     
    9595        ) ); 
    9696 
    9797        register_post_status( 'publish', array( 
    98                 'label'       => _x( 'Published', 'post' ), 
     98                'labels'          => array(  
     99                        'name'    => _x( 'Published', 'post' ), 
     100                        'publish' => esc_attr__('Publish'), 
     101                        'count' => _n_noop( 'Published <span class="count">(%s)</span>', 'Published <span class="count">(%s)</span>' ), 
     102                ), 
    99103                'public'      => true, 
    100104                '_builtin'    => true, /* internal use only. */ 
    101                 'label_count' => _n_noop( 'Published <span class="count">(%s)</span>', 'Published <span class="count">(%s)</span>' ), 
    102105        ) ); 
    103106 
    104107        register_post_status( 'future', array( 
    105                 'label'       => _x( 'Scheduled', 'post' ), 
     108                'labels'          => array(  
     109                        'name'    => _x( 'Scheduled', 'post' ), 
     110                        'publish' => esc_attr__('Schedule'), 
     111                        'count' => _n_noop('Scheduled <span class="count">(%s)</span>', 'Scheduled <span class="count">(%s)</span>' ), 
     112                ), 
    106113                'protected'   => true, 
    107114                '_builtin'    => true, /* internal use only. */ 
    108                 'label_count' => _n_noop('Scheduled <span class="count">(%s)</span>', 'Scheduled <span class="count">(%s)</span>' ), 
    109115        ) ); 
    110116 
    111117        register_post_status( 'draft', array( 
    112                 'label'       => _x( 'Draft', 'post' ), 
     118                'labels'          => array(  
     119                        'name'    => _x( 'Draft', 'post' ), 
     120                        'save_as' => esc_attr__('Save Draft'),  
     121                        'count' => _n_noop( 'Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>' ), 
     122                ), 
    113123                'protected'   => true, 
    114124                '_builtin'    => true, /* internal use only. */ 
    115                 'label_count' => _n_noop( 'Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>' ), 
    116125        ) ); 
    117126 
    118127        register_post_status( 'pending', array( 
    119                 'label'       => _x( 'Pending', 'post' ), 
     128                'labels'          => array(  
     129                        'name'    => _x( 'Pending', 'post' ), 
     130                        'caption' => __( 'Pending Review' ), 
     131                        'publish' => esc_attr__('Submit for Review'), 
     132                        'count' => _n_noop( 'Pending <span class="count">(%s)</span>', 'Pending <span class="count">(%s)</span>' ), 
     133                ), 
    120134                'protected'   => true, 
    121135                '_builtin'    => true, /* internal use only. */ 
    122                 'label_count' => _n_noop( 'Pending <span class="count">(%s)</span>', 'Pending <span class="count">(%s)</span>' ), 
     136                'moderation'  => true, 
    123137        ) ); 
    124138 
    125139        register_post_status( 'private', array( 
    126                 'label'       => _x( 'Private', 'post' ), 
     140                'labels'          => array(  
     141                        'name'   => _x( 'Private', 'post' ), 
     142                        'caption' => __( 'Privately Published' ), 
     143                        'count' => _n_noop( 'Private <span class="count">(%s)</span>', 'Private <span class="count">(%s)</span>' ), 
     144                ), 
    127145                'private'     => true, 
    128146                '_builtin'    => true, /* internal use only. */ 
    129                 'label_count' => _n_noop( 'Private <span class="count">(%s)</span>', 'Private <span class="count">(%s)</span>' ), 
    130147        ) ); 
    131148 
    132149        register_post_status( 'trash', array( 
    133                 'label'       => _x( 'Trash', 'post' ), 
     150                'labels'          => array(  
     151                        'name'   => _x( 'Trash', 'post' ), 
     152                        'count' => _n_noop( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>' ), 
     153                ), 
    134154                'internal'    => true, 
    135155                '_builtin'    => true, /* internal use only. */ 
    136                 'label_count' => _n_noop( 'Trash <span class="count">(%s)</span>', 'Trash <span class="count">(%s)</span>' ), 
    137156                'show_in_admin_status_list' => true, 
    138157        ) ); 
    139158 
    140159        register_post_status( 'auto-draft', array( 
    141                 'label'    => 'auto-draft', 
     160                'labels'          => array(  
     161                        'name'    => 'auto-draft', 
     162                        'caption' => __( 'Draft' ), 
     163                ), 
    142164                'internal' => true, 
    143165                '_builtin' => true, /* internal use only. */ 
     166                'show_in_admin_all_list' => false, 
     167                'show_in_admin_status_list' => false, 
    144168        ) ); 
    145169 
    146170        register_post_status( 'inherit', array( 
    147                 'label'    => 'inherit', 
     171                'labels'          => array(  
     172                        'name'   => 'inherit', 
     173                ), 
    148174                'internal' => true, 
    149175                '_builtin' => true, /* internal use only. */ 
    150176                'exclude_from_search' => false, 
     
    632658} 
    633659 
    634660/** 
     661 * Add an already registered post status to an object type. 
     662 * 
     663 * @package WordPress 
     664 * @subpackage Taxonomy 
     665 * @since 3.1.0 
     666 * @uses $wp_post_statuses Modifies post_type object 
     667 * 
     668 * @param string $post_status Name of post_status object 
     669 * @param array|string $object_type Name of the object type 
     670 * @return bool True if successful, false if not 
     671 */ 
     672function register_status_for_object_type( $post_status, $object_type) { 
     673        global $wp_post_statuses; 
     674 
     675        if ( ! isset( $wp_post_statuses[$post_status] ) ) 
     676                return false; 
     677 
     678        if ( ! get_post_type_object($object_type) ) 
     679                return false; 
     680 
     681        $wp_post_statuses[$post_status]->object_type[] = $object_type; 
     682 
     683        return true; 
     684} 
     685 
     686/** 
    635687 * Register a post type. Do not use before init. 
    636688 * 
    637689 * A simple function for creating or modifying a post status based on the 
     
    665717                $wp_post_statuses = array(); 
    666718 
    667719        // Args prefixed with an underscore are reserved for internal use. 
    668         $defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'show_in_admin_all' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'single_view_cap' => null); 
     720        $defaults = array( 'object_type' => null, 'labels' => array(), 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'moderation' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'single_view_cap' => null); 
     721         
    669722        $args = wp_parse_args($args, $defaults); 
    670723        $args = (object) $args; 
    671724 
    672725        $post_status = sanitize_key($post_status); 
    673726        $args->name = $post_status; 
    674727 
     728        if ( null == $args->object_type ) { 
     729                $args->object_type = array_values( get_post_types( array( 'public' => true, 'show_ui' => true ) ) ); 
     730        } else { 
     731                $args->object_type = (array) $args->object_type; 
     732        } 
     733         
    675734        if ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private ) 
    676735                $args->internal = true; 
    677736 
     
    681740        if ( null === $args->private  ) 
    682741                $args->private = false; 
    683742 
     743        if ( null === $args->moderation  ) 
     744                $args->moderation = false; 
     745                 
    684746        if ( null === $args->protected  ) 
    685747                $args->protected = false; 
    686748 
     
    702764        if ( null === $args->single_view_cap ) 
    703765                $args->single_view_cap = $args->public ? '' : 'edit'; 
    704766 
    705         if ( false === $args->label ) 
    706                 $args->label = $post_status; 
     767        $args->labels = (object) $args->labels; 
    707768 
    708         if ( false === $args->label_count ) 
    709                 $args->label_count = array( $args->label, $args->label ); 
     769        if ( empty( $args->labels->name ) ) 
     770                $args->labels->name = ( ! empty( $args->label ) ) ? $args->label : $post_status; 
     771         
     772        if ( empty( $args->label ) ) 
     773                $args->label = $args->labels->name; 
     774                 
     775        if ( empty( $args->labels->caption ) ) 
     776                $args->labels->caption = $args->label; 
    710777 
     778        if ( empty( $args->labels->count ) ) 
     779                $args->labels->count = ( ! empty( $args->label_count ) ) ? $args->label_count : array( $args->label, $args->label ); 
     780 
     781        if ( empty( $args->label_count ) )      // TODO: need to support this for external API? 
     782                $args->label_count = $args->labels->count; 
     783 
     784        if ( empty( $args->labels->publish ) ) 
     785                $args->labels->publish = esc_attr( sprintf( __( 'Set %s' ), $args->label ) ); 
     786 
     787        if ( empty( $args->labels->save_as ) ) 
     788                $args->labels->save_as = esc_attr( sprintf( __( 'Save as %s' ), $args->label ) ); 
     789 
     790        if ( empty( $args->labels->visibility ) ) { 
     791                if ( 'publish' == $post_status ) 
     792                        $args->labels->visibility =__( 'Public' ); 
     793                elseif ( $args->public ) 
     794                        $args->labels->visibility = esc_attr( sprintf( __( 'Public (%s)' ), $args->label ) ); 
     795                elseif ( $args->private ) 
     796                        $args->labels->visibility = $args->label; 
     797        } 
     798 
    711799        $wp_post_statuses[$post_status] = $args; 
    712800 
    713801        return $args; 
     
    753841 */ 
    754842function get_post_stati( $args = array(), $output = 'names', $operator = 'and' ) { 
    755843        global $wp_post_statuses; 
     844         
     845        $post_statuses = $wp_post_statuses; 
    756846 
    757847        $field = ('names' == $output) ? 'name' : false; 
     848         
     849        //wp_filter_object_list doesn't like nested arrays,  
     850        //so grab a subset of post stati that match the query, and THEN run through wp_list_filter 
     851        if ( ! empty( $args['object_type'] ) ) { 
     852                $post_statuses = get_object_stati( $args['object_type'], 'objects' ); 
     853                unset( $args['object_type'] ); 
     854        } 
    758855 
    759         return wp_filter_object_list($wp_post_statuses, $args, $operator, $field); 
     856        return wp_filter_object_list( $post_statuses, $args, $operator, $field ); 
    760857} 
    761858 
    762859/** 
     860 * Return all of the post_statuses that are of $object_type. 
     861 * * 
     862 * <code><?php $taxonomies = get_object_stati('post'); ?></code> Should 
     863 * result in <code>Array('publish', 'future', 'pending', etc. )</code> 
     864 * 
     865 * @package WordPress 
     866 * @subpackage Taxonomy 
     867 * @since 3.5 
     868 * 
     869 * @uses $wp_post_statuses 
     870 * 
     871 * @param array|string|object $object Name of the type of post_status object, or an object (row from posts) 
     872 * @param string $output The type of output to return, either status 'names' or 'objects'. 'names' is the default. 
     873 * @return array The names of all statuses of $object_type. 
     874 */ 
     875 
     876function get_object_stati($object, $output = 'names') { 
     877        global $wp_post_statuses; 
     878 
     879        if ( is_object($object) ) 
     880                $object = $object->post_type; 
     881 
     882        $object = (array) $object; 
     883 
     884        $stati = array(); 
     885        foreach ( (array) $wp_post_statuses as $status_name => $status_obj ) { 
     886                if ( array_intersect($object, (array) $status_obj->object_type) ) { 
     887                        if ( 'names' == $output ) 
     888                                $stati[] = $status_name; 
     889                        else 
     890                                $stati[ $status_name ] = $status_obj; 
     891                } 
     892        } 
     893 
     894        return $stati; 
     895} 
     896 
     897/** 
    763898 * Whether the post type is hierarchical. 
    764899 * 
    765900 * A false return value might also mean that the post type does not exist. 
     
    9281063                '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'hierarchical' => false, 
    9291064                'public' => false, 'rewrite' => true, 'has_archive' => false, 'query_var' => true, 
    9301065                'supports' => array(), 'register_meta_box_cb' => null, 
    931                 'taxonomies' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null, 
     1066                'taxonomies' => array(), 'statuses' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null, 
    9321067                'can_export' => true, 
    9331068                'show_in_nav_menus' => null, 'show_in_menu' => null, 'show_in_admin_bar' => null, 
    9341069        ); 
     
    10491184        foreach ( $args->taxonomies as $taxonomy ) { 
    10501185                register_taxonomy_for_object_type( $taxonomy, $post_type ); 
    10511186        } 
     1187         
     1188        foreach ( $args->statuses as $post_status ) { 
     1189                register_status_for_object_type( $post_status, $post_type ); 
     1190        } 
    10521191 
    10531192        do_action( 'registered_post_type', $post_type, $args ); 
    10541193 
     
    18231962        $query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s"; 
    18241963        if ( 'readable' == $perm && is_user_logged_in() ) { 
    18251964                $post_type_object = get_post_type_object($type); 
    1826                 if ( !current_user_can( $post_type_object->cap->read_private_posts ) ) { 
    1827                         $cache_key .= '_' . $perm . '_' . $user->ID; 
    1828                         $query .= " AND (post_status != 'private' OR ( post_author = '$user->ID' AND post_status = 'private' ))"; 
     1965                foreach( get_post_stati( array( 'private' => true, 'object_type' => $type ) ) as $_status ) { 
     1966                        $cap_name = "read_{$_status}_posts"; 
     1967                        if ( ! empty($post_type_object->cap->$cap_name) && ! current_user_can( $post_type_object->cap->$cap_name ) ) { 
     1968                                $suffix = ( 'private' == $_status ) ? '' : $_status; 
     1969                                $cache_key .= '_' . $perm . $suffix . '_' . $user->ID; 
     1970                                $query .= " AND (post_status != '$_status' OR ( post_author = '$user->ID' AND post_status = '$_status' ))"; 
     1971                        } 
    18291972                } 
    18301973        } 
    18311974        $query .= ' GROUP BY post_status'; 
    1832  
     1975         
    18331976        $count = wp_cache_get($cache_key, 'counts'); 
    18341977        if ( false !== $count ) 
    18351978                return $count; 
     
    18371980        $count = $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A ); 
    18381981 
    18391982        $stats = array(); 
    1840         foreach ( get_post_stati() as $state ) 
     1983        foreach ( get_post_stati( array( 'object_type' => $type ) ) as $state ) 
    18411984                $stats[$state] = 0; 
    18421985 
    18431986        foreach ( (array) $count as $row ) 
     
    23202463                $args = array( 'numberposts' => absint( $args ) ); 
    23212464        } 
    23222465 
     2466        $status_names = get_post_stati( array( 'public' => true, 'object_type' => 'post' ) ); 
     2467        $status_names_csv = "'" . implode( "', '", $status_names ) . "'"; 
     2468 
    23232469        // Set default arguments 
    23242470        $defaults = array( 
    23252471                'numberposts' => 10, 'offset' => 0, 
    23262472                'category' => 0, 'orderby' => 'post_date', 
    23272473                'order' => 'DESC', 'include' => '', 
    23282474                'exclude' => '', 'meta_key' => '', 
    2329                 'meta_value' =>'', 'post_type' => 'post', 'post_status' => 'draft, publish, future, pending, private', 
     2475                'meta_value' =>'', 'post_type' => 'post', 'post_status' => $status_names_csv, 
    23302476                'suppress_filters' => true 
    23312477        ); 
    23322478 
     
    24932639        } 
    24942640 
    24952641        // Don't allow contributors to set the post slug for pending review posts 
    2496         if ( 'pending' == $post_status && !current_user_can( 'publish_posts' ) ) 
     2642        $post_status_obj = get_post_status_object( $post_status ); 
     2643        $draft_or_pending = in_array( $post_status, array( 'draft', 'auto-draft' ) ) || ! empty( $post_status_obj->moderation ); 
     2644 
     2645        if ( ! empty( $post_status_obj->moderation ) && ! current_user_can( 'publish_posts' ) ) 
    24972646                $post_name = ''; 
    24982647 
    24992648        // Create a valid post name. Drafts and pending posts are allowed to have an empty 
    25002649        // post name. 
    25012650        if ( empty($post_name) ) { 
    2502                 if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) 
     2651                if ( ! $draft_or_pending ) 
    25032652                        $post_name = sanitize_title($post_title); 
    25042653                else 
    25052654                        $post_name = ''; 
     
    25172666                $post_date = current_time('mysql'); 
    25182667 
    25192668        if ( empty($post_date_gmt) || '0000-00-00 00:00:00' == $post_date_gmt ) { 
    2520                 if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) 
     2669                if ( ! $draft_or_pending ) 
    25212670                        $post_date_gmt = get_gmt_from_date($post_date); 
    25222671                else 
    25232672                        $post_date_gmt = '0000-00-00 00:00:00'; 
     
    25312680                $post_modified_gmt = $post_date_gmt; 
    25322681        } 
    25332682 
    2534         if ( 'publish' == $post_status ) { 
     2683        $set_status = $post_status; 
     2684         
     2685        if ( $post_status_obj->public || $post_status_obj->private ) { 
    25352686                $now = gmdate('Y-m-d H:i:59'); 
    25362687                if ( mysql2date('U', $post_date_gmt, false) > mysql2date('U', $now, false) ) 
    25372688                        $post_status = 'future'; 
     
    25412692                        $post_status = 'publish'; 
    25422693        } 
    25432694 
     2695        if ( ( 'future' == $post_status ) && ( 'publish' != $set_status ) ) { 
     2696                update_post_meta( $post_ID, '_scheduled_status', $set_status ); 
     2697        } else 
     2698                delete_post_meta( $post_ID, '_scheduled_status' ); 
     2699 
    25442700        if ( empty($comment_status) ) { 
    25452701                if ( $update ) 
    25462702                        $comment_status = 'closed'; 
     
    25712727        else 
    25722728                $menu_order = 0; 
    25732729 
    2574         if ( !isset($post_password) || 'private' == $post_status ) 
     2730        if ( ! isset($post_password) || $post_status_obj->private ) 
    25752731                $post_password = ''; 
    25762732 
    25772733        $post_name = wp_unique_post_slug($post_name, $post_ID, $post_status, $post_type, $post_parent); 
     
    26122768                $where = array( 'ID' => $post_ID ); 
    26132769        } 
    26142770 
    2615         if ( empty($data['post_name']) && !in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) { 
     2771        $post_status_obj = get_post_status_object( $data['post_status'] ); 
     2772        $draft_or_pending = in_array( $data['post_status'], array('draft', 'auto-draft') ) || ! empty($post_status_obj->moderation); 
     2773         
     2774        if ( empty($data['post_name']) && ! $draft_or_pending ) { 
    26162775                $data['post_name'] = sanitize_title($data['post_title'], $post_ID); 
    26172776                $wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where ); 
    26182777        } 
     
    27022861                $post_cats = $post['post_category']; 
    27032862 
    27042863        // Drafts shouldn't be assigned a date unless explicitly done so by the user 
    2705         if ( isset( $post['post_status'] ) && in_array($post['post_status'], array('draft', 'pending', 'auto-draft')) && empty($postarr['edit_date']) && 
    2706                          ('0000-00-00 00:00:00' == $post['post_date_gmt']) ) 
    2707                 $clear_date = true; 
    2708         else 
     2864        if ( isset( $post['post_status'] ) && empty($postarr['edit_date']) && ('0000-00-00 00:00:00' == $post['post_date_gmt']) ) { 
     2865                $post_status_obj = get_post_status_object( $post['post_status'] ); 
     2866 
     2867                $clear_date = in_array( $post['post_status'], array('draft', 'auto-draft') ) || ! empty($post_status_obj->moderation); 
     2868        } else 
    27092869                $clear_date = false; 
    27102870 
    27112871        // Merge old and new fields with new fields overwriting old ones. 
     
    27432903        if ( 'publish' == $post->post_status ) 
    27442904                return; 
    27452905 
    2746         $wpdb->update( $wpdb->posts, array( 'post_status' => 'publish' ), array( 'ID' => $post_id ) ); 
     2906        if ( 'future' == $post->post_status ) { 
     2907                if ( ! $post_status = get_post_meta( $post_id, '_scheduled_status', true ) ) 
     2908                        $post_status = 'publish';        
     2909        } else 
     2910                $post_status = 'publish'; 
    27472911 
     2912        $wpdb->update( $wpdb->posts, array( 'post_status' => $post_status ), array( 'ID' => $post_id ) ); 
     2913 
    27482914        $old_status = $post->post_status; 
    27492915        $post->post_status = 'publish'; 
    27502916        wp_transition_post_status('publish', $old_status, $post); 
     
    28012967 * @return string unique slug for the post, based on $post_name (with a -1, -2, etc. suffix) 
    28022968 */ 
    28032969function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) { 
    2804         if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) 
     2970        $post_status_obj = get_post_status_object( $post_status ); 
     2971 
     2972        if ( in_array( $post_status, array('draft', 'auto-draft') ) || ! empty($post_status_obj->moderation) ) 
    28052973                return $slug; 
    28062974 
    28072975        global $wpdb, $wp_rewrite; 
     
    33653533        // Make sure we have a valid post status 
    33663534        if ( !is_array( $post_status ) ) 
    33673535                $post_status = explode( ',', $post_status ); 
    3368         if ( array_diff( $post_status, get_post_stati() ) ) 
     3536        if ( array_diff( $post_status, get_post_stati( array( 'object_type' => $post_type ) ) ) ) 
     3537 
    33693538                return false; 
    33703539 
    33713540        $cache = array(); 
  • wp-includes/query.php

     
    24022402                        $post_type_object = get_post_type_object ( 'post' ); 
    24032403                } 
    24042404 
     2405                $_post_type = ( $post_type ) ? $post_type : 'post';  // corresponds to hardcoded default for POST_TYPE clause 
     2406                $type_arg = ( 'any' == $_post_type ) ? array() : array( 'object_type' => $_post_type ); 
     2407 
    24052408                if ( ! empty( $post_type_object ) ) { 
     2409                        $post_type_cap = $post_type_object->capability_type; 
    24062410                        $edit_cap = $post_type_object->cap->edit_post; 
    24072411                        $read_cap = $post_type_object->cap->read_post; 
    24082412                        $edit_others_cap = $post_type_object->cap->edit_others_posts; 
    2409                         $read_private_cap = $post_type_object->cap->read_private_posts; 
    24102413                } else { 
    24112414                        $edit_cap = 'edit_' . $post_type_cap; 
    24122415                        $read_cap = 'read_' . $post_type_cap; 
    24132416                        $edit_others_cap = 'edit_others_' . $post_type_cap . 's'; 
    2414                         $read_private_cap = 'read_private_' . $post_type_cap . 's'; 
    24152417                } 
    24162418 
    24172419                if ( ! empty( $q['post_status'] ) ) { 
     
    24212423                                $q_status = explode(',', $q_status); 
    24222424                        $r_status = array(); 
    24232425                        $p_status = array(); 
     2426                        $p_status_owner = array(); 
    24242427                        $e_status = array(); 
    24252428                        if ( in_array('any', $q_status) ) { 
    24262429                                foreach ( get_post_stati( array('exclude_from_search' => true) ) as $status ) 
    24272430                                        $e_status[] = "$wpdb->posts.post_status <> '$status'"; 
    24282431                        } else { 
    2429                                 foreach ( get_post_stati() as $status ) { 
     2432                                $_args = array_merge( array(), $type_arg );  
     2433                                foreach ( get_post_stati( $_args, 'object' ) as $status => $status_obj ) { 
    24302434                                        if ( in_array( $status, $q_status ) ) { 
    2431                                                 if ( 'private' == $status ) 
    2432                                                         $p_status[] = "$wpdb->posts.post_status = '$status'"; 
    2433                                                 else 
     2435                                                if ( $status_obj->private ) { 
     2436                                                        if ( ! empty($post_type_object) ) { 
     2437                                                                $check_cap = "read_{$status}_posts"; 
     2438                                                                $read_private_cap = ( ! empty( $post_type_object->cap->$check_cap ) ) ? $post_type_object->cap->$check_cap : $post_type_object->cap->read_private_posts; 
     2439                                                        } else 
     2440                                                                $read_private_cap = 'read_private_' . $post_type_cap . 's'; 
     2441                                                         
     2442                                                        if ( ! empty($q['perm'] ) && 'readable' == $q['perm'] && ! current_user_can( $read_private_cap ) ) 
     2443                                                                $p_status_owner[] = "$wpdb->posts.post_status = '$status'"; 
     2444                                                        else 
     2445                                                                $p_status[] = "$wpdb->posts.post_status = '$status'"; 
     2446                                                } else 
    24342447                                                        $r_status[] = "$wpdb->posts.post_status = '$status'"; 
    24352448                                        } 
    24362449                                } 
    24372450                        } 
    24382451 
    24392452                        if ( empty($q['perm'] ) || 'readable' != $q['perm'] ) { 
    2440                                 $r_status = array_merge($r_status, $p_status); 
     2453                                $r_status = array_merge($r_status, $p_status, $p_status_owner); 
    24412454                                unset($p_status); 
     2455                                unset($p_status_owner); 
    24422456                        } 
    24432457 
    24442458                        if ( !empty($e_status) ) { 
     
    24502464                                else 
    24512465                                        $statuswheres[] = "(" . join( ' OR ', $r_status ) . ")"; 
    24522466                        } 
    2453                         if ( !empty($p_status) ) { 
     2467 
     2468                        if ( ! empty( $p_status ) ) { 
    24542469                                if ( !empty($q['perm'] ) && 'readable' == $q['perm'] && !current_user_can($read_private_cap) ) 
    24552470                                        $statuswheres[] = "($wpdb->posts.post_author = $user_ID " . "AND (" . join( ' OR ', $p_status ) . "))"; 
    24562471                                else 
    24572472                                        $statuswheres[] = "(" . join( ' OR ', $p_status ) . ")"; 
    24582473                        } 
     2474                        if ( ! empty( $p_status ) ) {                    
     2475                                $statuswheres[] = "(" . join( ' OR ', $p_status ) . ")"; 
     2476                        } 
    24592477                        if ( $post_status_join ) { 
    24602478                                $join .= " LEFT JOIN $wpdb->posts AS p2 ON ($wpdb->posts.post_parent = p2.ID) "; 
    24612479                                foreach ( $statuswheres as $index => $statuswhere ) 
    24622480                                        $statuswheres[$index] = "($statuswhere OR ($wpdb->posts.post_status = 'inherit' AND " . str_replace($wpdb->posts, 'p2', $statuswhere) . "))"; 
    24632481                        } 
    24642482                        foreach ( $statuswheres as $statuswhere ) 
    2465                                 $where .= " AND $statuswhere"; 
     2483                                $where .= " AND $statuswhere";   
     2484 
    24662485                } elseif ( !$this->is_singular ) { 
    24672486                        $where .= " AND ($wpdb->posts.post_status = 'publish'"; 
    24682487 
    24692488                        // Add public states. 
    2470                         $public_states = get_post_stati( array('public' => true) ); 
     2489                        $_args = array_merge( array( 'public' => true ), $type_arg ); 
     2490                        $public_states = apply_filters_ref_array( 'posts_public_stati', array( get_post_stati( $_args ), &$this ) ); 
    24712491                        foreach ( (array) $public_states as $state ) { 
    24722492                                if ( 'publish' == $state ) // Publish is hard-coded above. 
    24732493                                        continue; 
     
    24762496 
    24772497                        if ( $this->is_admin ) { 
    24782498                                // Add protected states that should show in the admin all list. 
    2479                                 $admin_all_states = get_post_stati( array('protected' => true, 'show_in_admin_all_list' => true) ); 
     2499                                $_args = array_merge( array( 'protected' => true, 'show_in_admin_all_list' => true ), $type_arg ); 
     2500                                $admin_all_states = get_post_stati( $_args ); 
    24802501                                foreach ( (array) $admin_all_states as $state ) 
    24812502                                        $where .= " OR $wpdb->posts.post_status = '$state'"; 
    24822503                        } 
    24832504 
    24842505                        if ( is_user_logged_in() ) { 
    24852506                                // Add private states that are limited to viewing by the author of a post or someone who has caps to read private states. 
    2486                                 $private_states = get_post_stati( array('private' => true) ); 
    2487                                 foreach ( (array) $private_states as $state ) 
     2507                                $_args = array_merge( array( 'private' => true ), $type_arg ); 
     2508                                $private_states = apply_filters_ref_array( 'posts_private_stati', array( get_post_stati( $_args ), &$this ) ); 
     2509                                foreach ( (array) $private_states as $state ) { 
     2510                                        if ( ! empty($post_type_object) ) { 
     2511                                                $check_cap = "read_{$state}_posts"; 
     2512                                                $read_private_cap = ( ! empty( $post_type_object->cap->$check_cap ) ) ? $post_type_object->cap->$check_cap : $post_type_object->cap->read_private_posts; 
     2513                                        } else 
     2514                                                $read_private_cap = 'read_private_' . $post_type_cap . 's'; 
     2515 
    24882516                                        $where .= current_user_can( $read_private_cap ) ? " OR $wpdb->posts.post_status = '$state'" : " OR $wpdb->posts.post_author = $user_ID AND $wpdb->posts.post_status = '$state'"; 
     2517                                } 
    24892518                        } 
    24902519 
    24912520                        $where .= ')'; 
     
    25262555                                $cwhere = "WHERE comment_approved = '1' $where"; 
    25272556                                $cgroupby = "$wpdb->comments.comment_id"; 
    25282557                        } else { // Other non singular e.g. front 
     2558                                $public_stati = apply_filters( 'comment_feed_stati', get_post_stati( array( 'public' => true ) ) ); 
     2559                                $public_csv = implode( "', '", $public_stati ); 
     2560 
    25292561                                $cjoin = "JOIN $wpdb->posts ON ( $wpdb->comments.comment_post_ID = $wpdb->posts.ID )"; 
    2530                                 $cwhere = "WHERE post_status = 'publish' AND comment_approved = '1'"; 
     2562                                $cwhere = "WHERE post_status IN ( '$public_csv' ) AND comment_approved = '1'"; 
    25312563                                $cgroupby = ''; 
    25322564                        } 
    25332565 
     
    27382770                                        $stickies_where = "AND $wpdb->posts.post_type IN ('" . $post_types . "')"; 
    27392771                                } 
    27402772 
     2773                                $public_stati = apply_filters_ref_array( 'posts_sticky_stati', array( get_post_stati( array( 'public' => true ) ), &$this ) ); 
    27412774                                $stickies = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE $wpdb->posts.ID IN ($stickies__in) $stickies_where" ); 
    27422775                                foreach ( $stickies as $sticky_post ) { 
    27432776                                        // Ignore sticky posts the current user cannot read or are not published. 
    2744                                         if ( 'publish' != $sticky_post->post_status ) 
     2777                                        if ( ! in_array( $sticky_post->post_status, $public_stati ) ) 
    27452778                                                continue; 
     2779 
    27462780                                        array_splice($this->posts, $sticky_offset, 0, array($sticky_post)); 
    27472781                                        $sticky_offset++; 
    27482782                                } 
  • wp-includes/general-template.php

     
    915915        } 
    916916 
    917917        //filters 
    918         $where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r ); 
    919         $join = apply_filters( 'getarchives_join', '', $r ); 
     918        $public_stati = apply_filters( 'getarchives_stati', get_post_stati( array( 'public' => true ) ) ); 
     919        $public_csv = implode( "', '", $public_stati ); 
    920920 
     921        $where = apply_filters('getarchives_where', "WHERE post_type = 'post' AND post_status IN ('" . $public_csv . "')", $r ); 
     922        $join = apply_filters('getarchives_join', "", $r); 
     923 
    921924        $output = ''; 
    922925 
    923926        if ( 'monthly' == $type ) { 
  • wp-includes/script-loader.php

     
    332332                $scripts->add( 'postbox', "/wp-admin/js/postbox$suffix.js", array('jquery-ui-sortable'), false, 1 ); 
    333333 
    334334                $scripts->add( 'post', "/wp-admin/js/post$suffix.js", array('suggest', 'wp-lists', 'postbox'), false, 1 ); 
    335                 $scripts->localize( 'post', 'postL10n', array( 
     335                $arr = array( 
    336336                        'ok' => __('OK'), 
    337337                        'cancel' => __('Cancel'), 
    338338                        'publishOn' => __('Publish on:'), 
     
    352352                        'privatelyPublished' => __('Privately Published'), 
    353353                        'published' => __('Published'), 
    354354                        'comma' => _x( ',', 'tag delimiter' ), 
    355                 ) ); 
     355                ); 
     356                 
     357                $custom = array(); 
     358                foreach( get_post_stati( array( 'public' => true, 'private' => true ), 'object', 'or' ) as $_status => $_status_obj ) { 
     359                        if ( 'publish' == $_status ) 
     360                                continue; 
    356361 
     362                        $custom[ $_status ] = $_status_obj->labels->visibility; 
     363 
     364                        if ( $_status_obj->public ) 
     365                                $custom[ $_status . 'Sticky' ] = sprintf( __('%s, Sticky'), $_status_obj->label ); 
     366                } 
     367 
     368                $arr = array_merge( $custom, $arr );  // note: 'publish' has existing value of 'Publish', cannot be used to reference status name  
     369 
     370                $scripts->localize( 'post', 'postL10n', $arr ); 
     371 
    357372                $scripts->add( 'link', "/wp-admin/js/link$suffix.js", array('wp-lists', 'postbox'), false, 1 ); 
     373                $scripts->add_data( 'link', 'group', 1 ); 
    358374 
    359375                $scripts->add( 'comment', "/wp-admin/js/comment$suffix.js", array('jquery') ); 
    360376                $scripts->add_data( 'comment', 'group', 1 ); 
  • wp-content

  • wp-content/plugins

    Property changes on: wp-content
    ___________________________________________________________________
    Added: svn:ignore
    ## -0,0 +1 ##
    +.
  • wp-admin/includes/post.php

    Property changes on: wp-content/plugins
    ___________________________________________________________________
    Added: svn:ignore
    ## -0,0 +1 ##
    +.
     
    7171        // What to do based on which button they pressed 
    7272        if ( isset($post_data['saveasdraft']) && '' != $post_data['saveasdraft'] ) 
    7373                $post_data['post_status'] = 'draft'; 
    74         if ( isset($post_data['saveasprivate']) && '' != $post_data['saveasprivate'] ) 
     74        if ( isset($post_data['saveasprivate']) && '' != $post_data['saveasprivate'] ) // TODO: is this set anywhere? 
    7575                $post_data['post_status'] = 'private'; 
    7676        if ( isset($post_data['publish']) && ( '' != $post_data['publish'] ) && ( !isset($post_data['post_status']) || $post_data['post_status'] != 'private' ) ) 
    7777                $post_data['post_status'] = 'publish'; 
     
    8888 
    8989        // Posts 'submitted for approval' present are submitted to $_POST the same as if they were being published. 
    9090        // Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts. 
    91         if ( isset($post_data['post_status']) && ('publish' == $post_data['post_status'] && !current_user_can( $ptype->cap->publish_posts )) ) 
    92                 if ( $previous_status != 'publish' || !current_user_can( 'edit_post', $post_id ) ) 
    93                         $post_data['post_status'] = 'pending'; 
     91        if ( isset($post_data['post_status']) && ('publish' == $post_data['post_status'] && !current_user_can( $ptype->cap->publish_posts )) ) { 
     92                if ( $previous_status != 'publish' || !current_user_can( 'edit_post', $post_id ) ) { 
     93                        $moderation_status = apply_filters( 'post_moderation_status', 'pending', $post->ID ); 
    9494 
     95                        $_status_obj = get_post_status_object( $moderation_status ); 
     96                        $cap_name = "set_{$moderation_status}_posts"; 
     97 
     98                        if ( empty($_status_obj) || ! $_status_obj->moderation || ( ! empty($ptype->cap->$cap_name) && ! current_user_can($ptype->cap->$cap_name) ) ) 
     99                                $moderation_status = 'pending'; 
     100 
     101                        $post_data['post_status'] = $moderation_status; 
     102                } 
     103        } 
     104 
    95105        if ( ! isset($post_data['post_status']) ) 
    96106                $post_data['post_status'] = $previous_status; 
    97107 
     
    182192                        case 'password' : 
    183193                                unset( $post_data['sticky'] ); 
    184194                                break; 
    185                         case 'private' : 
    186                                 $post_data['post_status'] = 'private'; 
    187                                 $post_data['post_password'] = ''; 
    188                                 unset( $post_data['sticky'] ); 
    189                                 break; 
     195                        default: 
     196                                $status_obj = get_post_status_object( $post_data['visibility'] ); 
     197         
     198                                if ( ! empty( $status_obj->private ) || ! empty( $status_obj->public ) ) { 
     199                                        $post_data['post_status'] = $status_obj->name; 
     200                                        $post_data['post_password'] = ''; 
     201                                } 
     202 
     203                                if ( ! empty( $status_obj->private ) ) { 
     204                                        unset( $post_data['sticky'] ); 
     205                                } 
    190206                } 
    191207        } 
    192208 
     
    568584                        case 'password' : 
    569585                                unset( $_POST['sticky'] ); 
    570586                                break; 
    571                         case 'private' : 
    572                                 $_POST['post_status'] = 'private'; 
    573                                 $_POST['post_password'] = ''; 
    574                                 unset( $_POST['sticky'] ); 
    575                                 break; 
     587                        default: 
     588                                $status_obj = get_post_status_object( $_POST['visibility'] );    
     589                                if ( ! empty( $status_obj->private ) ) { 
     590                                        $_POST['post_status'] = $status_obj->name; 
     591                                        $_POST['post_password'] = ''; 
     592                                        unset( $_POST['sticky'] ); 
     593                                } 
    576594                } 
    577595        } 
    578596 
     
    862880 
    863881        if ( isset($q['orderby']) ) 
    864882                $orderby = $q['orderby']; 
    865         elseif ( isset($q['post_status']) && in_array($q['post_status'], array('pending', 'draft')) ) 
     883        elseif ( isset($q['post_status']) && ( in_array($q['post_status'], array('pending', 'draft')) || ! empty( $GLOBALS['wp_post_statuses'][$q['post_status']]->moderation ) ) ) 
    866884                $orderby = 'modified'; 
    867885 
    868886        if ( isset($q['order']) ) 
     
    10241042        $original_date = $post->post_date; 
    10251043        $original_name = $post->post_name; 
    10261044 
     1045        $post_status_obj = get_post_status_object( $post->post_status ); 
     1046         
    10271047        // Hack: get_permalink would return ugly permalink for 
    10281048        // drafts, so we will fake, that our post is published 
    1029         if ( in_array($post->post_status, array('draft', 'pending')) ) { 
     1049        if ( in_array($post->post_status, array('draft', 'pending')) || ! empty($post_status_obj->moderation) ) { 
    10301050                $post->post_status = 'publish'; 
    10311051                $post->post_name = sanitize_title($post->post_name ? $post->post_name : $post->post_title, $post->ID); 
    10321052        } 
     
    10841104 
    10851105        list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug); 
    10861106 
    1087         if ( 'publish' == $post->post_status ) { 
     1107        $public_stati = get_post_stati( array( 'public' => true ) ); 
     1108        if ( in_array( $post->post_status, $public_stati ) ) { 
    10881109                $ptype = get_post_type_object($post->post_type); 
    10891110                $view_post = $ptype->labels->view_item; 
    10901111                $title = __('Click to edit this part of the permalink'); 
  • wp-admin/includes/template.php

     
    254254        <div class="post_author">' . $post->post_author . '</div> 
    255255        <div class="comment_status">' . esc_html( $post->comment_status ) . '</div> 
    256256        <div class="ping_status">' . esc_html( $post->ping_status ) . '</div> 
    257         <div class="_status">' . esc_html( $post->post_status ) . '</div> 
     257        <div class="_status">' . esc_html( $post->post_status ) . '</div>'; 
     258 
     259        if ( 'future' == $post->post_status ) { 
     260                if ( ! $scheduled_status = get_post_meta( $post->ID, '_scheduled_status', true ) ) 
     261                        $scheduled_status = 'publish';   
     262        echo ' 
     263        <div class="scheduled_status">' . esc_html( $scheduled_status  ). '</div>'; 
     264        } 
     265 
     266        echo ' 
    258267        <div class="jj">' . mysql2date( 'd', $post->post_date, false ) . '</div> 
    259268        <div class="mm">' . mysql2date( 'm', $post->post_date, false ) . '</div> 
    260269        <div class="aa">' . mysql2date( 'Y', $post->post_date, false ) . '</div> 
     
    575584function touch_time( $edit = 1, $for_post = 1, $tab_index = 0, $multi = 0 ) { 
    576585        global $wp_locale, $post, $comment; 
    577586 
    578         if ( $for_post ) 
    579                 $edit = ! ( in_array($post->post_status, array('draft', 'pending') ) && (!$post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) ); 
    580  
     587        if ( $for_post ) { 
     588                $post_status_obj = get_post_status_object($post->post_status); 
     589                $edit = ( ( 'draft' != $post->post_status ) && empty($post_status_obj->moderation) ) || ( $post->post_date_gmt && '0000-00-00 00:00:00' != $post->post_date_gmt ); 
     590        } 
     591                         
    581592        $tab_index_attribute = ''; 
    582593        if ( (int) $tab_index > 0 ) 
    583594                $tab_index_attribute = " tabindex=\"$tab_index\""; 
     
    14671478        else 
    14681479                $post_status = ''; 
    14691480 
     1481        $post_status_obj = get_post_status_object($post->post_status); 
     1482         
    14701483        if ( !empty($post->post_password) ) 
    14711484                $post_states['protected'] = __('Password protected'); 
    1472         if ( 'private' == $post->post_status && 'private' != $post_status ) 
    1473                 $post_states['private'] = __('Private'); 
    1474         if ( 'draft' == $post->post_status && 'draft' != $post_status ) 
    1475                 $post_states['draft'] = __('Draft'); 
    1476         if ( 'pending' == $post->post_status && 'pending' != $post_status ) 
    1477                 /* translators: post state */ 
    1478                 $post_states['pending'] = _x('Pending', 'post state'); 
    1479         if ( is_sticky($post->ID) ) 
    1480                 $post_states['sticky'] = __('Sticky'); 
     1485         
     1486        if ( $post_status_obj && ( 'publish' != $post->post_status ) ) { 
     1487                if ( $post->post_status != $post_status ) { 
     1488                        $post_states[] = $post_status_obj->label; 
    14811489 
     1490                        if ( 'future' == $post->post_status ) { 
     1491                                if ( $scheduled_status = get_post_meta( $post->ID, '_scheduled_status', true ) ) { 
     1492                                        if ( 'publish' != $scheduled_status ) { 
     1493                                                if ( $_scheduled_status_obj = get_post_status_object( $scheduled_status ) ) 
     1494                                                        $post_states[] = $_scheduled_status_obj->label; 
     1495                                        } 
     1496                                } 
     1497                        } 
     1498                } 
     1499        } 
     1500 
    14821501        $post_states = apply_filters( 'display_post_states', $post_states ); 
    14831502 
    14841503        if ( ! empty($post_states) ) { 
  • wp-admin/includes/ajax-actions.php

     
    735735                wp_die( -1 ); 
    736736 
    737737        $status = $wpdb->get_var( $wpdb->prepare("SELECT post_status FROM $wpdb->posts WHERE ID = %d", $comment_post_ID) ); 
     738    $post_status_obj = get_post_status_object($status);  
    738739 
    739         if ( empty($status) ) 
     740        if ( empty($post_status_obj) )  
    740741                wp_die( 1 ); 
    741         elseif ( in_array($status, array('draft', 'pending', 'trash') ) ) 
     742        elseif ( ! $post_status_obj->public && ! $post_status_obj->private ) 
    742743                wp_die( __('ERROR: you are replying to a comment on a draft post.') ); 
    743744 
    744745        $user = wp_get_current_user(); 
     
    13541355        if ( isset($data['post_parent']) ) 
    13551356                $data['parent_id'] = $data['post_parent']; 
    13561357 
     1358        $post_type_object = get_post_type_object( $post['post_type'] );  
     1359 
    13571360        // status 
    1358         if ( isset($data['keep_private']) && 'private' == $data['keep_private'] ) 
    1359                 $data['post_status'] = 'private'; 
    1360         else 
     1361        foreach( get_post_stati( array( 'internal' => false, 'object_type' => $post['post_type'] ), 'object' ) as $_status => $_status_obj ) { 
     1362                if ( ( 'publish' == $_status ) || ( ! $_status_obj->private && ! $_status_obj->public ) ) // private and custom public stati only here 
     1363                        continue; 
     1364 
     1365                if ( isset($data["keep_{$_status}"]) ) { 
     1366                        $set_status_cap = "set_{$_status}_posts"; 
     1367                        $check_cap = ( ! empty( $post_type_object->cap->$set_status_cap ) ) ? $post_type_object->cap->$set_status_cap : $post_type_object->cap->publish_posts; 
     1368 
     1369                        if ( current_user_can( $check_cap ) ) { 
     1370                                $data['post_status'] = $_status; 
     1371                                $keeping_private = true; 
     1372                                break; 
     1373                        }        
     1374                } 
     1375        } 
     1376 
     1377        if ( empty($keeping_private) ) // private or custom public status selected and granted 
    13611378                $data['post_status'] = $data['_status']; 
    13621379 
    13631380        if ( empty($data['comment_status']) ) 
     
    14451462        if ( count($search_terms) > 1 && $search_terms[0] != $s ) 
    14461463                $search .= " OR ($wpdb->posts.post_title LIKE '%{$term}%') OR ($wpdb->posts.post_content LIKE '%{$term}%')"; 
    14471464 
    1448         $posts = $wpdb->get_results( "SELECT ID, post_title, post_status, post_date FROM $wpdb->posts WHERE post_type = '$what' AND post_status IN ('draft', 'publish') AND ($search) ORDER BY post_date_gmt DESC LIMIT 50" ); 
     1465        $public_stati = apply_filters( 'find_posts_stati', get_post_stati( array( 'public' => true ) ) ); 
     1466        $public_csv = implode( "', '", $public_stati );  
     1467          
     1468        $posts = $wpdb->get_results( "SELECT ID, post_title, post_status, post_date FROM $wpdb->posts WHERE post_type = '$what' AND post_status IN ('draft', $public_csv) AND ($search) ORDER BY post_date_gmt DESC LIMIT 50" ); 
    14491469 
    14501470        if ( ! $posts ) { 
    14511471                $posttype = get_post_type_object($what); 
    14521472                wp_die( $posttype->labels->not_found ); 
    14531473        } 
     1474         
     1475        $stat = array(); 
    14541476 
    14551477        $html = '<table class="widefat" cellspacing="0"><thead><tr><th class="found-radio"><br /></th><th>'.__('Title').'</th><th>'.__('Date').'</th><th>'.__('Status').'</th></tr></thead><tbody>'; 
    14561478        foreach ( $posts as $post ) { 
    14571479 
    1458                 switch ( $post->post_status ) { 
    1459                         case 'publish' : 
    1460                         case 'private' : 
    1461                                 $stat = __('Published'); 
    1462                                 break; 
    1463                         case 'future' : 
    1464                                 $stat = __('Scheduled'); 
    1465                                 break; 
    1466                         case 'pending' : 
    1467                                 $stat = __('Pending Review'); 
    1468                                 break; 
    1469                         case 'draft' : 
    1470                                 $stat = __('Draft'); 
    1471                                 break; 
     1480                if ( ! isset( $stat[$post->post_status] ) ) { 
     1481                        $_status_obj = get_post_status_object( $post->post_status ); 
     1482                         
     1483                        if ( ! $_status_obj ) 
     1484                                $_status_obj = get_post_status_object( 'draft' ); 
     1485                        elseif ( ( $_status_obj->public || $_status_obj->private ) &&  ( 'publish' != $post->post_status ) ) 
     1486                                $_status_obj = get_post_status_object( 'publish' ); 
     1487 
     1488                        $stat[$post->post_status] = $_status_obj->labels->caption; 
    14721489                } 
    14731490 
    14741491                if ( '0000-00-00 00:00:00' == $post->post_date ) { 
     
    14791496                } 
    14801497 
    14811498                $html .= '<tr class="found-posts"><td class="found-radio"><input type="radio" id="found-'.$post->ID.'" name="found_post_id" value="' . esc_attr($post->ID) . '"></td>'; 
    1482                 $html .= '<td><label for="found-'.$post->ID.'">'.esc_html( $post->post_title ).'</label></td><td>'.esc_html( $time ).'</td><td>'.esc_html( $stat ).'</td></tr>'."\n\n"; 
     1499                $html .= '<td><label for="found-'.$post->ID.'">'.esc_html( $post->post_title ).'</label></td><td>'.esc_html( $time ).'</td><td>'.esc_html( $stat[$post->post_status] ).'</td></tr>'."\n\n"; 
    14831500        } 
    14841501        $html .= '</tbody></table>'; 
    14851502 
  • wp-admin/includes/meta-boxes.php

     
    1111 */ 
    1212function post_submit_meta_box($post) { 
    1313        global $action; 
     14         
     15        $post_type = $post->post_type; 
     16        $post_type_obj = get_post_type_object($post_type); 
     17        $can_publish = current_user_can($post_type_obj->cap->publish_posts); 
     18        $post_status = $post->post_status; 
     19         
     20        if ( ! $post_status_obj = get_post_status_object($post_status) ) 
     21                $post_status_obj = get_post_status_object( 'draft' ); 
     22         
     23        $moderation_stati = get_post_stati( array( 'moderation' => true, 'internal' => false, 'object_type' => $post_type ), 'object' ); 
    1424 
    15         $post_type = $post->post_type; 
    16         $post_type_object = get_post_type_object($post_type); 
    17         $can_publish = current_user_can($post_type_object->cap->publish_posts); 
     25        foreach( array_keys($moderation_stati) as $_status ) {  
     26                $set_cap = "set_{$_status}_posts"; 
     27                if ( ( $_status != $post_status ) && ( ! empty( $post_type_obj->cap->$set_cap ) && ! current_user_can( $post_type_obj->cap->$set_cap ) ) ) 
     28                        unset( $moderation_stati[$_status] ); 
     29        } 
    1830?> 
    1931<div class="submitbox" id="submitpost"> 
    2032 
     
    2739 
    2840<div id="minor-publishing-actions"> 
    2941<div id="save-action"> 
    30 <?php if ( 'publish' != $post->post_status && 'future' != $post->post_status && 'pending' != $post->post_status ) { ?> 
    31 <input <?php if ( 'private' == $post->post_status ) { ?>style="display:none"<?php } ?> type="submit" name="save" id="save-post" value="<?php esc_attr_e('Save Draft'); ?>" tabindex="4" class="button button-highlighted" /> 
    32 <?php } elseif ( 'pending' == $post->post_status && $can_publish ) { ?> 
    33 <input type="submit" name="save" id="save-post" value="<?php esc_attr_e('Save as Pending'); ?>" tabindex="4" class="button button-highlighted" /> 
     42<?php  
     43//if ( 'publish' != $post_status && 'future' != $post_status && 'pending' != $post_status )  {  
     44if ( ! $post_status_obj->public && ! $post_status_obj->private && ! $post_status_obj->moderation && ( 'future' != $post_status ) ) {   
     45// TODO: confirm we don't need a hidden save button when current status is private 
     46        $draft_status_obj = get_post_status_object( 'draft' ); 
     47?> 
     48<input type="submit" name="save" id="save-post" value="<?php echo $draft_status_obj->labels->save_as ?>" tabindex="4" class="button button-highlighted" /> 
     49<?php 
     50} elseif ( $post_status_obj->moderation && $can_publish ) {                      
     51?> 
     52<input type="submit" name="save" id="save-post" value="<?php echo $post_status_obj->labels->save_as ?>" tabindex="4" class="button button-highlighted" /> 
     53 
    3454<?php } ?> 
    3555<img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" class="ajax-loading" id="draft-ajax-loading" alt="" /> 
    3656</div> 
    3757 
    3858<div id="preview-action"> 
    3959<?php 
    40 if ( 'publish' == $post->post_status ) { 
     60if ( $post_status_obj->public ) { 
    4161        $preview_link = esc_url( get_permalink( $post->ID ) ); 
    4262        $preview_button = __( 'Preview Changes' ); 
    4363} else { 
     
    5979 
    6080<div class="misc-pub-section"><label for="post_status"><?php _e('Status:') ?></label> 
    6181<span id="post-status-display"> 
    62 <?php 
    63 switch ( $post->post_status ) { 
    64         case 'private': 
    65                 _e('Privately Published'); 
    66                 break; 
    67         case 'publish': 
    68                 _e('Published'); 
    69                 break; 
    70         case 'future': 
    71                 _e('Scheduled'); 
    72                 break; 
    73         case 'pending': 
    74                 _e('Pending Review'); 
    75                 break; 
    76         case 'draft': 
    77         case 'auto-draft': 
    78                 _e('Draft'); 
    79                 break; 
    80 } 
    81 ?> 
     82<?php echo $post_status_obj->labels->caption; ?> 
    8283</span> 
    83 <?php if ( 'publish' == $post->post_status || 'private' == $post->post_status || $can_publish ) { ?> 
    84 <a href="#post_status" <?php if ( 'private' == $post->post_status ) { ?>style="display:none;" <?php } ?>class="edit-post-status hide-if-no-js" tabindex='4'><?php _e('Edit') ?></a> 
     84<?php  
     85$select_moderation = ( count($moderation_stati) > 1 || ( $post_status != key($moderation_stati) ) );  // multiple moderation stati are selectable or a single non-current moderation stati is selectable 
    8586 
     87if ( $post_status_obj->public || $post_status_obj->private || $can_publish || $select_moderation ) { ?> 
     88<a href="#post_status" <?php if ( $post_status_obj->private || ( $post_status_obj->public && 'publish' != $post_status ) ) { ?>style="display:none;" <?php } ?>class="edit-post-status hide-if-no-js" tabindex='4'><?php _e('Edit') ?></a> 
     89 
    8690<div id="post-status-select" class="hide-if-js"> 
    87 <input type="hidden" name="hidden_post_status" id="hidden_post_status" value="<?php echo esc_attr( ('auto-draft' == $post->post_status ) ? 'draft' : $post->post_status); ?>" /> 
     91<input type="hidden" name="hidden_post_status" id="hidden_post_status" value="<?php echo esc_attr( ('auto-draft' == $post_status ) ? 'draft' : $post_status); ?>" /> 
    8892<select name='post_status' id='post_status' tabindex='4'> 
    89 <?php if ( 'publish' == $post->post_status ) : ?> 
    90 <option<?php selected( $post->post_status, 'publish' ); ?> value='publish'><?php _e('Published') ?></option> 
    91 <?php elseif ( 'private' == $post->post_status ) : ?> 
    92 <option<?php selected( $post->post_status, 'private' ); ?> value='publish'><?php _e('Privately Published') ?></option> 
    93 <?php elseif ( 'future' == $post->post_status ) : ?> 
    94 <option<?php selected( $post->post_status, 'future' ); ?> value='future'><?php _e('Scheduled') ?></option> 
     93 
     94<?php if ( $post_status_obj->public || $post_status_obj->private || ( 'future' == $post_status ) ) : ?> 
     95<option<?php selected( $post_status, $post_status ); ?> value='publish'><?php echo $post_status_obj->labels->caption ?></option> 
    9596<?php endif; ?> 
    96 <option<?php selected( $post->post_status, 'pending' ); ?> value='pending'><?php _e('Pending Review') ?></option> 
    97 <?php if ( 'auto-draft' == $post->post_status ) : ?> 
    98 <option<?php selected( $post->post_status, 'auto-draft' ); ?> value='draft'><?php _e('Draft') ?></option> 
    99 <?php else : ?> 
    100 <option<?php selected( $post->post_status, 'draft' ); ?> value='draft'><?php _e('Draft') ?></option> 
    101 <?php endif; ?> 
     97 
     98<?php  
     99foreach( $moderation_stati as $_status => $_status_obj ) : ?> 
     100<option<?php selected( $post_status, $_status ); ?> value='<?php echo $_status ?>'><?php echo $_status_obj->labels->caption ?></option> 
     101<?php endforeach ?> 
     102 
     103<?php  
     104$draft_status_obj = get_post_status_object( 'draft' ); 
     105$compare_status = ( 'auto-draft' == $post_status ) ? 'auto-draft' : 'draft'; 
     106?> 
     107<option<?php selected( $post_status, $compare_status ); ?> value='draft'><?php echo $draft_status_obj->label ?></option> 
     108 
    102109</select> 
    103110 <a href="#post_status" class="save-post-status hide-if-no-js button"><?php _e('OK'); ?></a> 
    104111 <a href="#post_status" class="cancel-post-status hide-if-no-js"><?php _e('Cancel'); ?></a> 
     
    110117<div class="misc-pub-section" id="visibility"> 
    111118<?php _e('Visibility:'); ?> <span id="post-visibility-display"><?php 
    112119 
    113 if ( 'private' == $post->post_status ) { 
     120if ( 'future' == $post_status ) {       // indicate eventual visibility of scheduled post 
     121        if ( ! $vis_status = get_post_meta( $post->ID, '_scheduled_status', true ) ) 
     122                $vis_status = 'publish';         
     123 
     124        $vis_status_obj = get_post_status_object( $vis_status ); 
     125} else { 
     126        $vis_status = $post_status; 
     127        $vis_status_obj = $post_status_obj; 
     128} 
     129         
     130if ( 'publish' == $vis_status ) { 
    114131        $post->post_password = ''; 
    115         $visibility = 'private'; 
    116         $visibility_trans = __('Private'); 
     132        $visibility = 'public'; 
     133 
     134        if ( post_type_supports( $post->post_type, 'sticky' ) && is_sticky( $post->ID ) ) { 
     135                $visibility_trans = __('Public, Sticky'); 
     136        } else { 
     137            $visibility_trans = __('Public'); 
     138        } 
     139} elseif ( $vis_status_obj->public  ) { 
     140        $post->post_password = ''; 
     141        $visibility = $vis_status; 
     142 
     143        if ( post_type_supports( $post->post_type, 'sticky' ) && is_sticky( $post->ID ) ) { 
     144                $visibility_trans = sprintf( __('%s, Sticky'), $vis_status_obj->label ); 
     145    } else { 
     146            $visibility_trans = $vis_status_obj->labels->visibility; 
     147        } 
     148} elseif ( $vis_status_obj->private ) { 
     149        $post->post_password = ''; 
     150        $visibility_trans = $vis_status_obj->labels->visibility; 
    117151} elseif ( !empty( $post->post_password ) ) { 
    118152        $visibility = 'password'; 
    119153        $visibility_trans = __('Password protected'); 
     
    135169<input type="checkbox" style="display:none" name="hidden_post_sticky" id="hidden-post-sticky" value="sticky" <?php checked(is_sticky($post->ID)); ?> /> 
    136170<?php endif; ?> 
    137171<input type="hidden" name="hidden_post_visibility" id="hidden-post-visibility" value="<?php echo esc_attr( $visibility ); ?>" /> 
     172 
    138173<input type="radio" name="visibility" id="visibility-radio-public" value="public" <?php checked( $visibility, 'public' ); ?> /> <label for="visibility-radio-public" class="selectit"><?php _e('Public'); ?></label><br /> 
     174 
     175<?php 
     176foreach( get_post_stati( array( 'public' => true, 'object_type' => $post_type ), 'object' ) as $_status => $_status_obj ) : 
     177        if ( 'publish' == $_status ) 
     178                continue; 
     179 
     180        $post_cap = "set_{$_status}_posts"; 
     181        if ( empty( $post_type_obj->cap->$post_cap ) || current_user_can( $post_type_obj->cap->$post_cap ) ) { 
     182?> 
     183<input type="radio" name="visibility" id="visibility-radio-<?php echo $_status ?>" value="<?php echo $_status ?>" <?php checked( $visibility, $_status ); ?> /> <label for="visibility-radio-<?php echo $_status ?>" class="selectit"><?php echo $_status_obj->labels->visibility ?></label><br />       
     184<?php  
     185        } // end if this user can set status 
     186endforeach ?> 
     187 
    139188<?php if ( $post_type == 'post' && current_user_can( 'edit_others_posts' ) ) : ?> 
    140189<span id="sticky-span"><input id="sticky" name="sticky" type="checkbox" value="sticky" <?php checked( is_sticky( $post->ID ) ); ?> tabindex="4" /> <label for="sticky" class="selectit"><?php _e( 'Stick this post to the front page' ); ?></label><br /></span> 
    141190<?php endif; ?> 
     191 
    142192<input type="radio" name="visibility" id="visibility-radio-password" value="password" <?php checked( $visibility, 'password' ); ?> /> <label for="visibility-radio-password" class="selectit"><?php _e('Password protected'); ?></label><br /> 
    143193<span id="password-span"><label for="post_password"><?php _e('Password:'); ?></label> <input type="text" name="post_password" id="post_password" value="<?php echo esc_attr($post->post_password); ?>" /><br /></span> 
    144 <input type="radio" name="visibility" id="visibility-radio-private" value="private" <?php checked( $visibility, 'private' ); ?> /> <label for="visibility-radio-private" class="selectit"><?php _e('Private'); ?></label><br /> 
    145194 
     195<?php 
     196foreach( get_post_stati( array( 'private' => true, 'object_type' => $post_type ), 'object' ) as $_status => $_status_obj ) : 
     197        $post_cap = "set_{$_status}_posts"; 
     198        if ( empty( $post_type_obj->cap->$post_cap ) || current_user_can( $post_type_obj->cap->$post_cap ) ) { 
     199?> 
     200<input type="radio" name="visibility" id="visibility-radio-<?php echo $_status ?>" value="<?php echo $_status ?>" <?php checked( $visibility, $_status ); ?> /> <label for="visibility-radio-<?php echo $_status ?>" class="selectit"><?php echo $_status_obj->label ?></label><br />    
     201<?php  
     202        } // end if this user can set status 
     203endforeach ?> 
    146204<p> 
    147205 <a href="#visibility" class="save-post-visibility hide-if-no-js button"><?php _e('OK'); ?></a> 
    148206 <a href="#visibility" class="cancel-post-visibility hide-if-no-js"><?php _e('Cancel'); ?></a> 
     
    155213<?php 
    156214// translators: Publish box date format, see http://php.net/date 
    157215$datef = __( 'M j, Y @ G:i' ); 
     216 
     217$published_stati = get_post_stati( array( 'public' => true, 'private' => true ), 'names', 'or' ); 
     218 
    158219if ( 0 != $post->ID ) { 
    159         if ( 'future' == $post->post_status ) { // scheduled for publishing at a future date 
     220        if ( 'future' == $post_status ) { // scheduled for publishing at a future date 
    160221                $stamp = __('Scheduled for: <b>%1$s</b>'); 
    161         } else if ( 'publish' == $post->post_status || 'private' == $post->post_status ) { // already published 
     222        } else if ( in_array( $post_status, $published_stati ) ) { // already published 
    162223                $stamp = __('Published on: <b>%1$s</b>'); 
    163224        } else if ( '0000-00-00 00:00:00' == $post->post_date_gmt ) { // draft, 1 or more saves, no date specified 
    164225                $stamp = __('Publish <b>immediately</b>'); 
     
    204265<div id="publishing-action"> 
    205266<img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" class="ajax-loading" id="ajax-loading" alt="" /> 
    206267<?php 
    207 if ( !in_array( $post->post_status, array('publish', 'future', 'private') ) || 0 == $post->ID ) { 
     268if ( ( ! $post_status_obj->public && ! $post_status_obj->private && ( 'future' != $post_status ) ) ) { 
    208269        if ( $can_publish ) : 
    209                 if ( !empty($post->post_date_gmt) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) : ?> 
    210                 <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Schedule') ?>" /> 
    211                 <?php submit_button( __( 'Schedule' ), 'primary', 'publish', false, array( 'tabindex' => '5', 'accesskey' => 'p' ) ); ?> 
    212 <?php   else : ?> 
    213                 <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Publish') ?>" /> 
    214                 <?php submit_button( __( 'Publish' ), 'primary', 'publish', false, array( 'tabindex' => '5', 'accesskey' => 'p' ) ); ?> 
     270 
     271                if ( !empty($post->post_date_gmt) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) :  
     272                $future_status_obj = get_post_status_object( 'future' ); 
     273                ?> 
     274                <input name="original_publish" type="hidden" id="original_publish" value="<?php echo $future_status_obj->labels->publish ?>" /> 
     275                <?php submit_button( $future_status_obj->labels->publish, 'primary', 'publish', false, array( 'tabindex' => '5', 'accesskey' => 'p' ) ); ?> 
     276<?php   else :  
     277                $publish_status_obj = get_post_status_object( 'publish' ); 
     278                ?> 
     279                <input name="original_publish" type="hidden" id="original_publish" value="<?php echo $publish_status_obj->labels->publish ?>" /> 
     280                <?php submit_button( $publish_status_obj->labels->publish, 'primary', 'publish', false, array( 'tabindex' => '5', 'accesskey' => 'p' ) ); ?> 
    215281<?php   endif; 
    216282        else : ?> 
    217                 <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Submit for Review') ?>" /> 
    218                 <?php submit_button( __( 'Submit for Review' ), 'primary', 'publish', false, array( 'tabindex' => '5', 'accesskey' => 'p' ) ); ?> 
     283                <?php 
     284                $moderation_button_status = apply_filters( 'post_moderation_status', 'pending', $post->ID ); 
     285 
     286                $status_obj = get_post_status_object( $moderation_button_status ); 
     287                $cap_name = "set_{$moderation_button_status}_posts"; 
     288 
     289                if ( ! $status_obj || ( ! empty($post_type_obj->cap->$cap_name) && ! current_user_can($post_type_obj->cap->$cap_name) ) ) 
     290                        $status_obj = get_post_status_object( 'pending' ); 
     291                ?> 
     292                <input name="original_publish" type="hidden" id="original_publish" value="<?php echo $status_obj->labels->publish ?>" /> 
     293                <?php submit_button( $status_obj->labels->publish, 'primary', 'publish', false, array( 'tabindex' => '5', 'accesskey' => 'p' ) ); ?> 
    219294<?php 
    220295        endif; 
    221296} else { ?> 
  • wp-admin/includes/nav-menu.php

     
    10391039 */ 
    10401040function _wp_nav_menu_meta_box_object( $object = null ) { 
    10411041        if ( isset( $object->name ) ) { 
     1042                $public_stati = apply_filters( 'nav_menu_metabox_stati', get_post_stati( array( 'public' => true, 'object_type' => $object->name ) ), $object ); 
     1043                $public_csv = implode( ',', $public_stati ); 
    10421044 
    10431045                if ( 'page' == $object->name ) { 
    10441046                        $object->_default_query = array( 
    10451047                                'orderby' => 'menu_order title', 
    1046                                 'post_status' => 'publish', 
     1048                                'post_status' => $public_csv, 
    10471049                        ); 
    10481050 
    1049                 // posts should show only published items 
     1051                // posts should show only public items 
    10501052                } elseif ( 'post' == $object->name ) { 
    10511053                        $object->_default_query = array( 
    1052                                 'post_status' => 'publish', 
     1054                                'post_status' => $public_csv, 
    10531055                        ); 
    10541056 
    10551057                // cats should be in reverse chronological order 
     
    10591061                                'order' => 'DESC', 
    10601062                        ); 
    10611063 
    1062                 // custom post types should show only published items 
     1064                // custom post types should show only public items 
    10631065                } else { 
    10641066                        $object->_default_query = array( 
    1065                                 'post_status' => 'publish', 
     1067                                'post_status' => $public_csv, 
    10661068                        ); 
    10671069                } 
    10681070        } 
  • wp-admin/js/post.dev.js

     
    380380                } 
    381381 
    382382                function updateText() { 
    383                         var attemptedDate, originalDate, currentDate, publishOn, postStatus = $('#post_status'), 
    384                                 optPublish = $('option[value="publish"]', postStatus), aa = $('#aa').val(), 
     383                        var attemptedDate, originalDate, currentDate, publishOn, 
     384                                postStatus = $('#post_status'), optPublish = $('option[value=publish]', postStatus), aa = $('#aa').val(), 
    385385                                mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val(); 
    386386 
    387387                        attemptedDate = new Date( aa, mm - 1, jj, hh, mn ); 
     
    405405                                publishOn = postL10n.publishOnPast; 
    406406                                $('#publish').val( postL10n.update ); 
    407407                        } 
     408 
    408409                        if ( originalDate.toUTCString() == attemptedDate.toUTCString() ) { //hack 
    409410                                $('#timestamp').html(stamp); 
    410411                        } else { 
     
    419420                        } 
    420421 
    421422                        if ( $('input:radio:checked', '#post-visibility-select').val() == 'private' ) { 
     423 
    422424                                $('#publish').val( postL10n.update ); 
    423425                                if ( optPublish.length == 0 ) { 
    424426                                        postStatus.append('<option value="publish">' + postL10n.privatelyPublished + '</option>'); 
    425427                                } else { 
    426428                                        optPublish.html( postL10n.privatelyPublished ); 
    427429                                } 
     430 
    428431                                $('option[value="publish"]', postStatus).prop('selected', true); 
     432 
    429433                                $('.edit-post-status', '#misc-publishing-actions').hide(); 
    430434                        } else { 
    431435                                if ( $('#original_post_status').val() == 'future' || $('#original_post_status').val() == 'draft' ) { 
     
    439443                                if ( postStatus.is(':hidden') ) 
    440444                                        $('.edit-post-status', '#misc-publishing-actions').show(); 
    441445                        } 
    442                         $('#post-status-display').html($('option:selected', postStatus).text()); 
    443                         if ( $('option:selected', postStatus).val() == 'private' || $('option:selected', postStatus).val() == 'publish' ) { 
    444                                 $('#save-post').hide(); 
    445                         } else { 
    446                                 $('#save-post').show(); 
    447                                 if ( $('option:selected', postStatus).val() == 'pending' ) { 
    448                                         $('#save-post').show().val( postL10n.savePending ); 
    449                                 } else { 
    450                                         $('#save-post').show().val( postL10n.saveDraft ); 
    451                                 } 
    452                         } 
     446 
    453447                        return true; 
    454448                } 
    455449 
     
    461455                        } 
    462456                        return false; 
    463457                }); 
    464  
     458                 
    465459                $('.cancel-post-visibility', '#post-visibility-select').click(function () { 
    466460                        $('#post-visibility-select').slideUp('fast'); 
    467461                        $('#visibility-radio-' + $('#hidden-post-visibility').val()).prop('checked', true); 
     
    469463                        $('#sticky').prop('checked', $('#hidden-post-sticky').prop('checked')); 
    470464                        $('#post-visibility-display').html(visibility); 
    471465                        $('.edit-visibility', '#visibility').show(); 
    472                         updateText(); 
    473466                        return false; 
    474467                }); 
    475  
     468                 
    476469                $('.save-post-visibility', '#post-visibility-select').click(function () { // crazyhorse - multiple ok cancels 
    477470                        var pvSelect = $('#post-visibility-select'); 
    478471 
    479472                        pvSelect.slideUp('fast'); 
    480473                        $('.edit-visibility', '#visibility').show(); 
    481                         updateText(); 
    482474 
     475 
    483476                        if ( $('input:radio:checked', pvSelect).val() != 'public' ) { 
    484477                                $('#sticky').prop('checked', false); 
    485478                        } // WEAPON LOCKED 
     
    489482                        } else { 
    490483                                sticky = ''; 
    491484                        } 
    492  
     485         
    493486                        $('#post-visibility-display').html(     postL10n[$('input:radio:checked', pvSelect).val() + sticky]     ); 
    494487                        return false; 
    495488                }); 
    496  
     489                 
    497490                $('input:radio', '#post-visibility-select').change(function() { 
    498491                        updateVisibility(); 
    499492                }); 
  • wp-admin/js/inline-edit-post.dev.js

     
    7878                        t.revert(); 
    7979                        $('select[name^="action"]').val('-1'); 
    8080                }); 
     81                 
     82                $('.keep-private, .keep-private input').click(function() { 
     83                        if ( $(this).attr('checked') ) { 
     84                                $('.keep-private input').filter("[name!='" + $(this).attr('name') + "']").removeAttr('checked'); 
     85                        } 
     86                }); 
    8187        }, 
    8288 
    8389        toggle : function(el){ 
     
    129135                if ( typeof(id) == 'object' ) 
    130136                        id = t.getId(id); 
    131137 
    132                 fields = ['post_title', 'post_name', 'post_author', '_status', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_password', 'post_format', 'menu_order']; 
     138                fields = ['post_title', 'post_name', 'post_author', '_status', 'scheduled_status', 'jj', 'mm', 'aa', 'hh', 'mn', 'ss', 'post_password', 'post_format', 'menu_order']; 
     139 
    133140                if ( t.type == 'page' ) 
    134141                        fields.push('post_parent', 'page_template'); 
    135142 
     
    198205 
    199206                // handle the post status 
    200207                status = $('._status', rowData).text(); 
    201                 if ( 'future' != status ) 
     208 
     209                if ( 'future' == status ) { 
     210                        status = $('.scheduled_status', rowData).text(); 
     211                } else { 
    202212                        $('select[name="_status"] option[value="future"]', editRow).remove(); 
     213                } 
    203214 
    204                 if ( 'private' == status ) { 
    205                         $('input[name="keep_private"]', editRow).prop("checked", true); 
    206                         $('input.inline-edit-password-input').val('').prop('disabled', true); 
     215                if ( $('[name=keep_' + status + ']').length > 0) { 
     216                        $('input[name="keep_' + status + '"]', editRow).prop("checked", "checked"); 
     217                        $('input.inline-edit-password-input').val('').prop('disabled', 'disabled'); 
    207218                } 
    208219 
    209220                // remove the current page and children from the parent dropdown 
  • wp-admin/post.php

     
    5151                                        $message = 9; 
    5252                                        break; 
    5353                                default: 
    54                                         $message = 6; 
     54                                        $status_obj = get_post_status_object( $status ); 
     55                                        if ( ! empty($status_obj->moderation) ) 
     56                                                $message = 11; 
     57                                        else 
     58                                                $message = 6; 
    5559                        } 
    5660                } else { 
    5761                                $message = 'draft' == $status ? 10 : 1; 
  • wp-admin/edit-form-advanced.php

     
    4545                // translators: Publish box date format, see http://php.net/date 
    4646                date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), 
    4747        10 => sprintf( __('Post draft updated. <a target="_blank" href="%s">Preview post</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 
     48        11 => sprintf( __('Post moderated. <a target="_blank" href="%s">Preview post</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 
    4849); 
    4950$messages['page'] = array( 
    5051         0 => '', // Unused. Messages start at index 1. 
     
    5859         8 => sprintf( __('Page submitted. <a target="_blank" href="%s">Preview page</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 
    5960         9 => sprintf( __('Page scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview page</a>'), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), 
    6061        10 => sprintf( __('Page draft updated. <a target="_blank" href="%s">Preview page</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 
     62        11 => sprintf( __('Page moderated. <a target="_blank" href="%s">Preview page</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 
    6163); 
    6264 
    6365$messages = apply_filters( 'post_updated_messages', $messages ); 
     
    140142if ( post_type_supports($post_type, 'comments') ) 
    141143        add_meta_box('commentstatusdiv', __('Discussion'), 'post_comment_status_meta_box', null, 'normal', 'core'); 
    142144 
    143 if ( ('publish' == $post->post_status || 'private' == $post->post_status) && post_type_supports($post_type, 'comments') ) 
     145if ( ! $post_status_object = get_post_status_object( $post->post_status ) ) 
     146        $post_status_object = get_post_status_object( 'draft' ); 
     147 
     148if ( ( $post_status_object->public || $post_status_object->private ) && post_type_supports($post_type, 'comments') ) 
    144149        add_meta_box('commentsdiv', __('Comments'), 'post_comment_meta_box', null, 'normal', 'core'); 
    145150 
    146 if ( !( 'pending' == $post->post_status && !current_user_can( $post_type_object->cap->publish_posts ) ) ) 
     151if ( ! ( $post_status_object->moderation && ! current_user_can( $post_type_object->cap->publish_posts ) ) ) 
    147152        add_meta_box('slugdiv', __('Slug'), 'post_slug_meta_box', null, 'normal', 'core'); 
    148153 
    149154if ( post_type_supports($post_type, 'author') ) { 
     
    292297if ( !empty($shortlink) ) 
    293298    $sample_permalink_html .= '<input id="shortlink" type="hidden" value="' . esc_attr($shortlink) . '" /><a href="#" class="button" onclick="prompt(&#39;URL:&#39;, jQuery(\'#shortlink\').val()); return false;">' . __('Get Shortlink') . '</a>'; 
    294299 
    295 if ( $post_type_object->public && ! ( 'pending' == $post->post_status && !current_user_can( $post_type_object->cap->publish_posts ) ) ) { ?> 
     300if ( $post_type_object->public && ! ( $post_status_object->moderation && ! current_user_can( $post_type_object->cap->publish_posts ) ) ) { ?> 
    296301        <div id="edit-slug-box"> 
    297302        <?php 
    298303                if ( ! empty($post->ID) && ! empty($sample_permalink_html) && 'auto-draft' != $post->post_status ) 
     
    385390try{document.post.title.focus();}catch(e){} 
    386391</script> 
    387392<?php endif; ?> 
     393 
     394 
     395<?php 
     396add_action( 'admin_print_footer_scripts', create_function('', "_edit_form_advanced_scripts('$post_type');") ); 
     397 
     398function _edit_form_advanced_scripts( $post_type ) { 
     399?> 
     400         
     401<script type="text/javascript"> 
     402//<![CDATA[ 
     403jQuery(document).ready( function($) { 
     404        function updateStatusCaptions() { 
     405                postStatus = $('#post_status'); 
     406 
     407                $('#post-status-display').html($('option:selected', postStatus).text()); 
     408 
     409                switch( $('option:selected', postStatus).val() ) { 
     410 
     411<?php foreach( get_post_stati( array( 'public' => true, 'private' => true ), 'object', 'or' ) as $_status => $_status_obj ): ?> 
     412                        case '<?php echo $_status ?>': 
     413                                $('#save-post').hide(); 
     414                                break; 
     415<?php endforeach; ?> 
     416 
     417<?php foreach( get_post_stati( array( 'moderation' => true, 'internal' => false, 'object_type' => $post_type ), 'object' ) as $_status => $_status_obj ): ?> 
     418                        case '<?php echo $_status ?>': 
     419                                $('#save-post').show().val( '<?php echo $_status_obj->labels->save_as ?>' ); 
     420                                break; 
     421<?php endforeach; ?> 
     422 
     423                        default : 
     424                                <?php $draft_status_obj = get_post_status_object( 'draft' ); ?>                  
     425                                $('#save-post').show().val( '<?php echo $draft_status_obj->labels->save_as ?>' ); 
     426                } 
     427        } 
     428 
     429        $('input:radio', '#post-visibility-select').change(function() { 
     430                switch ( $('input:radio:checked', '#post-visibility-select').val() ) { 
     431                        case 'public': 
     432                                $('#sticky-span').show(); 
     433                                break; 
     434 
     435<?php foreach( get_post_stati( array( 'public' => true, 'object_type' => $post_type ) ) as $_status ) : ?> 
     436                        case '<?php echo $_status ?>': 
     437                                $('#sticky-span').show(); 
     438                                break; 
     439<?php endforeach; ?> 
     440 
     441                        default : 
     442                                $('#sticky').attr('checked', false); 
     443                                $('#sticky-span').hide(); 
     444                } 
     445        }); 
     446         
     447        function updateVisibilityCaptions() { 
     448                var postStatus = $('#post_status'), optPublish = $('option[value=publish]', postStatus); 
     449 
     450                switch( $('input:radio:checked', '#post-visibility-select').val() ) { 
     451 
     452<?php foreach( get_post_stati( array( 'internal' => false, 'object_type' => $post_type ), 'object' ) as $_status => $_status_obj ) :  
     453                if ( ( 'publish' == $_status ) || ( ! $_status_obj->private && ! $_status_obj->public ) ) 
     454                        continue; 
     455?> 
     456                        case '<?php echo $_status ?>': 
     457                                $('#publish').val( postL10n.update ); 
     458 
     459                                if ( optPublish.length == 0 ) { 
     460                                        postStatus.append('<option value="publish">' + '<?php echo $_status_obj->labels->caption ?>' + '</option>'); 
     461                                } else { 
     462                                        optPublish.html( '<?php echo $_status_obj->labels->caption ?>' ); 
     463                                } 
     464 
     465                                $('option[value=publish]', postStatus).attr('selected', true); 
     466                                $('.edit-post-status', '#misc-publishing-actions').hide(); 
     467 
     468                                break; 
     469<?php endforeach; ?> 
     470 
     471                        default: 
     472                                if ( $('#original_post_status').val() == 'future' || $('#original_post_status').val() == 'draft' ) { 
     473                                        if ( optPublish.length ) { 
     474                                                optPublish.remove(); 
     475                                                postStatus.val($('#hidden_post_status').val()); 
     476                                        } 
     477                                } else { 
     478                                        optPublish.html( postL10n.published ); 
     479                                } 
     480                                if ( postStatus.is(':hidden') ) 
     481                                        $('.edit-post-status', '#misc-publishing-actions').show(); 
     482                } 
     483 
     484                return true; 
     485        } 
     486         
     487        $('.save-post-status', '#post-status-select').click(function() { 
     488                updateStatusCaptions(); 
     489                return false; 
     490        }); 
     491         
     492        $('.cancel-post-visibility', '#post-visibility-select').click(function () { 
     493                updateVisibilityCaptions(); 
     494                return false; 
     495        }); 
     496 
     497        $('.save-post-visibility', '#post-visibility-select').click(function () { // crazyhorse - multiple ok cancels 
     498                updateVisibilityCaptions(); 
     499                updateStatusCaptions(); 
     500                return false; 
     501        }); 
     502}); 
     503//]]> 
     504</script> 
     505 
     506<?php 
     507} // end function edit_form_advanced_scripts 
     508?> 
     509 No newline at end of file