WordPress.org

Make WordPress Core

Ticket #21871: 21871-guid.4.diff

File 21871-guid.4.diff, 3.5 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                $screen->taxonomy = '';
     437                $screen->post_type = '';
     438
     439                switch (  $screen->id ) {
     440                        case 'edit-tags':
     441                                $screen->taxonomy = $bits[2];
     442                                if ( ! empty( $bits[3] ) )
     443                                        $screen->post_type = $bits[3];
     444                                $screen->id = 'edit-' . $screen->taxonomy;
     445                                break;
     446                        case 'edit':
     447                                $screen->post_type = $bits[2];
     448                                $screen->id = 'edit-' . $screen->post_type;
     449                                break;
     450                        case 'post':
     451                                $screen->post_type = $bits[2];
     452                                $screen->action = 'add';
     453                                break;
     454                        case 'media':
     455                        case 'link':
     456                        case 'user':
     457                                $screen->action = 'add';
     458                                break;
     459                }
     460
     461                if ( 'site' != $screen->in_admin ) {
     462                        $screen->base .= '-' . $screen->in_admin;
     463                        $screen->id .= '-' . $screen->in_admin;
     464                }
     465
     466                return $screen;
     467        }
     468
     469        public static function get_from_hook( $hook_name = '' ) {
    394470                $post_type = $taxonomy = null;
    395471                $in_admin = false;
    396472                $action = '';
     
    437513
    438514                        if ( ! $in_admin )
    439515                                $in_admin = 'site';
    440                 } else {
     516                } elseif ( ! $in_admin ) {
    441517                        if ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN )
    442518                                $in_admin = 'network';
    443519                        elseif ( defined( 'WP_USER_ADMIN' ) && WP_USER_ADMIN )
     
    508584                        $base .= '-user';
    509585                }
    510586
    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;
     587                // @todo create guid
     588                $screen = new stdClass;
     589                $screen->guid = $in_admin . ':' . $base;
     590
     591                switch ( $base ) {
     592                        case 'edit-tags':
     593                                $screen->guid .= ':' . $taxonomy;
     594                                if ( $post_type )
     595                                        $screen->guid .= ':' . $post_type;
     596                                break;
     597                        case 'edit':
     598                        case 'post':
     599                                $screen->guid .= ':' . $post_type;
     600                                break;
    518601                }
    519602
     603                $screen->id         = $id;
    520604                $screen->base       = $base;
    521605                $screen->action     = $action;
    522606                $screen->post_type  = (string) $post_type;
     
    525609                $screen->is_network = ( 'network' == $in_admin );
    526610                $screen->in_admin   = $in_admin;
    527611
    528                 self::$_registry[ $id ] = $screen;
    529 
    530612                return $screen;
    531         }
     613        }
    532614
    533615        /**
    534616         * Makes the screen object the current screen.