WordPress.org

Make WordPress Core

Ticket #12706: 12706.db.2.diff

File 12706.db.2.diff, 32.5 KB (added by danielbachhuber, 7 years 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        if ( $post_status->moderation )
     74                $dropdown_statuses = array_merge( $dropdown_statuses, get_post_stati( array( 'moderation' => true, 'post_type' => $post->post_type ), 'objects' ) );
     75
     76        if ( ! empty( $dropdown_statuses ) && ! $post_status->private ) : ?>
     77        <a href="#post_status" class="edit-post-status hide-if-no-js"><?php _e('Edit') ?></a>
     78
     79        <div id="post-status-select" class="hide-if-js">
     80        <input type="hidden" name="hidden_post_status" id="hidden_post_status" value="<?php echo $post_status->name; ?>" />
     81        <select name='post_status' id='post_status'>
     82        <?php foreach( $dropdown_statuses as $dropdown_status ) : ?>
     83                <option <?php selected( $dropdown_status->name, $post_status->name ); ?> value="<?php echo $dropdown_status->name; ?>"><?php echo esc_attr( $dropdown_status->labels['label'] ); ?></option>
     84        <?php endforeach; ?>
     85        </select>
    10186 <a href="#post_status" class="save-post-status hide-if-no-js button"><?php _e('OK'); ?></a>
    10287 <a href="#post_status" class="cancel-post-status hide-if-no-js"><?php _e('Cancel'); ?></a>
    10388</div>
    10489
    105 <?php } ?>
     90<?php endif; ?>
    10691</div><!-- .misc-pub-section -->
    10792
    10893<div class="misc-pub-section" id="visibility">
    10994<?php _e('Visibility:'); ?> <span id="post-visibility-display"><?php
    11095
    111 if ( 'private' == $post->post_status ) {
     96if ( $post_status->private ) {
    11297        $post->post_password = '';
    11398        $visibility = 'private';
    11499        $visibility_trans = __('Private');
     
    202187<div id="publishing-action">
    203188<span class="spinner"></span>
    204189<?php
    205 if ( !in_array( $post->post_status, array('publish', 'future', 'private') ) || 0 == $post->ID ) {
     190if ( $post_status->moderation || 0 == $post->ID ) {
    206191        if ( $can_publish ) :
    207192                if ( !empty($post->post_date_gmt) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) : ?>
    208193                <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Schedule') ?>" />
     
    212197                <?php submit_button( __( 'Publish' ), 'primary button-large', 'publish', false, array( 'accesskey' => 'p' ) ); ?>
    213198<?php   endif;
    214199        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' ) ); ?>
     200                <input name="original_publish" type="hidden" id="original_publish" value="<?php echo esc_attr( $post_status->labels['save_next'] ); ?>" />
     201                <?php submit_button( $post_status->labels['save_next'], 'primary button-large', 'publish', false, array( 'accesskey' => 'p' ) ); ?>
    217202<?php
    218203        endif;
    219204} 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        $protected_statuses = get_post_stati( array( 'protected' => true, 'post_type' => $post->post_type ) );
     1431        if ( in_array( $post->post_status, $protected_statuses ) && ! in_array( $post_status, $protected_statuses ) )
     1432                $post_states[$post->post_status] = get_post_status_object( $post->post_status, $post->post_type )->labels['label'];
     1433
    14361434        if ( is_sticky($post->ID) )
    14371435                $post_states['sticky'] = __('Sticky');
    14381436
  • 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'),