I'm using a custom post type to let contributors have a personal page on the site.

Any time a user registers on my site a script creates a custom type post that has the registering user as the author.

To moderate users' entries this post is published by an editor.

I would like users (contributors) to be:

  • unable to add other posts of this custom type;
  • able to edit the already published post they are the author of;
  • and their changes must be approved by an editor before being published.

I'm using User Role Editor to manage roles and capabilities.

Is there a way to do that?

3 Answers 3


Using Role editor or role scope you can set contributors to edit you custom post type but not publish so every change will be set as draft until approval, and to limit the creation of new posts of your custom post type you can use my plugin Bainternet Posts Creation Limits


To force re approval of edits add this code

add_filter( 'wp_insert_post_data', 're_aprove', '99', 2 );
function re_aprove( $data, $postarr ) {
    //check if current user is not admin
    if ( ! current_user_can( 'manage_options' ) && 'YOUR_CUSTOM_TYPE' === $postarr['post_type'] ) {
        if ( 'publish' === $data['post_status'] ) {
            $data['post_status'] = 'pending';
    return $data;

and change YOUR_CUSTOM_TYPE to your custom post type name.

  • I'm already using Role Editor and i've set up the capabilities as you suggested, but the only thing changing is that the users has an additional checkbox right above the "pubblish" button asking to "save as pending revision". The problem is that i do not want the user to decide wether pubblish or not, they just shouldn't be able to pubblish but just save as pending revision.
    – bluantinoo
    Commented May 17, 2011 at 15:01
  • If you set up correctly then they just can't publish.
    – Bainternet
    Commented May 17, 2011 at 15:13
  • i've tried but maybe there's something I do not understand. This is a shot of my capabilities settings for the role I want to manage. As you can see hilighted, i've already set capability to edit_mycustomposttype but no pubblish_mycustomposttype. but still my users are able to pubblish edits...
    – bluantinoo
    Commented May 18, 2011 at 13:52
  • OK i see what you mean, they can publish edits, that's just how wordpress works, but if you want to force re approval i updated my answer and added a function which saves the post as a draft if the user is not an admin.
    – Bainternet
    Commented May 18, 2011 at 17:54
  • 1
    I'm not certain but I think the line if ($data['post_status'] = "publish"){ should read if ($data['post_status'] == "publish"){ - otherwise it's not testing it's assigning. Can you update your answer if I'm right?
    – jammypeach
    Commented Jul 28, 2014 at 12:36

Mine didn't work until I added the '99' , 2); to the end of the add_filter.

Here is the reference as to why: http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_insert_post_data

add_filter('wp_insert_post_data','re_aprove', '99', 2);
function re_aprove( $data , $postarr ){
    global $current_user;
    //check if current user is not admin
    if (!current_user_can('manage_options') && $postarr['post_type'] == "candy-item" ){ 
        if ($data['post_status'] = "publish"){
            $data['post_status'] = "pending";
    return $data;

finally i've solved using Revisionary plugin, http://wordpress.org/extend/plugins/revisionary/ it's used to do exacly what I ask in the subject title

for more detailed control over capabilities (with revisionary already integrated) there is Role Scoper http://wordpress.org/extend/plugins/role-scoper/

the first one is really easy to setup and use the second needs a lot more practice, userinterface it's a bit confusing, but it's really powerful

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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