WordPress.org

Make WordPress Core

Ticket #21871: 21871-guid.diff

File 21871-guid.diff, 2.9 KB (added by ryan, 7 years ago)

Incomplete, barely test PoC for screen guid

  • 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[ $id ] ) ) {
     409                        $screen = self::$_registry[ $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[ $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 (  $id ) {
     438                        case 'edit-tags':
     439                                $screen->taxonomy = $bits[2];
     440                                $screen->post_type = $bits[3];
     441                                $screen->id = 'edit' . $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                }
     452
     453                return $screen;
     454        }
     455
     456        public static function get_from_hook( $hook_name = '' ) {
    394457                $post_type = $taxonomy = null;
    395458                $in_admin = false;
    396459                $action = '';
     
    437500
    438501                        if ( ! $in_admin )
    439502                                $in_admin = 'site';
    440                 } else {
     503                } elseif ( ! $in_admin ) {
    441504                        if ( defined( 'WP_NETWORK_ADMIN' ) && WP_NETWORK_ADMIN )
    442505                                $in_admin = 'network';
    443506                        elseif ( defined( 'WP_USER_ADMIN' ) && WP_USER_ADMIN )
     
    508571                        $base .= '-user';
    509572                }
    510573
    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                 }
     574                // @todo create guid
    519575
     576                $screen = new stdClass;
     577                $screen->id         = $id;
    520578                $screen->base       = $base;
    521579                $screen->action     = $action;
    522580                $screen->post_type  = (string) $post_type;
     
    525583                $screen->is_network = ( 'network' == $in_admin );
    526584                $screen->in_admin   = $in_admin;
    527585
    528                 self::$_registry[ $id ] = $screen;
    529 
    530586                return $screen;
    531         }
     587        }
    532588
    533589        /**
    534590         * Makes the screen object the current screen.