Ensure that private posts cannot be made sticky via Quick Edit.

DRY the logic for stickies in `wp_xmlrpc_server` by introducing `->_toggle_sticky()`.

Props wonderboymusic, obenland, chriscct7.
Fixes #20662.


git-svn-id: https://develop.svn.wordpress.org/trunk@33325 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Scott Taylor 2015-07-19 18:08:55 +00:00
parent a22368a225
commit e690aa50ad
2 changed files with 53 additions and 24 deletions

View File

@ -1567,10 +1567,12 @@ function wp_ajax_inline_save() {
$data['parent_id'] = $data['post_parent']; $data['parent_id'] = $data['post_parent'];
// Status. // Status.
if ( isset($data['keep_private']) && 'private' == $data['keep_private'] ) if ( isset( $data['keep_private'] ) && 'private' == $data['keep_private'] ) {
$data['visibility'] = 'private';
$data['post_status'] = 'private'; $data['post_status'] = 'private';
else } else {
$data['post_status'] = $data['_status']; $data['post_status'] = $data['_status'];
}
if ( empty($data['comment_status']) ) if ( empty($data['comment_status']) )
$data['comment_status'] = 'closed'; $data['comment_status'] = 'closed';

View File

@ -1192,6 +1192,40 @@ class wp_xmlrpc_server extends IXR_Server {
return $count > 1; return $count > 1;
} }
/**
* @since 4.3.0
*
* @param array $post_data
* @param bool $update
* @return void|IXR_Error
*/
private function _toggle_sticky( $post_data, $update = false ) {
$post_type = get_post_type_object( $post_data['post_type'] );
// Private and password-protected posts cannot be stickied.
if ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) {
// Error if the client tried to stick the post, otherwise, silently unstick.
if ( ! empty( $post_data['sticky'] ) ) {
return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );
}
if ( $update ) {
unstick_post( $post_data['ID'] );
}
} elseif ( isset( $post_data['sticky'] ) ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to stick this post.' ) );
}
$sticky = wp_validate_boolean( $post_data['sticky'] );
if ( $sticky ) {
stick_post( $post_data['ID'] );
} else {
unstick_post( $post_data['ID'] );
}
}
}
/** /**
* Helper method for wp_newPost() and wp_editPost(), containing shared logic. * Helper method for wp_newPost() and wp_editPost(), containing shared logic.
* *
@ -1287,20 +1321,9 @@ class wp_xmlrpc_server extends IXR_Server {
$post_ID = $post_data['ID']; $post_ID = $post_data['ID'];
if ( $post_data['post_type'] == 'post' ) { if ( $post_data['post_type'] == 'post' ) {
// Private and password-protected posts cannot be stickied. $error = $this->_toggle_sticky( $post_data, $update );
if ( $post_data['post_status'] == 'private' || ! empty( $post_data['post_password'] ) ) { if ( $error ) {
// Error if the client tried to stick the post, otherwise, silently unstick. return $error;
if ( ! empty( $post_data['sticky'] ) )
return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );
if ( $update )
unstick_post( $post_ID );
} elseif ( isset( $post_data['sticky'] ) ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) )
return new IXR_Error( 401, __( 'Sorry, you are not allowed to stick this post.' ) );
if ( $post_data['sticky'] )
stick_post( $post_ID );
else
unstick_post( $post_ID );
} }
} }
@ -4902,10 +4925,12 @@ class wp_xmlrpc_server extends IXR_Server {
// Only posts can be sticky // Only posts can be sticky
if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) { if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) {
if ( $content_struct['sticky'] == true ) $data = $postdata;
stick_post( $post_ID ); $data['sticky'] = $content_struct['sticky'];
elseif ( $content_struct['sticky'] == false ) $error = $this->_toggle_sticky( $data );
unstick_post( $post_ID ); if ( $error ) {
return $error;
}
} }
if ( isset($content_struct['custom_fields']) ) if ( isset($content_struct['custom_fields']) )
@ -5250,10 +5275,12 @@ class wp_xmlrpc_server extends IXR_Server {
// Only posts can be sticky // Only posts can be sticky
if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) { if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) {
if ( $content_struct['sticky'] == true ) $data = $newpost;
stick_post( $post_ID ); $data['sticky'] = $content_struct['sticky'];
elseif ( $content_struct['sticky'] == false ) $error = $this->_toggle_sticky( $data, true );
unstick_post( $post_ID ); if ( $error ) {
return $error;
}
} }
if ( isset($content_struct['custom_fields']) ) if ( isset($content_struct['custom_fields']) )