WordPress.org

Make WordPress Core

Ticket #12706: 12706.db.3.diff

File 12706.db.3.diff, 32.5 KB (added by danielbachhuber, 14 months ago)
  • wp-admin/includes/class-wp-posts-list-table.php

     
    142142                $total_posts = array_sum( (array) $num_posts ); 
    143143 
    144144                // Subtract post types that are not included in the admin all list. 
    145                 foreach ( get_post_stati( array('show_in_admin_all_list' => false) ) as $state ) 
     145                foreach ( get_post_stati( array('show_in_admin_all_list' => false, 'post_type' => $post_type ) ) as $state ) 
    146146                        $total_posts -= $num_posts->$state; 
    147147 
    148148                $class = empty( $class ) && empty( $_REQUEST['post_status'] ) && empty( $_REQUEST['show_sticky'] ) ? ' class="current"' : ''; 
    149149                $status_links['all'] = "<a href='edit.php?post_type=$post_type{$allposts}'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_posts, 'posts' ), number_format_i18n( $total_posts ) ) . '</a>'; 
    150150 
    151                 foreach ( get_post_stati(array('show_in_admin_status_list' => true), 'objects') as $status ) { 
     151                foreach ( get_post_stati(array('show_in_admin_status_list' => true, 'post_type' => $post_type ), 'objects') as $status ) { 
    152152                        $class = ''; 
    153153 
    154154                        $status_name = $status->name; 
     
    279279                } 
    280280 
    281281                $post_status = !empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all'; 
    282                 if ( post_type_supports( $post_type, 'comments' ) && !in_array( $post_status, array( 'pending', 'draft', 'future' ) ) ) 
     282                if ( post_type_supports( $post_type, 'comments' ) && ! in_array( $post_status, get_post_stati( array( 'protected' => true, 'post_type' => $post_type ) ) ) ) 
    283283                        $posts_columns['comments'] = '<span class="vers"><div title="' . esc_attr__( 'Comments' ) . '" class="comment-grey-bubble"></div></span>'; 
    284284 
    285285                $posts_columns['date'] = __( 'Date' ); 
     
    572572                                                $actions['delete'] = "<a class='submitdelete' title='" . esc_attr( __( 'Delete this item permanently' ) ) . "' href='" . get_delete_post_link( $post->ID, '', true ) . "'>" . __( 'Delete Permanently' ) . "</a>"; 
    573573                                } 
    574574                                if ( $post_type_object->public ) { 
    575                                         if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ) ) ) { 
     575                                        if ( in_array( $post->post_status, get_post_stati( array( 'protected' => true, 'post_type' => $post->post_type ) ) ) ) { 
    576576                                                if ( $can_edit_post ) 
    577577                                                        $actions['view'] = '<a href="' . esc_url( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) ) . '" title="' . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $title ) ) . '" rel="permalink">' . __( 'Preview' ) . '</a>'; 
    578578                                        } elseif ( 'trash' != $post->post_status ) { 
     
    610610                                else 
    611611                                        echo '<abbr title="' . $t_time . '">' . apply_filters( 'post_date_column_time', $h_time, $post, $column_name, $mode ) . '</abbr>'; 
    612612                                echo '<br />'; 
    613                                 if ( 'publish' == $post->post_status ) { 
     613                                if ( in_array( $post->post_status, get_post_stati( array( 'public' => true ), $post->post_type ) ) ) { 
    614614                                        _e( 'Published' ); 
    615615                                } elseif ( 'future' == $post->post_status ) { 
    616616                                        if ( $time_diff > 0 ) 
     
    972972                                <label class="inline-edit-status alignleft"> 
    973973                                        <span class="title"><?php _e( 'Status' ); ?></span> 
    974974                                        <select name="_status"> 
    975         <?php if ( $bulk ) : ?> 
    976                                                 <option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option> 
    977         <?php endif; // $bulk ?> 
    978                                         <?php if ( $can_publish ) : // Contributors only get "Unpublished" and "Pending Review" ?> 
    979                                                 <option value="publish"><?php _e( 'Published' ); ?></option> 
    980                                                 <option value="future"><?php _e( 'Scheduled' ); ?></option> 
    981         <?php if ( $bulk ) : ?> 
    982                                                 <option value="private"><?php _e( 'Private' ) ?></option> 
    983         <?php endif; // $bulk ?> 
    984                                         <?php endif; ?> 
    985                                                 <option value="pending"><?php _e( 'Pending Review' ); ?></option> 
    986                                                 <option value="draft"><?php _e( 'Draft' ); ?></option> 
     975                                        <?php 
     976                                                $statuses = array(); 
     977                                                if ( $bulk ) 
     978                                                        $statuses['-1'] = _e( '&mdash; No Change &mdash;' ); 
     979                                                if ( $can_publish ) { 
     980                                                        $public_stati = get_post_stati( array( 'public' => true, 'post_type' => $screen->post_type ), 'objects' ); 
     981                                                        foreach( $public_stati as $status ) { 
     982                                                                $statuses[$status->name] = $status->labels['label']; 
     983                                                        } 
     984                                                        if ( $bulk ) { 
     985                                                                $private_stati = get_post_stati( array( 'private' => true, 'post_type' => $screen->post_type ), 'objects' ); 
     986                                                                foreach( $private_stati as $status ) { 
     987                                                                        $statuses[$status->name] = $status->labels['label']; 
     988                                                                } 
     989                                                        } 
     990                                                } 
     991                                                $moderation_stati = get_post_stati( array( 'moderation' => true, 'post_type' => $screen->post_type ), 'objects' ); 
     992                                                foreach( $moderation_stati as $status ) { 
     993                                                        $statuses[$status->name] = $status->labels['label']; 
     994                                                } 
     995                                                foreach( $statuses as $status_key => $status_label ) : ?> 
     996                                                <option value="<?php echo esc_attr( $status_key ); ?>"><?php echo esc_html( $status_label ); ?></option> 
     997                                                <?php endforeach; ?> 
    987998                                        </select> 
    988999                                </label> 
    9891000 
  • wp-admin/includes/post.php

     
    9393        $previous_status = $post_id ? get_post_field( 'post_status', $post_id ) : false; 
    9494 
    9595        // Posts 'submitted for approval' present are submitted to $_POST the same as if they were being published. 
    96         // Change status from 'publish' to 'pending' if user lacks permissions to publish or to resave published posts. 
     96        // Change status from 'publish' to the next available moderation status 
    9797        if ( isset($post_data['post_status']) && ('publish' == $post_data['post_status'] && !current_user_can( $ptype->cap->publish_posts )) ) 
    98                 if ( $previous_status != 'publish' || !current_user_can( 'edit_post', $post_id ) ) 
    99                         $post_data['post_status'] = 'pending'; 
     98                if ( $previous_status != 'publish' || !current_user_can( 'edit_post', $post_id ) ) { 
     99                        $moderation_statuses = array_values( get_post_stati( array( 'moderation' => true, 'post_type' => $ptype->name ) ) ); 
     100                        $next_status = array_search( $previous_status, $moderation_statuses ) + 1; 
     101                        if ( ! empty( $moderation_statuses[$next_status] ) ) 
     102                                $post_data['post_status'] = $moderation_statuses[$next_status]; 
     103                        else 
     104                                $post_data['post_status'] = $previous_status; 
     105                } 
    100106 
    101107        if ( ! isset($post_data['post_status']) ) 
    102108                $post_data['post_status'] = $previous_status; 
     
    172178        if ( is_wp_error($post_data) ) 
    173179                wp_die( $post_data->get_error_message() ); 
    174180        if ( ( empty( $post_data['action'] ) || 'autosave' != $post_data['action'] ) && 'auto-draft' == $post_data['post_status'] ) { 
    175                 $post_data['post_status'] = 'draft'; 
     181                $moderation_statuses = array_shift( array_keys( get_post_stati( array( 'moderation' => true, 'post_type' => $post_data['post_type'] ) ) ) ); 
     182                $post_data['post_status'] = $moderation_statuses[0]; 
    176183        } 
    177184 
    178185        if ( isset($post_data['visibility']) ) { 
     
    9931000 
    9941001        // Hack: get_permalink would return ugly permalink for 
    9951002        // drafts, so we will fake, that our post is published 
    996         if ( in_array($post->post_status, array('draft', 'pending')) ) { 
     1003        if ( in_array($post->post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post->post_type ) )) ) { 
    9971004                $post->post_status = 'publish'; 
    9981005                $post->post_name = sanitize_title($post->post_name ? $post->post_name : $post->post_title, $post->ID); 
    9991006        } 
  • wp-admin/includes/meta-boxes.php

     
    1414 
    1515        $post_type = $post->post_type; 
    1616        $post_type_object = get_post_type_object($post_type); 
     17 
     18        if ( 'auto-draft' == $post->post_status ) 
     19                $post_status = array_shift( get_post_stati( array( 'moderation' => true, 'post_type' => $post->post_type ), 'objects' ) ); 
     20        else  
     21                $post_status = get_post_status_object( $post->post_status, $post->post_type ); 
     22 
    1723        $can_publish = current_user_can($post_type_object->cap->publish_posts); 
    1824?> 
    1925<div class="submitbox" id="submitpost"> 
     
    2733 
    2834<div id="minor-publishing-actions"> 
    2935<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'); ?>" class="button" /> 
    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'); ?>" class="button" /> 
    34 <?php } ?> 
     36<?php if ( $post_status->moderation ) : ?> 
     37<input type="submit" name="save" id="save-post" value="<?php echo esc_attr( $post_status->labels['save'] ); ?>" class="button" /> 
     38<?php endif; ?> 
    3539<span class="spinner"></span> 
    3640</div> 
    3741<?php if ( $post_type_object->public ) : ?> 
    3842<div id="preview-action"> 
    3943<?php 
    40 if ( 'publish' == $post->post_status ) { 
     44if ( $post_status->public ) { 
    4145        $preview_link = esc_url( get_permalink( $post->ID ) ); 
    4246        $preview_button = __( 'Preview Changes' ); 
    4347} else { 
     
    5559 
    5660<div id="misc-publishing-actions"> 
    5761 
    58 <div class="misc-pub-section"><label for="post_status"><?php _e('Status:') ?></label> 
    59 <span id="post-status-display"> 
    60 <?php 
    61 switch ( $post->post_status ) { 
    62         case 'private': 
    63                 _e('Privately Published'); 
    64                 break; 
    65         case 'publish': 
    66                 _e('Published'); 
    67                 break; 
    68         case 'future': 
    69                 _e('Scheduled'); 
    70                 break; 
    71         case 'pending': 
    72                 _e('Pending Review'); 
    73                 break; 
    74         case 'draft': 
    75         case 'auto-draft': 
    76                 _e('Draft'); 
    77                 break; 
    78 } 
    79 ?> 
    80 </span> 
    81 <?php if ( 'publish' == $post->post_status || 'private' == $post->post_status || $can_publish ) { ?> 
    82 <a href="#post_status" <?php if ( 'private' == $post->post_status ) { ?>style="display:none;" <?php } ?>class="edit-post-status hide-if-no-js"><?php _e('Edit') ?></a> 
     62        <div class="misc-pub-section"><label for="post_status"><?php _e('Status:') ?></label> 
     63        <span id="post-status-display"><?php echo esc_html( $post_status->labels['label'] ); ?></span> 
    8364 
    84 <div id="post-status-select" class="hide-if-js"> 
    85 <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); ?>" /> 
    86 <select name='post_status' id='post_status'> 
    87 <?php if ( 'publish' == $post->post_status ) : ?> 
    88 <option<?php selected( $post->post_status, 'publish' ); ?> value='publish'><?php _e('Published') ?></option> 
    89 <?php elseif ( 'private' == $post->post_status ) : ?> 
    90 <option<?php selected( $post->post_status, 'private' ); ?> value='publish'><?php _e('Privately Published') ?></option> 
    91 <?php elseif ( 'future' == $post->post_status ) : ?> 
    92 <option<?php selected( $post->post_status, 'future' ); ?> value='future'><?php _e('Scheduled') ?></option> 
    93 <?php endif; ?> 
    94 <option<?php selected( $post->post_status, 'pending' ); ?> value='pending'><?php _e('Pending Review') ?></option> 
    95 <?php if ( 'auto-draft' == $post->post_status ) : ?> 
    96 <option<?php selected( $post->post_status, 'auto-draft' ); ?> value='draft'><?php _e('Draft') ?></option> 
    97 <?php else : ?> 
    98 <option<?php selected( $post->post_status, 'draft' ); ?> value='draft'><?php _e('Draft') ?></option> 
    99 <?php endif; ?> 
    100 </select> 
     65        <?php 
     66        $dropdown_statuses = array(); 
     67        // All statuses like 'future', 'publish', and 'private' should appear in dropdown only when post 
     68        // is in that status 
     69        if ( ! $post_status->moderation && $can_publish ) 
     70                $dropdown_statuses[] = $post_status; 
     71 
     72        // A post in moderation can be changed to other moderation stati, regardless of publish caps 
     73        $dropdown_statuses = array_merge( $dropdown_statuses, get_post_stati( array( 'moderation' => true, 'post_type' => $post->post_type ), 'objects' ) ); 
     74 
     75        if ( ! empty( $dropdown_statuses ) && ! $post_status->private ) : ?> 
     76        <a href="#post_status" class="edit-post-status hide-if-no-js"><?php _e('Edit') ?></a> 
     77 
     78        <div id="post-status-select" class="hide-if-js"> 
     79        <input type="hidden" name="hidden_post_status" id="hidden_post_status" value="<?php echo $post_status->name; ?>" /> 
     80        <select name='post_status' id='post_status'> 
     81        <?php foreach( $dropdown_statuses as $dropdown_status ) : ?> 
     82                <option <?php selected( $dropdown_status->name, $post_status->name ); ?> value="<?php echo $dropdown_status->name; ?>"><?php echo esc_attr( $dropdown_status->labels['label'] ); ?></option> 
     83        <?php endforeach; ?> 
     84        </select> 
    10185 <a href="#post_status" class="save-post-status hide-if-no-js button"><?php _e('OK'); ?></a> 
    10286 <a href="#post_status" class="cancel-post-status hide-if-no-js"><?php _e('Cancel'); ?></a> 
    10387</div> 
    10488 
    105 <?php } ?> 
     89<?php endif; ?> 
    10690</div><!-- .misc-pub-section --> 
    10791 
    10892<div class="misc-pub-section" id="visibility"> 
    10993<?php _e('Visibility:'); ?> <span id="post-visibility-display"><?php 
    11094 
    111 if ( 'private' == $post->post_status ) { 
     95if ( $post_status->private ) { 
    11296        $post->post_password = ''; 
    11397        $visibility = 'private'; 
    11498        $visibility_trans = __('Private'); 
     
    202186<div id="publishing-action"> 
    203187<span class="spinner"></span> 
    204188<?php 
    205 if ( !in_array( $post->post_status, array('publish', 'future', 'private') ) || 0 == $post->ID ) { 
     189if ( $post_status->moderation || 0 == $post->ID ) { 
    206190        if ( $can_publish ) : 
    207191                if ( !empty($post->post_date_gmt) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) : ?> 
    208192                <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Schedule') ?>" /> 
     
    212196                <?php submit_button( __( 'Publish' ), 'primary button-large', 'publish', false, array( 'accesskey' => 'p' ) ); ?> 
    213197<?php   endif; 
    214198        else : ?> 
    215                 <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Submit for Review') ?>" /> 
    216                 <?php submit_button( __( 'Submit for Review' ), 'primary button-large', 'publish', false, array( 'accesskey' => 'p' ) ); ?> 
     199                <input name="original_publish" type="hidden" id="original_publish" value="<?php echo esc_attr( $post_status->labels['save_next'] ); ?>" /> 
     200                <?php submit_button( $post_status->labels['save_next'], 'primary button-large', 'publish', false, array( 'accesskey' => 'p' ) ); ?> 
    217201<?php 
    218202        endif; 
    219203} else { ?> 
  • wp-admin/includes/template.php

     
    577577        $post = get_post(); 
    578578 
    579579        if ( $for_post ) 
    580                 $edit = ! ( in_array($post->post_status, array('draft', 'pending') ) && (!$post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) ); 
     580                $edit = ! ( in_array($post->post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post->post_type ) ) ) && (!$post->post_date_gmt || '0000-00-00 00:00:00' == $post->post_date_gmt ) ); 
    581581 
    582582        $tab_index_attribute = ''; 
    583583        if ( (int) $tab_index > 0 ) 
     
    14241424        else 
    14251425                $post_status = ''; 
    14261426 
    1427         if ( !empty($post->post_password) ) 
     1427        if ( !empty( $post->post_password ) ) 
    14281428                $post_states['protected'] = __('Password protected'); 
    1429         if ( 'private' == $post->post_status && 'private' != $post_status ) 
    1430                 $post_states['private'] = __('Private'); 
    1431         if ( 'draft' == $post->post_status && 'draft' != $post_status ) 
    1432                 $post_states['draft'] = __('Draft'); 
    1433         if ( 'pending' == $post->post_status && 'pending' != $post_status ) 
    1434                 /* translators: post state */ 
    1435                 $post_states['pending'] = _x('Pending', 'post state'); 
     1429 
     1430        foreach( array( 'protected', 'private' ) as $status_type ) { 
     1431                $type_stati = get_post_stati( array( $status_type => true, 'post_type' => $post->post_type ) ); 
     1432                if ( in_array( $post->post_status, $type_stati ) && ! in_array( $post_status, $type_stati ) ) 
     1433                        $post_states[$post->post_status] = get_post_status_object( $post->post_status, $post->post_type )->labels['label']; 
     1434        } 
     1435 
    14361436        if ( is_sticky($post->ID) ) 
    14371437                $post_states['sticky'] = __('Sticky'); 
    14381438 
  • wp-admin/js/post.js

     
    453453                                        $('.edit-post-status', '#misc-publishing-actions').show(); 
    454454                        } 
    455455                        $('#post-status-display').html($('option:selected', postStatus).text()); 
    456                         if ( $('option:selected', postStatus).val() == 'private' || $('option:selected', postStatus).val() == 'publish' ) { 
     456                        var $selectedStatus = postL10n.postStati[$('option:selected', postStatus).val()]; 
     457                        if ( $selectedStatus.private || $selectedStatus.public ) { 
    457458                                $('#save-post').hide(); 
    458459                        } else { 
    459                                 $('#save-post').show(); 
    460                                 if ( $('option:selected', postStatus).val() == 'pending' ) { 
    461                                         $('#save-post').show().val( postL10n.savePending ); 
    462                                 } else { 
    463                                         $('#save-post').show().val( postL10n.saveDraft ); 
    464                                 } 
     460                                $('#save-post').show().val( $selectedStatus.labels['save'] ); 
    465461                        } 
    466462                        return true; 
    467463                } 
  • wp-includes/post-template.php

     
    109109                if ( ! empty( $post->post_password ) ) { 
    110110                        $protected_title_format = apply_filters( 'protected_title_format', __( 'Protected: %s' ) ); 
    111111                        $title = sprintf( $protected_title_format, $title ); 
    112                 } else if ( isset( $post->post_status ) && 'private' == $post->post_status ) { 
     112                } else if ( isset( $post->post_status ) && get_post_status_object( $post->post_status, $post->post_type )->private ) { 
    113113                        $private_title_format = apply_filters( 'private_title_format', __( 'Private: %s' ) ); 
    114114                        $title = sprintf( $private_title_format, $title ); 
    115115                } 
     
    698698        if ( 1 == $i ) { 
    699699                $url = get_permalink(); 
    700700        } else { 
    701                 if ( '' == get_option('permalink_structure') || in_array($post->post_status, array('draft', 'pending')) ) 
     701                if ( '' == get_option('permalink_structure') || in_array( $post->post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post->post_type ) ) ) ) 
    702702                        $url = add_query_arg( 'page', $i, get_permalink() ); 
    703703                elseif ( 'page' == get_option('show_on_front') && get_option('page_on_front') == $post->ID ) 
    704704                        $url = trailingslashit(get_permalink()) . user_trailingslashit("$wp_rewrite->pagination_base/" . $i, 'single_paged'); 
  • wp-includes/post.php

     
    121121        ) ); 
    122122 
    123123        register_post_status( 'draft', array( 
    124                 'label'       => _x( 'Draft', 'post' ), 
     124                'labels'      => array( 
     125                                'label'         => _x( 'Draft', 'post' ), 
     126                                'save_next'     => _x( 'Submit for Review', 'post' ), 
     127                        ), 
    125128                'protected'   => true, 
     129                'moderation'  => true, 
    126130                '_builtin'    => true, /* internal use only. */ 
    127131                'label_count' => _n_noop( 'Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>' ), 
     132                'show_in_admin_status_dropdown' => true, 
    128133        ) ); 
    129134 
    130135        register_post_status( 'pending', array( 
    131                 'label'       => _x( 'Pending', 'post' ), 
     136                'labels'      => array( 
     137                                'label'         => _x( 'Pending', 'post' ), 
     138                                'save'          => _x( 'Save as Pending', 'post' ), 
     139                        ), 
    132140                'protected'   => true, 
     141                'moderation'  => true, 
    133142                '_builtin'    => true, /* internal use only. */ 
    134143                'label_count' => _n_noop( 'Pending <span class="count">(%s)</span>', 'Pending <span class="count">(%s)</span>' ), 
     144                'show_in_admin_status_dropdown' => true, 
    135145        ) ); 
    136146 
    137147        register_post_status( 'private', array( 
     
    673683} 
    674684 
    675685/** 
     686 * WordPress Post Status class. 
     687 * 
     688 * @since 3.6.0 
     689 * 
     690 */ 
     691final class WP_Post_Status { 
     692 
     693        /** 
     694         * 
     695         * @var string 
     696         */ 
     697        public $name = ''; 
     698 
     699        /** 
     700         * 
     701         * @var string 
     702         */ 
     703        public $label = false; 
     704 
     705        /** 
     706         * 
     707         * @var array 
     708         */ 
     709        public $label_count = false; 
     710 
     711        /** 
     712         * 
     713         * @var labels 
     714         */ 
     715        public $labels = array(); 
     716 
     717        /** 
     718         * 
     719         * @var bool 
     720         */ 
     721        public $exclude_from_search = null; 
     722 
     723        /** 
     724         * 
     725         * @var bool 
     726         */ 
     727        public $_builtin = false; 
     728 
     729        /** 
     730         * 
     731         * @var bool 
     732         */ 
     733        public $public = null; 
     734 
     735        /** 
     736         * 
     737         * @var bool 
     738         */ 
     739        public $internal = null; 
     740 
     741        /** 
     742         * 
     743         * @var bool 
     744         */ 
     745        public $protected = null; 
     746 
     747        /** 
     748         * 
     749         * @var bool 
     750         */ 
     751        public $moderation = null; 
     752 
     753        /** 
     754         * 
     755         * @var bool 
     756         */ 
     757        public $private = null; 
     758 
     759        /** 
     760         * 
     761         * @var array 
     762         */ 
     763        public $post_type = null; 
     764 
     765        /** 
     766         * 
     767         * @var bool 
     768         */ 
     769        public $publicly_queryable = null; 
     770 
     771        /** 
     772         * 
     773         * @var bool 
     774         */ 
     775        public $show_in_admin_status_list = null; 
     776 
     777        /** 
     778         * 
     779         * @var bool 
     780         */ 
     781        public $show_in_admin_all_list = null; 
     782 
     783        /** 
     784         * 
     785         * @var bool 
     786         */ 
     787        public $show_in_admin_status_dropdown = false; 
     788 
     789        public function __construct( $post_status, $args = array() ) { 
     790 
     791                $args = (object) $args; 
     792                foreach ( get_object_vars( $args ) as $key => $value ) 
     793                        $this->$key = $value; 
     794 
     795                $this->name = sanitize_key( $post_status ); 
     796 
     797                if ( null === $this->public && null === $this->internal && null === $this->protected && null === $this->private && null === $this->moderation ) 
     798                        $this->internal = true; 
     799 
     800                if ( null === $this->public ) 
     801                        $this->public = false; 
     802 
     803                if ( null === $this->private ) 
     804                        $this->private = false; 
     805 
     806                if ( null === $this->protected ) 
     807                        $this->protected = false; 
     808 
     809                if ( null === $this->moderation ) 
     810                        $this->moderation = false; 
     811 
     812                if ( null === $this->internal ) 
     813                        $this->internal = false; 
     814 
     815                if ( null === $this->publicly_queryable ) 
     816                        $this->publicly_queryable = $this->public; 
     817 
     818                if ( null === $this->exclude_from_search ) 
     819                        $this->exclude_from_search = $this->internal; 
     820 
     821                if ( null === $this->show_in_admin_all_list ) 
     822                        $this->show_in_admin_all_list = !$this->internal; 
     823 
     824                if ( null === $this->show_in_admin_status_list ) 
     825                        $this->show_in_admin_status_list = !$this->internal; 
     826 
     827                if ( null === $this->show_in_admin_status_dropdown ) 
     828                        $this->show_in_admin_status_dropdown = $this->moderation; 
     829 
     830                if ( empty( $this->labels['label'] ) ) 
     831                        $this->labels['label'] = ( null !== $this->label ) ? $this->label : $post_status; 
     832 
     833                if ( empty( $this->labels['label_count'] ) ) 
     834                        $this->labels['label_count'] = ( null !== $this->label_count ) ? $this->label_count : array( $this->label, $this->label ); 
     835 
     836                if ( empty( $this->labels['save'] ) ) 
     837                        $this->labels['save'] = sprintf( _x( 'Save %s', 'post'), $this->labels['label'] ); 
     838 
     839                if ( empty( $this->labels['save_next'] ) ) 
     840                        $this->labels['save_next'] = _x( 'Submit', 'post'); 
     841 
     842                if ( is_string( $this->post_type ) ) 
     843                        $this->post_type = array( $this->post_type ); 
     844        } 
     845} 
     846 
     847/** 
    676848 * Retrieve ancestors of a post. 
    677849 * 
    678850 * @since 2.5.0 
     
    9201092 * @param array|string $args See above description. 
    9211093 */ 
    9221094function register_post_status($post_status, $args = array()) { 
    923         global $wp_post_statuses; 
     1095        global $wp_post_statuses, $wp_post_types; 
    9241096 
    9251097        if (!is_array($wp_post_statuses)) 
    9261098                $wp_post_statuses = array(); 
    9271099 
    928         // Args prefixed with an underscore are reserved for internal use. 
    929         $defaults = array( 
    930                 'label' => false, 
    931                 'label_count' => false, 
    932                 'exclude_from_search' => null, 
    933                 '_builtin' => false, 
    934                 'public' => null, 
    935                 'internal' => null, 
    936                 'protected' => null, 
    937                 'private' => null, 
    938                 'publicly_queryable' => null, 
    939                 'show_in_admin_status_list' => null, 
    940                 'show_in_admin_all_list' => null, 
    941         ); 
    942         $args = wp_parse_args($args, $defaults); 
    943         $args = (object) $args; 
     1100        $args = new WP_Post_Status( $post_status, $args ); 
     1101        $wp_post_statuses[ $post_status ] = $args; 
    9441102 
    945         $post_status = sanitize_key($post_status); 
    946         $args->name = $post_status; 
     1103        // Add status to already registered post types 
     1104        if ( ! empty( $wp_post_types ) ) 
     1105                foreach ( $wp_post_types as $key => $post_type ) { 
     1106                        if ( ! empty( $args->post_type ) && ! in_array( $key, $args->post_type ) ) 
     1107                                continue; 
    9471108 
    948         if ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private ) 
    949                 $args->internal = true; 
     1109                        if ( ! array_key_exists( $post_status, $post_type->statuses ) ) 
     1110                                $wp_post_types[ $key ]->statuses[ $post_status ] = $args; 
     1111                } 
    9501112 
    951         if ( null === $args->public  ) 
    952                 $args->public = false; 
    953  
    954         if ( null === $args->private  ) 
    955                 $args->private = false; 
    956  
    957         if ( null === $args->protected  ) 
    958                 $args->protected = false; 
    959  
    960         if ( null === $args->internal  ) 
    961                 $args->internal = false; 
    962  
    963         if ( null === $args->publicly_queryable ) 
    964                 $args->publicly_queryable = $args->public; 
    965  
    966         if ( null === $args->exclude_from_search ) 
    967                 $args->exclude_from_search = $args->internal; 
    968  
    969         if ( null === $args->show_in_admin_all_list ) 
    970                 $args->show_in_admin_all_list = !$args->internal; 
    971  
    972         if ( null === $args->show_in_admin_status_list ) 
    973                 $args->show_in_admin_status_list = !$args->internal; 
    974  
    975         if ( false === $args->label ) 
    976                 $args->label = $post_status; 
    977  
    978         if ( false === $args->label_count ) 
    979                 $args->label_count = array( $args->label, $args->label ); 
    980  
    981         $wp_post_statuses[$post_status] = $args; 
    982  
    9831113        return $args; 
    9841114} 
    9851115 
     
    9961126 * @param string $post_status The name of a registered post status 
    9971127 * @return object A post status object 
    9981128 */ 
    999 function get_post_status_object( $post_status ) { 
     1129function get_post_status_object( $post_status, $object_type = null ) { 
    10001130        global $wp_post_statuses; 
    10011131 
    1002         if ( empty($wp_post_statuses[$post_status]) ) 
    1003                 return null; 
     1132        $status_object = null; 
    10041133 
    1005         return $wp_post_statuses[$post_status]; 
     1134        if ( $object_type ) { 
     1135                $post_type = get_post_type_object( $object_type ); 
     1136                if ( $post_type && ! empty( $post_type->statuses[ $post_status ] ) ) 
     1137                        $status_object = $post_type->statuses[ $post_status ]; 
     1138        } 
     1139 
     1140        if ( ! empty( $wp_post_statuses[ $post_status ] ) ) 
     1141                $status = $wp_post_statuses[ $post_status ]; 
     1142 
     1143        // Search across all post types 
     1144        foreach ( get_post_types( array(), 'objects' ) as $post_type ) { 
     1145                if ( ! empty( $post_type->statuses[ $post_status ] ) ) { 
     1146                        $status_object = $post_type->statuses[ $post_status ]; 
     1147                        break; 
     1148                } 
     1149        } 
     1150 
     1151        return $status_object; 
    10061152} 
    10071153 
    10081154/** 
     
    10261172 
    10271173        $field = ('names' == $output) ? 'name' : false; 
    10281174 
    1029         return wp_filter_object_list($wp_post_statuses, $args, $operator, $field); 
     1175        $statuses = $wp_post_statuses; 
     1176 
     1177        if ( ! empty( $args['post_type'] ) ) { 
     1178                $post_type = get_post_type_object( $args['post_type'] ); 
     1179                if ( $post_type && ! empty( $post_type->statuses ) ) 
     1180                        $statuses = $post_type->statuses; 
     1181 
     1182                unset( $args['post_type'] ); 
     1183        } 
     1184 
     1185        return wp_filter_object_list( $statuses, $args, $operator, $field ); 
    10301186} 
    10311187 
    10321188/** 
     
    12111367 * @return object|WP_Error the registered post type object, or an error object 
    12121368 */ 
    12131369function register_post_type( $post_type, $args = array() ) { 
    1214         global $wp_post_types, $wp_rewrite, $wp; 
     1370        global $wp_post_types, $wp_rewrite, $wp, $wp_post_statuses; 
    12151371 
    12161372        if ( !is_array($wp_post_types) ) 
    12171373                $wp_post_types = array(); 
     
    12271383                'can_export' => true, 
    12281384                'show_in_nav_menus' => null, 'show_in_menu' => null, 'show_in_admin_bar' => null, 
    12291385                'delete_with_user' => null, 
     1386                'statuses' => null, 
    12301387        ); 
    12311388        $args = wp_parse_args($args, $defaults); 
    12321389        $args = (object) $args; 
     
    13361493        if ( $args->register_meta_box_cb ) 
    13371494                add_action('add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1); 
    13381495 
     1496        if ( null === $args->statuses ) 
     1497                $args->statuses = array(); 
     1498 
     1499        foreach ( $args->statuses as $post_status => $post_status_args ) 
     1500                $args->statuses[ $post_status ] = new WP_Post_Status( $post_status, $post_status_args ); 
     1501 
     1502        // Legacy post statuses 
     1503        if ( ! empty( $wp_post_statuses ) ) 
     1504                foreach ( $wp_post_statuses as $key => $post_status ) 
     1505                        if ( empty( $args->statuses[ $key ] ) ) 
     1506                                $args->statuses[ $key ] = $post_status; 
     1507 
    13391508        $args->labels = get_post_type_labels( $args ); 
    13401509        $args->label = $args->labels->name; 
    13411510 
     
    21422311        $count = $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A ); 
    21432312 
    21442313        $stats = array(); 
    2145         foreach ( get_post_stati() as $state ) 
     2314        foreach ( get_post_stati( array( 'post_type' => $type ) ) as $state ) 
    21462315                $stats[$state] = 0; 
    21472316 
    21482317        foreach ( (array) $count as $row ) 
     
    27362905        if ( empty($post_type) ) 
    27372906                $post_type = 'post'; 
    27382907 
    2739         if ( empty($post_status) ) 
    2740                 $post_status = 'draft'; 
     2908        if ( empty($post_status) ) { 
     2909                $post_status = array_shift( get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ); 
     2910        } 
    27412911 
    27422912        if ( !empty($post_category) ) 
    27432913                $post_category = array_filter($post_category); // Filter out empty terms 
     
    27672937        if ( 'pending' == $post_status && !current_user_can( 'publish_posts' ) ) 
    27682938                $post_name = ''; 
    27692939 
    2770         // Create a valid post name. Drafts and pending posts are allowed to have an empty 
    2771         // post name. 
     2940        // Create a valid post name. Posts in moderation are allowed to have an empty post_name 
    27722941        if ( empty($post_name) ) { 
    2773                 if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) 
     2942                if ( 'auto-draft' != $post_status  
     2943                        && ! in_array( $post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ) ) 
    27742944                        $post_name = sanitize_title($post_title); 
    27752945                else 
    27762946                        $post_name = ''; 
     
    28002970                } 
    28012971 
    28022972        if ( empty($post_date_gmt) || '0000-00-00 00:00:00' == $post_date_gmt ) { 
    2803                 if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) 
     2973                if ( 'auto-draft' != $post_status  
     2974                        && ! in_array( $post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ) ) 
    28042975                        $post_date_gmt = get_gmt_from_date($post_date); 
    28052976                else 
    28062977                        $post_date_gmt = '0000-00-00 00:00:00'; 
     
    28953066                $where = array( 'ID' => $post_ID ); 
    28963067        } 
    28973068 
    2898         if ( empty($data['post_name']) && !in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) { 
     3069        if ( empty($data['post_name'])  
     3070                && 'auto-draft' != $data['post_status'] 
     3071                && ! in_array( $data['post_status'], get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ) ) { 
    28993072                $data['post_name'] = sanitize_title($data['post_title'], $post_ID); 
    29003073                $wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where ); 
    29013074        } 
     
    29853158        else 
    29863159                $post_cats = $post['post_category']; 
    29873160 
    2988         // Drafts shouldn't be assigned a date unless explicitly done so by the user 
    2989         if ( isset( $post['post_status'] ) && in_array($post['post_status'], array('draft', 'pending', 'auto-draft')) && empty($postarr['edit_date']) && 
    2990                          ('0000-00-00 00:00:00' == $post['post_date_gmt']) ) 
     3161        // Moderation posts shouldn't be assigned a date unless explicitly done so by the user 
     3162        if ( isset( $post['post_status'] )  
     3163                && ( 'auto-draft' == $post['post_status'] || in_array( $post['post_status'], get_post_stati( array( 'moderation' => true, 'post_type' => $post['post_type'] ) ) ) )  
     3164                && empty($postarr['edit_date'])  
     3165                && ('0000-00-00 00:00:00' == $post['post_date_gmt']) ) 
    29913166                $clear_date = true; 
    29923167        else 
    29933168                $clear_date = false; 
     
    30843259 * @return string unique slug for the post, based on $post_name (with a -1, -2, etc. suffix) 
    30853260 */ 
    30863261function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) { 
    3087         if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) ) 
     3262        if ( 'auto-draft' == $post_status || in_array( $post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ) ) 
    30883263                return $slug; 
    30893264 
    30903265        global $wpdb, $wp_rewrite; 
     
    36463821        // Make sure we have a valid post status 
    36473822        if ( !is_array( $post_status ) ) 
    36483823                $post_status = explode( ',', $post_status ); 
    3649         if ( array_diff( $post_status, get_post_stati() ) ) 
     3824        if ( array_diff( $post_status, get_post_stati( array( 'post_type' => $post_type ) ) ) ) 
    36503825                return $pages; 
    36513826 
    36523827        // $args can be whatever, only use the args defined in defaults to compute the key 
  • 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_merge( array('auto-draft'), get_post_stati( array( 'moderation' => true, 'post_type' => $post->post_type )) ) ) ) { 
    118118                $unixtime = strtotime($post->post_date); 
    119119 
    120120                $category = ''; 
  • wp-includes/script-loader.php

     
    390390                        'update' => __('Update'), 
    391391                        'savePending' => __('Save as Pending'), 
    392392                        'saveDraft' => __('Save Draft'), 
     393                        // @todo these needed to be loaded later than init[0]. custom stati aren't loaded otherwise 
     394                        'postStati' => get_post_stati( array( 'post_type' => get_post_type() ), 'objects' ), 
    393395                        'private' => __('Private'), 
    394396                        'public' => __('Public'), 
    395397                        'publicSticky' => __('Public, Sticky'),