• I have a question about restricting access to page templates for blog editors who may create new pages in the future. During my buildout, I had to create specific templates to add custom features for specific pages (i.e. the “FAQs” Page Template pulls a CPT in a separate loop, but allows the editor to add an intro paragraph using the standard “page” post type)

    Now as I hand off the site, I want to make sure that those templates aren’t re-used by the site editors as they are constructing new pages. Is there a way to limit the available page templates by user role? Or is it possible to just remove the “Page Template” dropdown completely? I can use Adminimize (http://wordpress.org/plugins/adminimize/) to remove the dropdown, but the label still remains.

    Thanks, Devin

Viewing 3 replies - 1 through 3 (of 3 total)
  • Thread Starter unwrittendevin

    (@unwrittendevin)

    So with some research, seeing that there is no way to really restrict the options within the Page Attributes meta box, I had to remove the Page Attributes meta box and then add it back in for the “Page” post type. From there I was able to wrap the “Template” and “Order” fields within DIVs with IDs so I could isolate them out.

    My solution was modified on this page [http://wordpress.stackexchange.com/questions/90903/how-to-remove-the-template-drop-down-but-keep-parent-and-order] and also utilizing Adminimize [http://wordpress.org/plugins/adminimize/] to hide items by role and specific ID for post type.

    <?php
    /************* CUSTOMIZE Page Attributes *******************/
    function remove_post_custom_fields() {
    	remove_meta_box( 'pageparentdiv' , 'page' , 'side' );
        }
        add_action( 'admin_menu' , 'remove_post_custom_fields' );
    
        function add_post_custom_fields() {
            add_meta_box('pageparentdiv', 'Page Attributes', 'my_page_attributes_meta_box', 'page', 'side');
        }
        add_action( 'admin_menu' , 'add_post_custom_fields' );
        function my_page_attributes_meta_box($post) {
        $post_type_object = get_post_type_object($post->post_type);
        if ( $post_type_object->hierarchical ) {
            $dropdown_args = array(
                'post_type'        => $post->post_type,
                'exclude_tree'     => $post->ID,
                'selected'         => $post->post_parent,
                'name'             => 'parent_id',
                'show_option_none' => __('(no parent)'),
                'sort_column'      => 'menu_order, post_title',
                'echo'             => 0,
            );
            $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args',   $dropdown_args, $post );
            $pages = wp_dropdown_pages( $dropdown_args );
            if ( ! empty($pages) ) {
        ?>
        <p><strong><?php _e('Parent') ?></strong></p>
        <label class="screen-reader-text" for="parent_id"><?php _e('Parent') ?></label>
        <?php echo $pages; ?>
        <?php
            } // end empty pages check
        } // end hierarchical check.
        if ( 'page' == $post->post_type && 0 != count( get_page_templates() ) ) {
            $template = !empty($post->page_template) ? $post->page_template : false;
            ?>
        <div id="pagetemplatediv">
            <p><strong><?php _e('Template') ?></strong></p>
            <label class="screen-reader-text" for="page_template"><?php _e('Page Template') ?></label>
            <select name="page_template" id="page_template">
                <option value='default'><?php _e('Default Template'); ?></option>
                <?php page_template_dropdown($template); ?>
            </select>
         <?php } ?>
        </div>
        <div id="pageorderdiv">
            <p><strong><?php _e('Order') ?></strong></p>
            <p><label class="screen-reader-text" for="menu_order"><?php _e('Order') ?></label>
            <input name="menu_order" type="text" size="4" id="menu_order" value="<?php echo esc_attr($post->menu_order) ?>" /></p>
        </div>
        <p><?php if ( 'page' == $post->post_type ) _e( 'Need Help? Use the Help tab in the upper right of your screen.' ); ?></p>
        <?php } ?>

    Of course, if there is a better way to be able to remove the Template and Order fields based on user roles without having to remove the meta box from the core functionality, I am open to better suggestions!

    Thank you!
    I added a check to the function, so that it only changes things for non-admins:

    function remove_post_custom_fields() {
    	if ( ! current_user_can('manage_options') )	remove_meta_box( 'pageparentdiv' , 'page' , 'side' );
    }

    I also changed the drop down box for page parents around a bit with custom arguments, found in this
    stackexchange.

    I found this plugin: IM8 Box Hide
    https://wordpress.org/plugins/im8-box-hide/
    It’s usefull to hide meta boxes based on roles, for example the page attributes box for Editor user. 🙂

Viewing 3 replies - 1 through 3 (of 3 total)
  • The topic ‘Limit Page Templates based on User Roles’ is closed to new replies.