WordPress.org

Make WordPress Core

Ticket #12706: 12706.db.1.diff

File 12706.db.1.diff, 17.4 KB (added by danielbachhuber, 15 months 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