WordPress.org

Make WordPress Core

Changeset 19052


Ignore:
Timestamp:
10/24/11 18:34:08 (4 years ago)
Author:
nacin
Message:

Move WP_Screen to a full registry. Have convert_to_screen() return a WP_Screen object. Improve and verify values for post_type and taxonomy. see #18785. also fixes #14886.

Location:
trunk/wp-admin
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/screen.php

    r19051 r19052  
    114114 * 
    115115 * @param string $hook_name The hook name (also known as the hook suffix) used to determine the screen. 
    116  * @return object An object containing the safe screen name and id 
    117  */ 
    118 function convert_to_screen( $hook_suffix ) { 
    119     $screen = str_replace( array('.php', '-new', '-add', '-network', '-user' ), '', $hook_suffix); 
    120  
    121     if ( is_network_admin() ) 
    122         $screen .= '-network'; 
    123     elseif ( is_user_admin() ) 
    124         $screen .= '-user'; 
    125  
    126     $screen = (string) apply_filters( 'screen_meta_screen', $screen ); 
    127     $screen = (object) array( 'id' => $screen, 'base' => $screen ); 
    128     return $screen; 
     116 * @return WP_Screen Screen object. 
     117 */ 
     118function convert_to_screen( $hook_name ) { 
     119    return WP_Screen::get( $hook_name ); 
    129120} 
    130121 
     
    202193            $icon_id = $screen->base; 
    203194 
    204         if ( ! empty( $screen->post_type ) && 'page' == $screen->post_type ) 
     195        if ( 'page' == $screen->post_type ) 
    205196            $icon_id = 'edit-pages'; 
    206197 
    207         if ( ! empty( $screen->post_type ) ) 
     198        if ( $screen->post_type ) 
    208199            $class .= ' ' . sanitize_html_class( 'icon32-posts-' . $screen->post_type ); 
    209200    } 
     
    234225 * @uses $current_screen 
    235226 * 
    236  * @param string $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen. 
     227 * @param mixed $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen, 
     228 *  or an existing screen object. 
    237229 */ 
    238230function set_current_screen( $hook_name =  '' ) { 
    239     global $current_screen; 
    240  
    241     $current_screen = new WP_Screen( $hook_name ); 
    242  
    243     $current_screen = apply_filters('current_screen', $current_screen); 
     231    WP_Screen::get( $hook_name )->set_current_screen(); 
    244232} 
    245233 
     
    321309     * The post type associated with the screen, if any. 
    322310     * The 'edit.php?post_type=page' screen has a post type of 'page'. 
     311     * The 'edit-tags.php?taxonomy=$taxonomy&post_type=page' screen has a post type of 'page'. 
    323312     * 
    324313     * @since 3.3.0 
     
    344333     * @access private 
    345334     */ 
    346     private static $_help_tabs = array(); 
     335    private $_help_tabs = array(); 
    347336  
    348337    /** 
    349      * The help sidebar data associated with screens, if any. 
     338     * The help sidebar data associated with screen, if any. 
    350339     * 
    351340     * @since 3.3.0 
     
    353342     * @access private 
    354343     */ 
    355     private static $_help_sidebar = array(); 
     344    private $_help_sidebar = ''; 
    356345 
    357346    /** 
     
    361350 
    362351    /** 
    363      * The screen options associated with screens, if any. 
     352     * The screen options associated with screen, if any. 
    364353     * 
    365354     * @since 3.3.0 
     
    367356     * @access private 
    368357     */ 
    369     private static $_options = array(); 
     358    private $_options = array(); 
     359 
     360    /** 
     361     * The screen object registry. 
     362     * 
     363     * @since 3.3.0 
     364     * @var array 
     365     * @access private 
     366     */ 
     367    private static $_registry = array(); 
    370368 
    371369    /** 
     
    387385    private $_screen_settings; 
    388386 
     387    /** 
     388     * Fetches a screen object. 
     389     * 
     390     * @since 3.3.0 
     391     * @access public 
     392     * 
     393     * @param string $hook_name Optional. The hook name (also known as the hook suffix) used to determine the screen. 
     394     *  Defaults to the current $hook_suffix global. 
     395     * @return WP_Screen Screen object. 
     396     */ 
     397    public function get( $hook_name = '' ) { 
     398  
     399        if ( is_a( $hook_name, 'WP_Screen' ) ) 
     400            return $hook_name; 
     401  
     402        $action = $post_type = $taxonomy = ''; 
     403 
     404        if ( $hook_name ) { 
     405            if ( '-network' == substr( $hook_name, -8 ) ) 
     406                $hook_name = str_replace( '-network', '', $hook_name ); 
     407            elseif ( '-user' == substr( $hook_name, -5 ) ) 
     408                $hook_name = str_replace( '-user', '', $hook_name ); 
     409            $id = sanitize_key( $hook_name ); 
     410            if ( false !== strpos( $id, '-' ) ) { 
     411                list( $id, $second ) = explode( '-', $id, 2 ); 
     412                if ( taxonomy_exists( $second ) ) { 
     413                    $id = 'edit-tags'; 
     414                    $taxonomy = $second; 
     415                } elseif ( post_type_exists( $second ) ) { 
     416                    $post_type = $second; 
     417                } else { 
     418                    $id .= '-' . $second; 
     419                } 
     420            } 
     421        } else { 
     422            $id = $GLOBALS['hook_suffix']; 
     423            $id = str_replace( '.php', '', $id ); 
     424            if ( in_array( substr( $id, -4 ), array( '-add', '-new' ) ) ) 
     425                $action = 'add'; 
     426            $id = str_replace( array( '-new', '-add' ), '', $id ); 
     427        } 
     428  
     429        if ( 'index' == $id ) 
     430            $id = 'dashboard'; 
     431  
     432        $base = $id; 
     433  
     434        // If this is the current screen, see if we can be more accurate for post types and taxonomies. 
     435        if ( ! $hook_name ) { 
     436            switch ( $base ) { 
     437                case 'post' : 
     438                    if ( isset( $_GET['post'] ) ) 
     439                        $post_id = (int) $_GET['post']; 
     440                    elseif ( isset( $_POST['post_ID'] ) ) 
     441                        $post_id = (int) $_POST['post_ID']; 
     442                    else 
     443                        $post_id = 0; 
     444 
     445                    if ( $post_id ) { 
     446                        $post = get_post( $post_id ); 
     447                        if ( $post ) 
     448                            $post_type = $post->post_type; 
     449                    } elseif ( isset( $_POST['post_type'] ) && post_type_exists( $_POST['post_type'] ) ) { 
     450                        $post_type = $_GET['post_type']; 
     451                    } elseif ( $action == 'add' && isset( $_GET['post_type'] ) && post_type_exists( $_GET['post_type'] ) ) { 
     452                        $post_type = $_GET['post_type']; 
     453                    } 
     454                    break; 
     455                case 'edit' : 
     456                    if ( isset( $_GET['post_type'] ) && post_type_exists( $_GET['post_type'] ) ) 
     457                        $post_type = $_GET['post_type']; 
     458                    break; 
     459                case 'edit-tags' : 
     460                    if ( isset( $_REQUEST['taxonomy'] ) && taxonomy_exists( $_REQUEST['taxonomy'] ) ) 
     461                        $taxonomy = $_REQUEST['taxonomy']; 
     462                    if ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) ) 
     463                        $post_type = $_REQUEST['post_type']; 
     464                    else 
     465                        $post_type = 'post'; 
     466                    break; 
     467            } 
     468        } 
     469  
     470        switch ( $base ) { 
     471            case 'post' : 
     472                if ( ! $post_type ) 
     473                    $post_type = 'post'; 
     474                $id = $post_type; 
     475                break; 
     476            case 'edit' : 
     477                if ( ! $post_type ) 
     478                    $post_type = 'post'; 
     479                $id .= '-' . $post_type; 
     480                break; 
     481            case 'edit-tags' : 
     482                if ( ! $taxonomy ) 
     483                    $taxonomy = 'post_tag'; 
     484                $id = 'edit-' . $taxonomy; 
     485                break; 
     486        } 
     487  
     488        if ( is_network_admin() ) { 
     489            $id   .= '-network'; 
     490            $base .= '-network'; 
     491        } elseif ( is_user_admin() ) { 
     492            $id   .= '-user'; 
     493            $base .= '-user'; 
     494        } 
     495  
     496        if ( isset( self::$_registry[ $id ] ) ) 
     497            return self::$_registry[ $id ]; 
     498 
     499        $screen = new WP_Screen(); 
     500        $screen->id         = $id; 
     501        $screen->base       = $base; 
     502        $screen->action     = $action; 
     503        $screen->post_type  = $post_type; 
     504        $screen->taxonomy   = $taxonomy; 
     505        $screen->is_user    = is_user_admin(); 
     506        $screen->is_network = is_network_admin(); 
     507 
     508        self::$_registry[ $id ] = $screen; 
     509 
     510        return $screen; 
     511    } 
     512  
     513    /** 
     514     * Makes the screen object the current screen. 
     515     * 
     516     * @see set_current_screen() 
     517     * @since 3.3.0 
     518     */ 
     519    function set_current_screen() { 
     520        global $current_screen, $taxnow, $typenow; 
     521        $current_screen = $this; 
     522        $taxnow = $this->taxonomy; 
     523        $typenow = $this->post_type; 
     524        $current_screen = apply_filters( 'current_screen', $current_screen ); 
     525    } 
     526 
    389527    /** 
    390528     * Constructor 
    391529     * 
    392530     * @since 3.3.0 
    393      * 
    394      * @param string $id A screen id.  If empty, the $hook_suffix global is used to derive the ID. 
    395      */ 
    396     public function __construct( $id = '' ) { 
    397         global $hook_suffix, $typenow, $taxnow; 
    398  
    399         $action = ''; 
    400  
    401         if ( empty( $id ) ) { 
    402             $screen = $hook_suffix; 
    403             $screen = str_replace('.php', '', $screen); 
    404             if ( preg_match('/-add|-new$/', $screen) ) 
    405                 $action = 'add'; 
    406             $screen = str_replace('-new', '', $screen); 
    407             $screen = str_replace('-add', '', $screen); 
    408             $this->id = $this->base = $screen; 
    409         } else { 
    410             $id = sanitize_key( $id ); 
    411             if ( false !== strpos($id, '-') ) { 
    412                 list( $id, $typenow ) = explode('-', $id, 2); 
    413                 if ( taxonomy_exists( $typenow ) ) { 
    414                     $id = 'edit-tags'; 
    415                     $taxnow = $typenow; 
    416                     $typenow = ''; 
    417                 } 
    418             } 
    419             $this->id = $this->base = $id; 
    420         } 
    421  
    422         $this->action = $action; 
    423  
    424         // Map index to dashboard 
    425         if ( 'index' == $this->base ) 
    426             $this->base = 'dashboard'; 
    427         if ( 'index' == $this->id ) 
    428             $this->id = 'dashboard'; 
    429  
    430         if ( 'edit' == $this->id ) { 
    431             if ( empty($typenow) ) 
    432                 $typenow = 'post'; 
    433             $this->id .= '-' . $typenow; 
    434             $this->post_type = $typenow; 
    435         } elseif ( 'post' == $this->id ) { 
    436             if ( empty($typenow) ) 
    437                 $typenow = 'post'; 
    438             $this->id = $typenow; 
    439             $this->post_type = $typenow; 
    440         } elseif ( 'edit-tags' == $this->id ) { 
    441             if ( empty($taxnow) ) 
    442                 $taxnow = 'post_tag'; 
    443             $this->id = 'edit-' . $taxnow; 
    444             $this->taxonomy = $taxnow; 
    445         } 
    446  
    447         $this->is_network = is_network_admin(); 
    448         $this->is_user = is_user_admin(); 
    449  
    450         if ( $this->is_network ) { 
    451             $this->base .= '-network'; 
    452             $this->id .= '-network'; 
    453         } elseif ( $this->is_user ) { 
    454             $this->base .= '-user'; 
    455             $this->id .= '-user'; 
    456         } 
    457  
    458         if ( ! isset( self::$_help_tabs[ $this->id ] ) ) 
    459             self::$_help_tabs[ $this->id ] = array(); 
    460         if ( ! isset( self::$_help_sidebar[ $this->id ] ) ) 
    461             self::$_help_sidebar[ $this->id ] = ''; 
    462         if ( ! isset( self::$_options[ $this->id ] ) ) 
    463             self::$_options[ $this->id ] = array(); 
    464     } 
     531     * @access private 
     532     */ 
     533    private function __construct() {} 
    465534 
    466535    /** 
     
    502571     */ 
    503572    public function add_option( $option, $args = array() ) { 
    504         self::$_options[ $this->id ][ $option ] = $args; 
     573        $this->_options[ $option ] = $args; 
    505574    } 
    506575 
     
    513582     */ 
    514583    public function get_option( $option, $key = false ) { 
    515         if ( ! isset( self::$_options[ $this->id ][ $option ] ) ) 
     584        if ( ! isset( $this->_options[ $option ] ) ) 
    516585            return null; 
    517586        if ( $key ) { 
    518             if ( isset( self::$_options[ $this->id ][ $option ][ $key ] ) ) 
    519                 return self::$_options[ $this->id ][ $option ][ $key ]; 
     587            if ( isset( $this->_options[ $option ][ $key ] ) ) 
     588                return $this->_options[ $option ][ $key ]; 
    520589            return null; 
    521590        } 
    522         return self::$_options[ $this->id ][ $option ]; 
     591        return $this->_options[ $option ]; 
    523592    } 
    524593 
     
    551620            return; 
    552621 
    553         self::$_help_tabs[ $this->id ][] = $args; 
     622        $this->_help_tabs[] = $args; 
    554623    } 
    555624 
     
    563632     */ 
    564633    public function add_help_sidebar( $content ) { 
    565         self::$_help_sidebar[ $this->id ] = $content; 
     634        $this->_help_sidebar = $content; 
    566635    } 
    567636 
     
    578647        self::$_old_compat_help = apply_filters( 'contextual_help_list', self::$_old_compat_help, $this ); 
    579648 
    580         if ( isset( self::$_old_compat_help[ $this->id ] ) || empty(self::$_help_tabs[ $this->id ] ) ) { 
     649        if ( isset( self::$_old_compat_help[ $this->id ] ) || empty($this->_help_tabs ) ) { 
    581650            // Call old contextual_help filter. 
    582651            if ( isset( self::$_old_compat_help[ $this->id ] ) ) 
     
    604673                'callback' => array( $this, 'render_screen_options' ), 
    605674            ) ); 
    606             $_options_tab = array_pop( self::$_help_tabs[ $this->id ] ); 
    607             array_unshift( self::$_help_tabs[ $this->id ], $_options_tab ); 
     675            $_options_tab = array_pop( $this->_help_tabs ); 
     676            array_unshift( $this->_help_tabs, $_options_tab ); 
    608677        } 
    609678 
     
    615684                <div class="contextual-help-tabs"> 
    616685                    <ul> 
    617                     <?php foreach ( self::$_help_tabs[ $this->id ] as $i => $tab ): 
     686                    <?php foreach ( $this->_help_tabs as $i => $tab ): 
    618687                        $link_id  = "tab-link-{$tab['id']}"; 
    619688                        $panel_id = "tab-panel-{$tab['id']}"; 
     
    630699                </div> 
    631700 
    632                 <?php if ( ! empty( self::$_help_sidebar[ $this->id ] ) ) : ?> 
     701                <?php if ( ! empty( $this->_help_sidebar ) ) : ?> 
    633702                <div class="contextual-help-sidebar"> 
    634                     <?php echo self::$_help_sidebar[ $this->id ]; ?> 
     703                    <?php echo self::$this->_help_sidebar; ?> 
    635704                </div> 
    636705                <?php endif; ?> 
    637706 
    638707                <div class="contextual-help-tabs-wrap"> 
    639                     <?php foreach ( self::$_help_tabs[ $this->id ] as $i => $tab ): 
     708                    <?php foreach ( $this->_help_tabs as $i => $tab ): 
    640709                        $panel_id = "tab-panel-{$tab['id']}"; 
    641710                        $classes  = ( $i == 0 ) ? 'active' : ''; 
     
    678747        } 
    679748 
    680         if ( $this->_screen_settings || self::$_options[ $this->id ] ) 
     749        if ( $this->_screen_settings || $this->_options ) 
    681750            $show_screen = true; 
    682751 
  • trunk/wp-admin/post.php

    r18796 r19052  
    1717wp_reset_vars(array('action', 'safe_mode', 'withcomments', 'posts', 'content', 'edited_post_title', 'comment_error', 'profile', 'trackback_url', 'excerpt', 'showcomments', 'commentstart', 'commentend', 'commentorder')); 
    1818 
    19 if ( isset($_GET['post']) ) 
    20     $post_id = (int) $_GET['post']; 
    21 elseif ( isset($_POST['post_ID']) ) 
    22     $post_id = (int) $_POST['post_ID']; 
    23 else 
    24     $post_id = 0; 
    25 $post_ID = $post_id; 
    26 $post = null; 
    27 $post_type_object = null; 
    28 $post_type = null; 
    29 if ( $post_id ) { 
    30     $post = get_post($post_id); 
    31     if ( $post ) { 
    32         $post_type_object = get_post_type_object($post->post_type); 
    33         if ( $post_type_object ) { 
    34             $post_type = $post->post_type; 
    35             $current_screen->post_type = $post->post_type; 
    36             $current_screen->id = $current_screen->post_type; 
    37         } 
    38     } 
    39 } elseif ( isset($_POST['post_type']) ) { 
    40     $post_type_object = get_post_type_object($_POST['post_type']); 
    41     if ( $post_type_object ) { 
    42         $post_type = $post_type_object->name; 
    43         $current_screen->post_type = $post_type; 
    44         $current_screen->id = $current_screen->post_type; 
    45     } 
     19if ( isset( $_GET['post'] ) ) 
     20    $post_id = $post_ID = (int) $_GET['post']; 
     21elseif ( isset( $_POST['post_ID'] ) ) 
     22    $post_id = $post_ID = (int) $_POST['post_ID']; 
     23 else 
     24    $post_id = $post_ID = 0; 
     25 
     26$post = $post_type = $post_type_object = null; 
     27 
     28if ( $post_id ) 
     29    $post = get_post( $post_id ); 
     30 
     31if ( $post ) { 
     32    $post_type = $post->post_type; 
     33    $post_type_object = get_post_type_object( $post_type ); 
    4634} 
    4735 
Note: See TracChangeset for help on using the changeset viewer.