#1721
Vladimir
Keymaster

This is the updated version, which takes into account front-end and blocks editing selected pages. You need update it for your role.


add_action('pre_get_posts', 'restrict_posts_list');

function restrict_posts_list($query) {

    if ( !is_blog_admin()) { 
        return $query;
    }
    
    if (current_user_can('administrator') || !current_user_can('editor'))  {
        return $query;
    }
    
    $suppressing_filters = $query->get('suppress_filters'); // Filter suppression on?

    if ($suppressing_filters) {
        return query;
    }

    if ($query->query['post_type']=='page') {            
        $posts_restriction_type = 2; // Prohibit
        $posts_list = array(709, 763);  // comma separated list of pages IDs
        if ($posts_restriction_type==1) {   // Allow
            $query->set('post__in', $posts_list);
        } else {    // Prohibit
            $query->set('post__not_in', $posts_list);
        }
    }

    return $query;
}
// end of restrict_posts_list()

function current_user_has_role($role_to_check) {
    global $current_user;
    
    $has_role = false;
    foreach($current_user->roles as $role) {
        if ($role===$role_to_check) {
            $has_role = true;
            break;
        }
    }
    
    return $has_role;
}
// end of current_user_has_role()

function get_pages_capabilities() {
    $cap_object = new stdClass();
    $cap_object->capability_type = 'page';
    $cap_object->capabilities = array();
    $cap_object->map_meta_cap = true;
    $capabilities = (array) get_post_type_capabilities($cap_object);
    
    return $capabilities;
}

add_filter('map_meta_cap', 'block_edit_pages', 10, 4);

function block_edit_pages($caps, $cap = '', $user_id = 0, $args = array()) {

    if (current_user_has_role('administrator') || !current_user_has_role('editor')) {
        return $caps;
    }
    
    if (substr($cap, 0, 4)=='read') {   // do not block read capabilities
        return $caps;
    }
    
    $posts_restriction_type = 2; // Prohibit
    $posts_list = array(709, 763);   // comma separated list of pages IDs
    

    $capabilities = get_pages_capabilities();        
    if (!isset($capabilities[$cap])) {
        return $caps;
    }

    if (count($args) > 0) {
        $post_id = $args[0];
    } else {
        $post_id = filter_input(INPUT_GET, 'post', FILTER_SANITIZE_NUMBER_INT);
    }
    if (empty($post_id)) {
        return $caps;
    }

    $post = get_post($post_id);    
    if (empty($post) || $post->post_type!=='page') {
        return $caps;
    }

    $do_not_allow = in_array($post_id, $posts_list);    // not edit these pages
    if ($posts_restriction_type == 1) {
        $do_not_allow = !$do_not_allow;   // not edit other pages
    }
    if ($do_not_allow) {
        $caps[] = 'do_not_allow';
    }

    return $caps;
}
// end of block_edit_pages()