WordPress.org

Make WordPress Core

Ticket #21871: 21871-guid.diff

File 21871-guid.diff, 2.9 KB (added by ryan, 19 months 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.