[wp-trac] Re: [WordPress Trac] #7070: users with 'edit_published_posts' can't edit posts without unpublishing them.

WordPress Trac wp-trac at lists.automattic.com
Mon Jun 2 20:27:24 GMT 2008

#7070: users with 'edit_published_posts' can't edit posts without unpublishing
 Reporter:  jeremyclarke  |        Owner:  jeremyclarke
     Type:  defect        |       Status:  new         
 Priority:  high          |    Milestone:  2.5.2       
Component:  General       |      Version:  2.5.1       
 Severity:  major         |   Resolution:              
 Keywords:  has-patch,    |  
Comment (by jeremyclarke):

 Okay, so the jun2 patch for trunk fixes the problem above. The edit-form-
 advanced.php part is the same, but I added to the wp-
 admin/includes/post.php part.

 In the _wp_translate_postdata() function, where the permissions checking
 for post publishing/pending status is done while screening the other
 $_POST values, it recieves both requests to PUBLISH and to SUBMIT FOR

  $_POST['post_status'] = 'publish'

 Personally, i would expect pending submissions to be submitted to _POST
 with their own status (i.e. 'pending'), but as of now it just claims to
 want to be published. What _wp_translate_postdata() does is switch that
 'publish' status to 'pending' IF the person submitting doesn't have the
 right permissions.

 This wasn't serving the 'edit_published_posts' capability very well
 because it was only checking if the NEW status (in $_POST) was 'publish'
 and switching it to 'pending' if the user didn't have the 'publish_posts'

 Instead what needs to happen is another layer of checking, where even if
 the person can't publish posts but is asking to publish, it checks to make
 sure the old status wasn't already 'publish' (i.e. that it isn't a
 previously published post) and if WAS aldready published, and the person
 is allowed to 'edit_published_posts' then it leaves the status as
 'published' rather than switching it to pending.


 $previous_status = get_post_field('post_status',  $_POST['ID']);

 if ( 'publish' == $_POST['post_status'] && !current_user_can(
 'publish_posts' ) ) :
         // Stop attempts to publish new posts, but allow already published
 posts to be saved if appropriate.
         if ( $previous_status != 'publish' OR !current_user_can(
 'edit_published_posts') )
                 $_POST['post_status'] = 'pending';


 I think that it's pretty solid and should be implemented ASAP. I will make
 a 2.5 patch of these changes soon.

 For the record: The edit-page-form.php file is completely screwed up in
 the way it handles the status dropdown menu if someone has edit_pages but
 not 'publish_pages', it marks things as private when you ask to publish
 and then tells it was published, I'm pretty sure that there was just never
 anyone who tried giving that privilege combination, but it's worth taking
 a look at. The changes in this patch won't fix the problesm with pages
 until that is sorted out, I might do it eventually, but post permissions
 is my priority atm.

 Feedback very welcome, i'd love to hear from a core dev.

Ticket URL: <http://trac.wordpress.org/ticket/7070#comment:2>
WordPress Trac <http://trac.wordpress.org/>
WordPress blogging software

More information about the wp-trac mailing list