Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Is it possible to have any control over the screen options for Appearance>Menus. I am working on a theme and with a fresh Wordpress install where I had never touched any of the screen options ( at least not under Appearance>Menus anyway ). I had 3 custom post types. Of these one was "missing". I investigated Screen Options and it turned out that one was unchecked, while the other two were checked. I don't know what I did to get it this way but I would like it to be consistent for users anyway. Has anyone got any ideas or information on this front? Ideally I would like to know that all three custom post types would be checked on a fresh install or a new user.

share|improve this question

1 Answer 1

up vote 2 down vote accepted

This option is stored in the wp_usermeta table with the meta_key name of metaboxhidden_nav-menus.

If we hide all the boxes, this is the meta_value of the option:

array(
    "nav-menu-theme-locations", 
    "add-custom-links", 
    "add-post", 
    "add-page", 
    "add-portfolio", 
    "add-category", 
    "add-post_tag", 
    "add-post_format", 
    "add-location"
)

There is one CPT, portfolio. If we wanted for it to be always visible every time the user visits the page (/wp-admin/nav-menus.php), this code would do that:

add_filter( 'get_user_option_metaboxhidden_nav-menus', 'cpt_always_visible_wpse_87882', 10, 3 );

function cpt_always_visible_wpse_87882( $result, $option, $user )
{ 
    if( in_array( 'add-portfolio', $result ) )
        $result = array_diff( $result, array( 'add-portfolio' ) );

    //$show_boxes = array( 'cpt1', 'cpt2', 'cpt3' );
    //if( in_array( $show_boxes, $result ) )
    //  $result = array_diff( $result, $show_boxes );

    return $result;
}

But this forces the CPT to be visible even if the user un-checks the Screen Option. In the next visit to the page, the box will be visible again.

To do it one time after user registration, the action hook user_register should be used together with the function update_user_meta.

To do it on a fresh install, a custom install.php could be used. Maybe another technique is available, but not sure about it...

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.