WordPress.org

Make WordPress Core

Changeset 19052


Ignore:
Timestamp:
10/24/2011 06:34:08 PM (7 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.