WordPress.org

Make WordPress Core

Ticket #21871: 21871-guid.2.diff

File 21871-guid.2.diff, 3.1 KB (added by ryan, 6 years ago)
  • wp-admin/includes/screen.php

     
    237237        /**
    238238         * The unique ID of the screen.
    239239         *
     240         * @since 3.5.0
     241         * @var string
     242         * @access public
     243         */
     244        public $guid = '';
     245
     246        /**
     247         * The somewhat unique ID of the screen.
     248         *
    240249         * @since 3.3.0
    241250         * @var string
    242251         * @access public
     
    391400                if ( is_a( $hook_name, 'WP_Screen' ) )
    392401                        return $hook_name;
    393402
     403                if ( false !== strpos( $hook_name, ':' ) )
     404                        $_screen = WP_Screen::get_from_guid( $hook_name );
     405                else
     406                        $_screen = WP_Screen::get_from_hook( $hook_name );
     407
     408                if ( isset( self::$_registry[ $_screen->id ] ) ) {
     409                        $screen = self::$_registry[ $_screen->id ];
     410                        if ( $screen === get_current_screen() )
     411                                return $screen;
     412                        unset( $_screen->id );
     413                } else {
     414                        $screen = new WP_Screen();
     415                }
     416
     417                foreach ( get_object_vars( $_screen ) as $property => $value ) {
     418                        $screen->$property = $value;
     419                }
     420
     421                self::$_registry[ $_screen->id ] = $screen;
     422
     423                return $screen;
     424        }
     425
     426        public static function get_from_guid( $guid ) {
     427                $screen = new stdClass;
     428
     429                // admin:page:arg1:arg2:arg3:...
     430                $screen->guid = $guid;
     431                $bits = explode( ':', $guid );
     432                $screen->in_admin = $bits[0];
     433                $screen->is_user    = ( 'user' == $in_admin );
     434                $screen->is_network = ( 'network' == $in_admin );
     435                $screen->base = $screen->id = $bits[1];
     436
     437                switch (  $screen->id ) {
     438                        case 'edit-tags':
     439                                $screen->taxonomy = $bits[2];
     440                                $screen->post_type = $bits[3];
     441                                $screen->id = 'edit-' . $screen->taxonomy;
     442                                break;
     443                        case 'edit':
     444                                $screen->post_type = $bits[2];
     445                                $screen->id = 'edit-' . $screen->post_type;
     446                                break;
     447                        case 'post':
     448                                $screen->post_type = $bits[2];
     449                                $screen->action = 'add';
     450                                break;
     451                        case 'media':
     452                        case 'link':
     453                        case 'user':
     454                                $screen->action = 'add';
     455                                break;
     456                }
     457
     458                if ( 'link' == $screen->post_type )
     459                        $screen->post_type = '';
     460
     461                return $screen;
     462        }
     463
     464        public static function get_from_hook( $hook_name = '' ) {
    394465                $post_type = $taxonomy = null;
    395466                $in_admin = false;
    396467                $action = '';
     
    437508
    438509                        if ( ! $in_admin )
    439510                                $in_admin = 'site';
    440                 } else {
     511                } elseif ( ! $in_admin ) {
    441512                        if ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN )
    442513                                $in_admin = 'network';
    443514                        elseif ( defined( 'WP_USER_ADMIN' ) && WP_USER_ADMIN )
     
    508579                        $base .= '-user';
    509580                }
    510581
    511                 if ( isset( self::$_registry[ $id ] ) ) {
    512                         $screen = self::$_registry[ $id ];
    513                         if ( $screen === get_current_screen() )
    514                                 return $screen;
    515                 } else {
    516                         $screen = new WP_Screen();
    517                         $screen->id     = $id;
    518                 }
     582                // @todo create guid
    519583
     584                $screen = new stdClass;
     585                $screen->id         = $id;
    520586                $screen->base       = $base;
    521587                $screen->action     = $action;
    522588                $screen->post_type  = (string) $post_type;
     
    525591                $screen->is_network = ( 'network' == $in_admin );
    526592                $screen->in_admin   = $in_admin;
    527593
    528                 self::$_registry[ $id ] = $screen;
    529 
    530594                return $screen;
    531         }
     595        }
    532596
    533597        /**
    534598         * Makes the screen object the current screen.