WordPress.org

Make WordPress Core

Ticket #12706: 12706.db.1.diff

File 12706.db.1.diff, 17.4 KB (added by danielbachhuber, 5 years ago)
  • wp-includes/post.php

     
    123123        register_post_status( 'draft', array(
    124124                'label'       => _x( 'Draft', 'post' ),
    125125                'protected'   => true,
     126                'moderation'  => true,
    126127                '_builtin'    => true, /* internal use only. */
    127128                'label_count' => _n_noop( 'Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>' ),
     129                'show_in_admin_status_dropdown' => true,
    128130        ) );
    129131
    130132        register_post_status( 'pending', array(
    131133                'label'       => _x( 'Pending', 'post' ),
    132134                'protected'   => true,
     135                'moderation'  => true,
    133136                '_builtin'    => true, /* internal use only. */
    134137                'label_count' => _n_noop( 'Pending <span class="count">(%s)</span>', 'Pending <span class="count">(%s)</span>' ),
     138                'show_in_admin_status_dropdown' => true,
    135139        ) );
    136140
    137141        register_post_status( 'private', array(
     
    673677}
    674678
    675679/**
     680 * WordPress Post Status class.
     681 *
     682 * @since 3.6.0
     683 *
     684 */
     685final class WP_Post_Status {
     686
     687        /**
     688         *
     689         * @var string
     690         */
     691        public $name = '';
     692
     693        /**
     694         *
     695         * @var string
     696         */
     697        public $label = false;
     698
     699        /**
     700         *
     701         * @var array
     702         */
     703        public $label_count = false;
     704
     705        /**
     706         *
     707         * @var labels
     708         */
     709        public $labels = null;
     710
     711        /**
     712         *
     713         * @var bool
     714         */
     715        public $exclude_from_search = null;
     716
     717        /**
     718         *
     719         * @var bool
     720         */
     721        public $_builtin = false;
     722
     723        /**
     724         *
     725         * @var bool
     726         */
     727        public $public = null;
     728
     729        /**
     730         *
     731         * @var bool
     732         */
     733        public $internal = null;
     734
     735        /**
     736         *
     737         * @var bool
     738         */
     739        public $protected = null;
     740
     741        /**
     742         *
     743         * @var bool
     744         */
     745        public $moderation = null;
     746
     747        /**
     748         *
     749         * @var bool
     750         */
     751        public $private = null;
     752
     753        /**
     754         *
     755         * @var array
     756         */
     757        public $post_type = null;
     758
     759        /**
     760         *
     761         * @var bool
     762         */
     763        public $publicly_queryable = null;
     764
     765        /**
     766         *
     767         * @var bool
     768         */
     769        public $show_in_admin_status_list = null;
     770
     771        /**
     772         *
     773         * @var bool
     774         */
     775        public $show_in_admin_all_list = null;
     776
     777        /**
     778         *
     779         * @var bool
     780         */
     781        public $show_in_admin_status_dropdown = false;
     782
     783        public function __construct( $post_status, $args = array() ) {
     784
     785                $args = (object) $args;
     786                foreach ( get_object_vars( $args ) as $key => $value )
     787                        $this->$key = $value;
     788
     789                $this->name = sanitize_key( $post_status );
     790
     791                if ( null === $this->public && null === $this->internal && null === $this->protected && null === $this->private && null === $this->moderation )
     792                        $this->internal = true;
     793
     794                if ( null === $this->public )
     795                        $this->public = false;
     796
     797                if ( null === $this->private )
     798                        $this->private = false;
     799
     800                if ( null === $this->protected )
     801                        $this->protected = false;
     802
     803                if ( null === $this->moderation )
     804                        $this->moderation = false;
     805
     806                if ( null === $this->internal )
     807                        $this->internal = false;
     808
     809                if ( null === $this->publicly_queryable )
     810                        $this->publicly_queryable = $this->public;
     811
     812                if ( null === $this->exclude_from_search )
     813                        $this->exclude_from_search = $this->internal;
     814
     815                if ( null === $this->show_in_admin_all_list )
     816                        $this->show_in_admin_all_list = !$this->internal;
     817
     818                if ( null === $this->show_in_admin_status_list )
     819                        $this->show_in_admin_status_list = !$this->internal;
     820
     821                if ( null === $this->show_in_admin_status_dropdown )
     822                        $this->show_in_admin_status_dropdown = $this->moderation;
     823
     824                if ( false === $this->label )
     825                        $this->label = $post_status;
     826
     827                if ( false === $this->label_count )
     828                        $this->label_count = array( $this->label, $this->label );
     829
     830                if ( is_string( $this->post_type ) )
     831                        $this->post_type = array( $this->post_type );
     832        }
     833}
     834
     835/**
    676836 * Retrieve ancestors of a post.
    677837 *
    678838 * @since 2.5.0
     
    9201080 * @param array|string $args See above description.
    9211081 */
    9221082function register_post_status($post_status, $args = array()) {
    923         global $wp_post_statuses;
     1083        global $wp_post_statuses, $wp_post_types;
    9241084
    9251085        if (!is_array($wp_post_statuses))
    9261086                $wp_post_statuses = array();
    9271087
    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;
     1088        $args = new WP_Post_Status( $post_status, $args );
     1089        $wp_post_statuses[ $post_status ] = $args;
    9441090
    945         $post_status = sanitize_key($post_status);
    946         $args->name = $post_status;
     1091        // Add status to already registered post types
     1092        if ( ! empty( $wp_post_types ) )
     1093                foreach ( $wp_post_types as $key => $post_type ) {
     1094                        if ( ! empty( $args->post_type ) && ! in_array( $key, $args->post_type ) )
     1095                                continue;
    9471096
    948         if ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private )
    949                 $args->internal = true;
     1097                        if ( ! array_key_exists( $post_status, $post_type->statuses ) )
     1098                                $wp_post_types[ $key ]->statuses[ $post_status ] = $args;
     1099                }
    9501100
    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 
    9831101        return $args;
    9841102}
    9851103
     
    9961114 * @param string $post_status The name of a registered post status
    9971115 * @return object A post status object
    9981116 */
    999 function get_post_status_object( $post_status ) {
     1117function get_post_status_object( $post_status, $object_type = null ) {
    10001118        global $wp_post_statuses;
    10011119
    1002         if ( empty($wp_post_statuses[$post_status]) )
    1003                 return null;
     1120        $status_object = null;
    10041121
    1005         return $wp_post_statuses[$post_status];
     1122        if ( $object_type ) {
     1123                $post_type = get_post_type_object( $object_type );
     1124                if ( $post_type && ! empty( $post_type->statuses[ $post_status ] ) )
     1125                        $status_object = $post_type->statuses[ $post_status ];
     1126        }
     1127
     1128        if ( ! empty( $wp_post_statuses[ $post_status ] ) )
     1129                $status = $wp_post_statuses[ $post_status ];
     1130
     1131        // Search across all post types
     1132        foreach ( get_post_types( array(), 'objects' ) as $post_type ) {
     1133                if ( ! empty( $post_type->statuses[ $post_status ] ) ) {
     1134                        $status_object = $post_type->statuses[ $post_status ];
     1135                        break;
     1136                }
     1137        }
     1138
     1139        return $status_object;
    10061140}
    10071141
    10081142/**
     
    10261160
    10271161        $field = ('names' == $output) ? 'name' : false;
    10281162
    1029         return wp_filter_object_list($wp_post_statuses, $args, $operator, $field);
     1163        $statuses = $wp_post_statuses;
     1164
     1165        if ( ! empty( $args['post_type'] ) ) {
     1166                $post_type = get_post_type_object( $args['post_type'] );
     1167                if ( $post_type && ! empty( $post_type->statuses ) )
     1168                        $statuses = $post_type->statuses;
     1169
     1170                unset( $args['post_type'] );
     1171        }
     1172
     1173        return wp_filter_object_list( $statuses, $args, $operator, $field );
    10301174}
    10311175
    10321176/**
     
    12111355 * @return object|WP_Error the registered post type object, or an error object
    12121356 */
    12131357function register_post_type( $post_type, $args = array() ) {
    1214         global $wp_post_types, $wp_rewrite, $wp;
     1358        global $wp_post_types, $wp_rewrite, $wp, $wp_post_statuses;
    12151359
    12161360        if ( !is_array($wp_post_types) )
    12171361                $wp_post_types = array();
     
    12271371                'can_export' => true,
    12281372                'show_in_nav_menus' => null, 'show_in_menu' => null, 'show_in_admin_bar' => null,
    12291373                'delete_with_user' => null,
     1374                'statuses' => null,
    12301375        );
    12311376        $args = wp_parse_args($args, $defaults);
    12321377        $args = (object) $args;
     
    13361481        if ( $args->register_meta_box_cb )
    13371482                add_action('add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1);
    13381483
     1484        if ( null === $args->statuses )
     1485                $args->statuses = array();
     1486
     1487        foreach ( $args->statuses as $post_status => $post_status_args )
     1488                $args->statuses[ $post_status ] = new WP_Post_Status( $post_status, $post_status_args );
     1489
     1490        // Legacy post statuses
     1491        if ( ! empty( $wp_post_statuses ) )
     1492                foreach ( $wp_post_statuses as $key => $post_status )
     1493                        if ( empty( $args->statuses[ $key ] ) )
     1494                                $args->statuses[ $key ] = $post_status;
     1495
    13391496        $args->labels = get_post_type_labels( $args );
    13401497        $args->label = $args->labels->name;
    13411498
     
    21422299        $count = $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );
    21432300
    21442301        $stats = array();
    2145         foreach ( get_post_stati() as $state )
     2302        foreach ( get_post_stati( array( 'post_type' => $type ) ) as $state )
    21462303                $stats[$state] = 0;
    21472304
    21482305        foreach ( (array) $count as $row )
     
    27362893        if ( empty($post_type) )
    27372894                $post_type = 'post';
    27382895
    2739         if ( empty($post_status) )
    2740                 $post_status = 'draft';
     2896        if ( empty($post_status) ) {
     2897                $post_status = array_shift( get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) );
     2898        }
    27412899
    27422900        if ( !empty($post_category) )
    27432901                $post_category = array_filter($post_category); // Filter out empty terms
     
    27672925        if ( 'pending' == $post_status && !current_user_can( 'publish_posts' ) )
    27682926                $post_name = '';
    27692927
    2770         // Create a valid post name. Drafts and pending posts are allowed to have an empty
    2771         // post name.
     2928        // Create a valid post name. Posts in moderation are allowed to have an empty post_name
    27722929        if ( empty($post_name) ) {
    2773                 if ( !in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) )
     2930                if ( 'auto-draft' != $post_status
     2931                        && ! in_array( $post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ) )
    27742932                        $post_name = sanitize_title($post_title);
    27752933                else
    27762934                        $post_name = '';
     
    28002958                }
    28012959
    28022960        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' ) ) )
     2961                if ( 'auto-draft' != $post_status
     2962                        && ! in_array( $post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ) )
    28042963                        $post_date_gmt = get_gmt_from_date($post_date);
    28052964                else
    28062965                        $post_date_gmt = '0000-00-00 00:00:00';
     
    28953054                $where = array( 'ID' => $post_ID );
    28963055        }
    28973056
    2898         if ( empty($data['post_name']) && !in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
     3057        if ( empty($data['post_name'])
     3058                && 'auto-draft' != $data['post_status']
     3059                && ! in_array( $data['post_status'], get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ) ) {
    28993060                $data['post_name'] = sanitize_title($data['post_title'], $post_ID);
    29003061                $wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );
    29013062        }
     
    29853146        else
    29863147                $post_cats = $post['post_category'];
    29873148
    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']) )
     3149        // Moderation posts shouldn't be assigned a date unless explicitly done so by the user
     3150        if ( isset( $post['post_status'] )
     3151                && ( 'auto-draft' == $post['post_status'] || in_array( $post['post_status'], get_post_stati( array( 'moderation' => true, 'post_type' => $post['post_type'] ) ) ) )
     3152                && empty($postarr['edit_date'])
     3153                && ('0000-00-00 00:00:00' == $post['post_date_gmt']) )
    29913154                $clear_date = true;
    29923155        else
    29933156                $clear_date = false;
     
    30843247 * @return string unique slug for the post, based on $post_name (with a -1, -2, etc. suffix)
    30853248 */
    30863249function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {
    3087         if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) )
     3250        if ( 'auto-draft' == $post_status || in_array( $post_status, get_post_stati( array( 'moderation' => true, 'post_type' => $post_type ) ) ) )
    30883251                return $slug;
    30893252
    30903253        global $wpdb, $wp_rewrite;
     
    36463809        // Make sure we have a valid post status
    36473810        if ( !is_array( $post_status ) )
    36483811                $post_status = explode( ',', $post_status );
    3649         if ( array_diff( $post_status, get_post_stati() ) )
     3812        if ( array_diff( $post_status, get_post_stati( array( 'post_type' => $post_type ) ) ) )
    36503813                return $pages;
    36513814
    36523815        // $args can be whatever, only use the args defined in defaults to compute the key
  • 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 ) ) ) )
    283283                        $posts_columns['comments'] = '<span class="vers"><div title="' . esc_attr__( 'Comments' ) . '" class="comment-grey-bubble"></div></span>';
    284284
    285285                $posts_columns['date'] = __( 'Date' );
     
    554554                                                $actions['delete'] = "<a class='submitdelete' title='" . esc_attr( __( 'Delete this item permanently' ) ) . "' href='" . get_delete_post_link( $post->ID, '', true ) . "'>" . __( 'Delete Permanently' ) . "</a>";
    555555                                }
    556556                                if ( $post_type_object->public ) {
    557                                         if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ) ) ) {
     557                                        if ( in_array( $post->post_status, get_post_stati( array( 'protected' => true ) ) ) ) {
    558558                                                if ( $can_edit_post )
    559559                                                        $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>';
    560560                                        } elseif ( 'trash' != $post->post_status ) {
     
    592592                                else
    593593                                        echo '<abbr title="' . $t_time . '">' . apply_filters( 'post_date_column_time', $h_time, $post, $column_name, $mode ) . '</abbr>';
    594594                                echo '<br />';
    595                                 if ( 'publish' == $post->post_status ) {
     595                                if ( in_array( $post->post_status, get_post_stati( array( 'public' => true ), $post->post_type ) ) ) {
    596596                                        _e( 'Published' );
    597597                                } elseif ( 'future' == $post->post_status ) {
    598598                                        if ( $time_diff > 0 )
     
    954954                                <label class="inline-edit-status alignleft">
    955955                                        <span class="title"><?php _e( 'Status' ); ?></span>
    956956                                        <select name="_status">
    957         <?php if ( $bulk ) : ?>
    958                                                 <option value="-1"><?php _e( '&mdash; No Change &mdash;' ); ?></option>
    959         <?php endif; // $bulk ?>
    960                                         <?php if ( $can_publish ) : // Contributors only get "Unpublished" and "Pending Review" ?>
    961                                                 <option value="publish"><?php _e( 'Published' ); ?></option>
    962                                                 <option value="future"><?php _e( 'Scheduled' ); ?></option>
    963         <?php if ( $bulk ) : ?>
    964                                                 <option value="private"><?php _e( 'Private' ) ?></option>
    965         <?php endif; // $bulk ?>
    966                                         <?php endif; ?>
    967                                                 <option value="pending"><?php _e( 'Pending Review' ); ?></option>
    968                                                 <option value="draft"><?php _e( 'Draft' ); ?></option>
     957                                        <?php
     958                                                $statuses = array();
     959                                                if ( $bulk )
     960                                                        $statuses['-1'] = _e( '&mdash; No Change &mdash;' );
     961                                                if ( $can_publish ) {
     962                                                        $public_stati = get_post_stati( array( 'public' => true, 'post_type' => $screen->post_type ), 'objects' );
     963                                                        foreach( $public_stati as $status ) {
     964                                                                $statuses[$status->name] = $status->label;
     965                                                        }
     966                                                        if ( $bulk ) {
     967                                                                $private_stati = get_post_stati( array( 'private' => true, 'post_type' => $screen->post_type ), 'objects' );
     968                                                                foreach( $private_stati as $status ) {
     969                                                                        $statuses[$status->name] = $status->label;
     970                                                                }
     971                                                        }
     972                                                }
     973                                                $moderation_stati = get_post_stati( array( 'moderation' => true, 'post_type' => $screen->post_type ), 'objects' );
     974                                                foreach( $moderation_stati as $status ) {
     975                                                        $statuses[$status->name] = $status->label;
     976                                                }
     977                                                foreach( $statuses as $status_key => $status_label ) : ?>
     978                                                <option value="<?php echo esc_attr( $status_key ); ?>"><?php echo esc_html( $status_label ); ?></option>
     979                                                <?php endforeach; ?>
    969980                                        </select>
    970981                                </label>
    971982