WordPress.org

Make WordPress Core

Ticket #26511: WP_Post_Type_Labels.diff

File WP_Post_Type_Labels.diff, 14.4 KB (added by swissspidy, 20 months ago)
  • new file src/wp-includes/class-wp-post-type-labels.php

    diff --git src/wp-includes/class-wp-post-type-labels.php src/wp-includes/class-wp-post-type-labels.php
    new file mode 100644
    index 0000000..898ca12
    - +  
     1<?php
     2/**
     3 * Post API: WP_Post_Type_Labels class
     4 *
     5 * @package WordPress
     6 * @subpackage Post
     7 * @since 4.7.0
     8 */
     9
     10/**
     11 * Core class used for providing post type labels.
     12 *
     13 * @since 4.7.0
     14 *
     15 * @see register_post_type()
     16 * @see get_post_type_labels()
     17 *
     18 * @property string name
     19 * @property string singular_name
     20 * @property string add_new
     21 * @property string add_new_item
     22 * @property string edit_item
     23 * @property string new_item
     24 * @property string view_item
     25 * @property string view_items
     26 * @property string search_items
     27 * @property string not_found
     28 * @property string not_found_in_trash
     29 * @property string parent_item_colon
     30 * @property string all_items
     31 * @property string archives
     32 * @property string insert_into_item
     33 * @property string uploaded_to_this_item
     34 * @property string featured_image
     35 * @property string set_featured_image
     36 * @property string remove_featured_image
     37 * @property string use_featured_image
     38 * @property string filter_items_list
     39 * @property string items_list_navigation
     40 * @property string items_list
     41 * @property string menu_name
     42 * @property string name_admin_bar
     43 */
     44final class WP_Post_Type_Labels {
     45        /**
     46         * Current post type.
     47         *
     48         * @since 4.7.0
     49         * @access protected
     50         * @var WP_Post_Type
     51         */
     52        protected $post_type;
     53
     54        /**
     55         * The default labels of the post type.
     56         *
     57         * @since 4.7.0
     58         * @access protected
     59         * @var array
     60         */
     61        protected $defaults = array();
     62
     63        /**
     64         * Constructor.
     65         *
     66         * Will populate object properties from the provided arguments and assign other
     67         * default properties based on that information.
     68         *
     69         * @since  4.7.0
     70         * @access public
     71         *
     72         * @see register_post_type()
     73         *
     74         * @param WP_Post_Type $post_type Post type object.
     75         */
     76        public function __construct( $post_type ) {
     77                $this->post_type = $post_type;
     78
     79                $this->defaults = (array) $post_type->labels;
     80        }
     81
     82        /**
     83         * Returns the (non-)hierarchical default labels.
     84         *
     85         * @since 4.7.0
     86         * @access protected
     87         *
     88         * @return array Hierarchical vs non-hierarchical default labels.
     89         */
     90        protected function nohier_vs_hier_defaults() {
     91                $nohier_vs_hier_defaults = array(
     92                        'name' => array( _x('Posts', 'post type general name'), _x('Pages', 'post type general name') ),
     93                        'singular_name' => array( _x('Post', 'post type singular name'), _x('Page', 'post type singular name') ),
     94                        'add_new' => array( _x('Add New', 'post'), _x('Add New', 'page') ),
     95                        'add_new_item' => array( __('Add New Post'), __('Add New Page') ),
     96                        'edit_item' => array( __('Edit Post'), __('Edit Page') ),
     97                        'new_item' => array( __('New Post'), __('New Page') ),
     98                        'view_item' => array( __('View Post'), __('View Page') ),
     99                        'view_items' => array( __('View Posts'), __('View Pages') ),
     100                        'search_items' => array( __('Search Posts'), __('Search Pages') ),
     101                        'not_found' => array( __('No posts found.'), __('No pages found.') ),
     102                        'not_found_in_trash' => array( __('No posts found in Trash.'), __('No pages found in Trash.') ),
     103                        'parent_item_colon' => array( null, __('Parent Page:') ),
     104                        'all_items' => array( __( 'All Posts' ), __( 'All Pages' ) ),
     105                        'archives' => array( __( 'Post Archives' ), __( 'Page Archives' ) ),
     106                        'insert_into_item' => array( __( 'Insert into post' ), __( 'Insert into page' ) ),
     107                        'uploaded_to_this_item' => array( __( 'Uploaded to this post' ), __( 'Uploaded to this page' ) ),
     108                        'featured_image' => array( __( 'Featured Image' ), __( 'Featured Image' ) ),
     109                        'set_featured_image' => array( __( 'Set featured image' ), __( 'Set featured image' ) ),
     110                        'remove_featured_image' => array( __( 'Remove featured image' ), __( 'Remove featured image' ) ),
     111                        'use_featured_image' => array( __( 'Use as featured image' ), __( 'Use as featured image' ) ),
     112                        'filter_items_list' => array( __( 'Filter posts list' ), __( 'Filter pages list' ) ),
     113                        'items_list_navigation' => array( __( 'Posts list navigation' ), __( 'Pages list navigation' ) ),
     114                        'items_list' => array( __( 'Posts list' ), __( 'Pages list' ) ),
     115                );
     116
     117                return $nohier_vs_hier_defaults;
     118        }
     119
     120        /**
     121         * Magic method for checking the existence of a certain post type label.
     122         *
     123         * @since 4.7.0
     124         * @access public
     125         *
     126         * @param string $key Label to check if set.
     127         * @return bool Whether the given label is set.
     128         */
     129        public function __isset( $key ) {
     130                return null !== $this->{$key};
     131        }
     132
     133        /**
     134         * Magic method for accessing post type labels.
     135         *
     136         * @since 4.7.0
     137         * @access public
     138         *
     139         * @param string $key Label to retrieve.
     140         * @return string THe post type label.
     141         */
     142        public function __get( $key ) {
     143                /**
     144                 * Filters the labels of a specific post type.
     145                 *
     146                 * The dynamic portion of the hook name, `$post_type`, refers to
     147                 * the post type slug.
     148                 *
     149                 * @since 3.5.0
     150                 *
     151                 * @see get_post_type_labels() for the full list of labels.
     152                 *
     153                 * @param object $labels Object with labels for the post type as member variables.
     154                 */
     155                $original = apply_filters( "post_type_labels_{$this->post_type->name}", $this->defaults );
     156
     157                $defaults = array();
     158
     159                foreach ( $this->nohier_vs_hier_defaults() as $default_key => $value ) {
     160                        $defaults[ $default_key ] = $this->post_type->hierarchical ? $value[1] : $value[0];
     161                }
     162
     163                $labels = array_merge( $defaults, $original );
     164
     165                if ( isset( $labels[ $key ] ) ) {
     166                        return $labels[ $key ];
     167                }
     168
     169                if ( 'name' === $key && isset( $this->post_type->label ) ) {
     170                        return $this->post_type->label;
     171                }
     172
     173                if ( 'singular_name' === $key ) {
     174                        $key = 'name';
     175                }
     176
     177                if ( 'name_admin_bar' === $key ) {
     178                        return isset( $this->singular_name ) ? $this->singular_name : $this->post_type->name;
     179                }
     180
     181                if ( 'menu_name' === $key ) {
     182                        $key = 'name';
     183                }
     184
     185                if ( 'all_items' === $key ) {
     186                        $key = 'menu_name';
     187                }
     188
     189                if ( 'archives' === $key ) {
     190                        $key = 'all_items';
     191                }
     192
     193                return $labels[ $key ];
     194        }
     195}
  • src/wp-includes/class-wp-post-type.php

    diff --git src/wp-includes/class-wp-post-type.php src/wp-includes/class-wp-post-type.php
    index 0b1d3c0..0dd44d4 100644
    final class WP_Post_Type { 
    4343         *
    4444         * @since 4.6.0
    4545         * @access public
    46          * @var object $labels
     46         * @var WP_Post_Type_Labels $labels
    4747         */
    4848        public $labels;
    4949
  • src/wp-includes/post.php

    diff --git src/wp-includes/post.php src/wp-includes/post.php
    index c02108e..01a7ec7 100644
    function _post_type_meta_capabilities( $capabilities = null ) { 
    12731273 * @access private
    12741274 *
    12751275 * @param object|WP_Post_Type $post_type_object Post type object.
    1276  * @return object Object with all the labels as member variables.
     1276 * @return WP_Post_Type_Labels Object with all the labels as member variables.
    12771277 */
    12781278function get_post_type_labels( $post_type_object ) {
    1279         $nohier_vs_hier_defaults = array(
    1280                 'name' => array( _x('Posts', 'post type general name'), _x('Pages', 'post type general name') ),
    1281                 'singular_name' => array( _x('Post', 'post type singular name'), _x('Page', 'post type singular name') ),
    1282                 'add_new' => array( _x('Add New', 'post'), _x('Add New', 'page') ),
    1283                 'add_new_item' => array( __('Add New Post'), __('Add New Page') ),
    1284                 'edit_item' => array( __('Edit Post'), __('Edit Page') ),
    1285                 'new_item' => array( __('New Post'), __('New Page') ),
    1286                 'view_item' => array( __('View Post'), __('View Page') ),
    1287                 'view_items' => array( __('View Posts'), __('View Pages') ),
    1288                 'search_items' => array( __('Search Posts'), __('Search Pages') ),
    1289                 'not_found' => array( __('No posts found.'), __('No pages found.') ),
    1290                 'not_found_in_trash' => array( __('No posts found in Trash.'), __('No pages found in Trash.') ),
    1291                 'parent_item_colon' => array( null, __('Parent Page:') ),
    1292                 'all_items' => array( __( 'All Posts' ), __( 'All Pages' ) ),
    1293                 'archives' => array( __( 'Post Archives' ), __( 'Page Archives' ) ),
    1294                 'insert_into_item' => array( __( 'Insert into post' ), __( 'Insert into page' ) ),
    1295                 'uploaded_to_this_item' => array( __( 'Uploaded to this post' ), __( 'Uploaded to this page' ) ),
    1296                 'featured_image' => array( __( 'Featured Image' ), __( 'Featured Image' ) ),
    1297                 'set_featured_image' => array( __( 'Set featured image' ), __( 'Set featured image' ) ),
    1298                 'remove_featured_image' => array( __( 'Remove featured image' ), __( 'Remove featured image' ) ),
    1299                 'use_featured_image' => array( __( 'Use as featured image' ), __( 'Use as featured image' ) ),
    1300                 'filter_items_list' => array( __( 'Filter posts list' ), __( 'Filter pages list' ) ),
    1301                 'items_list_navigation' => array( __( 'Posts list navigation' ), __( 'Pages list navigation' ) ),
    1302                 'items_list' => array( __( 'Posts list' ), __( 'Pages list' ) ),
    1303         );
    1304         $nohier_vs_hier_defaults['menu_name'] = $nohier_vs_hier_defaults['name'];
    1305 
    1306         $labels = _get_custom_object_labels( $post_type_object, $nohier_vs_hier_defaults );
    1307 
    1308         $post_type = $post_type_object->name;
    1309 
    1310         $default_labels = clone $labels;
    1311 
    1312         /**
    1313          * Filters the labels of a specific post type.
    1314          *
    1315          * The dynamic portion of the hook name, `$post_type`, refers to
    1316          * the post type slug.
    1317          *
    1318          * @since 3.5.0
    1319          *
    1320          * @see get_post_type_labels() for the full list of labels.
    1321          *
    1322          * @param object $labels Object with labels for the post type as member variables.
    1323          */
    1324         $labels = apply_filters( "post_type_labels_{$post_type}", $labels );
    1325 
    1326         // Ensure that the filtered labels contain all required default values.
    1327         $labels = (object) array_merge( (array) $default_labels, (array) $labels );
    1328 
    1329         return $labels;
     1279        return new WP_Post_Type_Labels( $post_type_object );
    13301280}
    13311281
    13321282/**
  • src/wp-settings.php

    diff --git src/wp-settings.php src/wp-settings.php
    index 80f556c..cd4b37a 100644
    require( ABSPATH . WPINC . '/post.php' ); 
    163163require( ABSPATH . WPINC . '/class-walker-page.php' );
    164164require( ABSPATH . WPINC . '/class-walker-page-dropdown.php' );
    165165require( ABSPATH . WPINC . '/class-wp-post-type.php' );
     166require( ABSPATH . WPINC . '/class-wp-post-type-labels.php' );
    166167require( ABSPATH . WPINC . '/class-wp-post.php' );
    167168require( ABSPATH . WPINC . '/post-template.php' );
    168169require( ABSPATH . WPINC . '/revision.php' );
  • new file tests/phpunit/tests/post/getPostTypeLabels.php

    diff --git tests/phpunit/tests/post/getPostTypeLabels.php tests/phpunit/tests/post/getPostTypeLabels.php
    new file mode 100644
    index 0000000..59b9126
    - +  
     1<?php
     2
     3/**
     4 * @group post
     5 */
     6class Tests_Get_Post_Type_Labels extends WP_UnitTestCase {
     7        public function test_returns_an_object() {
     8                $this->assertInternalType( 'object', get_post_type_labels( (object) array(
     9                        'name'         => 'foo',
     10                        'labels'       => array(),
     11                        'hierarchical' => false,
     12                ) ) );
     13        }
     14
     15        public function test_returns_hierachical_labels() {
     16                $labels = get_post_type_labels( (object) array(
     17                        'name'         => 'foo',
     18                        'labels'       => array(),
     19                        'hierarchical' => true,
     20                ) );
     21
     22                $this->assertSame( 'Pages', $labels->name );
     23        }
     24
     25        public function test_existing_labels_are_not_overridden() {
     26                $labels = get_post_type_labels( (object) array(
     27                        'name'         => 'foo',
     28                        'labels'       => array(
     29                                'singular_name' => 'Foo',
     30                        ),
     31                        'hierarchical' => false,
     32                ) );
     33
     34                $this->assertSame( 'Foo', $labels->singular_name );
     35        }
     36
     37        public function test_name_admin_bar_label_should_fall_back_to_singular_name() {
     38                $labels = get_post_type_labels( (object) array(
     39                        'name'         => 'foo',
     40                        'labels'       => array(
     41                                'singular_name' => 'Foo',
     42                        ),
     43                        'hierarchical' => false,
     44                ) );
     45
     46                $this->assertSame( 'Foo', $labels->name_admin_bar );
     47        }
     48
     49        public function test_menu_name_should_fall_back_to_name() {
     50                $labels = get_post_type_labels( (object) array(
     51                        'name'         => 'foo',
     52                        'labels'       => array(
     53                                'name' => 'Bar',
     54                        ),
     55                        'hierarchical' => false,
     56                ) );
     57
     58                $this->assertSame( 'Bar', $labels->menu_name );
     59        }
     60
     61        public function test_labels_should_be_added_when_registering_a_post_type() {
     62                $post_type_object = register_post_type( 'foo', array(
     63                        'labels' => array(
     64                                'singular_name' => 'bar',
     65                        ),
     66                ) );
     67
     68                unregister_post_type( 'foo' );
     69
     70                $this->assertObjectHasAttribute( 'labels', $post_type_object );
     71                $this->assertObjectHasAttribute( 'label', $post_type_object );
     72                $this->assertNotNull( $post_type_object->labels->not_found_in_trash );
     73        }
     74
     75        public function test_label_should_be_derived_from_labels_when_registering_a_post_type() {
     76                $post_type_object = register_post_type( 'foo', array(
     77                        'labels' => array(
     78                                'name' => 'bar',
     79                        ),
     80                ) );
     81
     82                $this->assertSame( 'bar', $post_type_object->label );
     83
     84                unregister_post_type( 'foo' );
     85        }
     86
     87        /**
     88         * @ticket 33543
     89         */
     90        public function test_should_fall_back_on_defaults_when_filtered_labels_do_not_contain_the_keys() {
     91                add_filter( 'post_type_labels_foo', array( $this, 'filter_post_type_labels' ) );
     92                register_post_type( 'foo' );
     93
     94                $this->assertNotNull( get_post_type_object( 'foo' )->labels->featured_image );
     95                $this->assertNotNull( get_post_type_object( 'foo' )->labels->set_featured_image );
     96
     97                unregister_post_type( 'foo' );
     98                remove_filter( 'post_type_labels_foo', array( $this, 'filter_post_type_labels' ) );
     99        }
     100
     101        public function filter_post_type_labels( $labels ) {
     102                unset( $labels->featured_image );
     103                unset( $labels->set_featured_image );
     104
     105                return $labels;
     106        }
     107}
  • tests/phpunit/tests/post/types.php

    diff --git tests/phpunit/tests/post/types.php tests/phpunit/tests/post/types.php
    index e7dcf84..31a51c2 100644
    class Tests_Post_Types extends WP_UnitTestCase { 
    220220        }
    221221
    222222        /**
    223          * @ticket 33543
    224          */
    225         function test_get_post_type_labels_should_fall_back_on_defaults_when_filtered_labels_do_not_contain_the_keys() {
    226                 add_filter( 'post_type_labels_foo', array( $this, 'filter_post_type_labels' ) );
    227                 register_post_type( 'foo' );
    228 
    229                 $this->assertObjectHasAttribute( 'featured_image', get_post_type_object( 'foo' )->labels );
    230                 $this->assertObjectHasAttribute( 'set_featured_image', get_post_type_object( 'foo' )->labels );
    231 
    232                 _unregister_post_type( 'foo' );
    233                 remove_filter( 'post_type_labels_foo', array( $this, 'filter_post_type_labels' ) );
    234         }
    235 
    236         public function filter_post_type_labels( $labels ) {
    237                 unset( $labels->featured_image );
    238                 unset( $labels->set_featured_image );
    239                 return $labels;
    240         }
    241 
    242 
    243         /**
    244223         * @ticket 30013
    245224         */
    246225        public function test_get_post_type_object_with_non_scalar_values() {