* options, etc.
*
* As of WordPress 3.5.0, XML-RPC is enabled by default. It can be disabled
- * via the xmlrpc_enabled filter found in wp_xmlrpc_server::login().
+ * via the {@see 'xmlrpc_enabled'} filter found in wp_xmlrpc_server::login().
*
* @package WordPress
* @subpackage Publishing
public $error;
/**
- * Register all of the XMLRPC methods that XMLRPC server understands.
+ * Flags that the user authentication has failed in this instance of wp_xmlrpc_server.
+ *
+ * @access protected
+ * @var bool
+ */
+ protected $auth_failed = false;
+
+ /**
+ * Registers all of the XMLRPC methods that XMLRPC server understands.
*
* Sets up server and method property. Passes XMLRPC
- * methods through the 'xmlrpc_methods' filter to allow plugins to extend
- * or replace XMLRPC methods.
+ * methods through the {@see 'xmlrpc_methods'} filter to allow plugins to extend
+ * or replace XML-RPC methods.
*
* @since 1.5.0
*/
$this->initialise_blog_option_info();
/**
- * Filter the methods exposed by the XML-RPC server.
+ * Filters the methods exposed by the XML-RPC server.
*
* This filter can be used to add new methods, and remove built-in methods.
*
}
/**
- * Make private/protected methods readable for backwards compatibility.
+ * Make private/protected methods readable for backward compatibility.
*
* @since 4.0.0
* @access public
}
/**
+ * Serves the XML-RPC request.
+ *
+ * @since 2.9.0
* @access public
*/
public function serve_request() {
}
/**
- * Filter whether XML-RPC is enabled.
+ * Filters whether XML-RPC methods requiring authentication are enabled.
+ *
+ * Contrary to the way it's named, this filter does not control whether XML-RPC is *fully*
+ * enabled, rather, it only controls whether XML-RPC methods requiring authentication - such
+ * as for publishing purposes - are enabled.
+ *
+ * Further, the filter does not control whether pingbacks or other custom endpoints that don't
+ * require authentication are enabled. This behavior is expected, and due to how parity was matched
+ * with the `enable_xmlrpc` UI option the filter replaced when it was introduced in 3.5.
+ *
+ * To disable XML-RPC methods that require authentication, use:
*
- * This is the proper filter for turning off XML-RPC.
+ * add_filter( 'xmlrpc_enabled', '__return_false' );
+ *
+ * For more granular control over all XML-RPC methods and requests, see the {@see 'xmlrpc_methods'}
+ * and {@see 'xmlrpc_element_limit'} hooks.
*
* @since 3.5.0
*
return false;
}
- $user = wp_authenticate($username, $password);
+ if ( $this->auth_failed ) {
+ $user = new WP_Error( 'login_prevented' );
+ } else {
+ $user = wp_authenticate( $username, $password );
+ }
- if (is_wp_error($user)) {
+ if ( is_wp_error( $user ) ) {
$this->error = new IXR_Error( 403, __( 'Incorrect username or password.' ) );
+ // Flag that authentication has failed once on this wp_xmlrpc_server instance
+ $this->auth_failed = true;
+
/**
- * Filter the XML-RPC user login error message.
+ * Filters the XML-RPC user login error message.
*
* @since 3.5.0
*
* Check user's credentials. Deprecated.
*
* @since 1.5.0
- * @deprecated 2.8.0
- * @deprecated use wp_xmlrpc_server::login
- * @see wp_xmlrpc_server::login
+ * @deprecated 2.8.0 Use wp_xmlrpc_server::login()
+ * @see wp_xmlrpc_server::login()
*
* @param string $username User's username.
* @param string $password User's password.
'readonly' => false,
'option' => 'medium_size_h'
),
+ 'medium_large_size_w' => array(
+ 'desc' => __( 'Medium-Large size image width' ),
+ 'readonly' => false,
+ 'option' => 'medium_large_size_w'
+ ),
+ 'medium_large_size_h' => array(
+ 'desc' => __( 'Medium-Large size image height' ),
+ 'readonly' => false,
+ 'option' => 'medium_large_size_h'
+ ),
'large_size_w' => array(
'desc' => __( 'Large size image width' ),
'readonly' => false,
);
/**
- * Filter the XML-RPC blog options property.
+ * Filters the XML-RPC blog options property.
*
* @since 2.6.0
*
* }
* @return array|IXR_Error Array contains:
* - 'isAdmin'
+ * - 'isPrimary' - whether the blog is the user's primary blog
* - 'url'
* - 'blogid'
* - 'blogName'
$blogs = (array) get_blogs_of_user( $user->ID );
$struct = array();
+ $primary_blog_id = 0;
+ $active_blog = get_active_blog_for_user( $user->ID );
+ if ( $active_blog ) {
+ $primary_blog_id = (int) $active_blog->blog_id;
+ }
foreach ( $blogs as $blog ) {
// Don't include blogs that aren't hosted at this site.
switch_to_blog( $blog_id );
$is_admin = current_user_can( 'manage_options' );
+ $is_primary = ( (int) $blog_id === $primary_blog_id );
$struct[] = array(
- 'isAdmin' => $is_admin,
- 'url' => home_url( '/' ),
- 'blogid' => (string) $blog_id,
- 'blogName' => get_option( 'blogname' ),
- 'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ),
+ 'isAdmin' => $is_admin,
+ 'isPrimary' => $is_primary,
+ 'url' => home_url( '/' ),
+ 'blogid' => (string) $blog_id,
+ 'blogName' => get_option( 'blogname' ),
+ 'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ),
);
restore_current_blog();
$_taxonomy['object_type'] = array_unique( (array) $taxonomy->object_type );
/**
- * Filter XML-RPC-prepared data for the given taxonomy.
+ * Filters XML-RPC-prepared data for the given taxonomy.
*
* @since 3.4.0
*
$_term['count'] = intval( $_term['count'] );
/**
- * Filter XML-RPC-prepared data for the given term.
+ * Filters XML-RPC-prepared data for the given term.
*
* @since 3.4.0
*
'post_content' => $post['post_content'],
'post_parent' => strval( $post['post_parent'] ),
'post_mime_type' => $post['post_mime_type'],
- 'link' => post_permalink( $post['ID'] ),
+ 'link' => get_permalink( $post['ID'] ),
'guid' => $post['guid'],
'menu_order' => intval( $post['menu_order'] ),
'comment_status' => $post['comment_status'],
}
/**
- * Filter XML-RPC-prepared date for the given post.
+ * Filters XML-RPC-prepared date for the given post.
*
* @since 3.4.0
*
/**
* Prepares post data for return in an XML-RPC object.
*
+ * @since 3.4.0
+ * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
* @access protected
*
- * @param object $post_type Post type object.
- * @param array $fields The subset of post fields to return.
+ * @param WP_Post_Type $post_type Post type object.
+ * @param array $fields The subset of post fields to return.
* @return array The prepared post type data.
*/
protected function _prepare_post_type( $post_type, $fields ) {
$_post_type['taxonomies'] = get_object_taxonomies( $post_type->name, 'names' );
/**
- * Filter XML-RPC-prepared date for the given post type.
+ * Filters XML-RPC-prepared date for the given post type.
*
* @since 3.4.0
+ * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object.
*
- * @param array $_post_type An array of post type data.
- * @param object $post_type Post type object.
+ * @param array $_post_type An array of post type data.
+ * @param WP_Post_Type $post_type Post type object.
*/
return apply_filters( 'xmlrpc_prepare_post_type', $_post_type, $post_type );
}
'caption' => $media_item->post_excerpt,
'description' => $media_item->post_content,
'metadata' => wp_get_attachment_metadata( $media_item->ID ),
+ 'type' => $media_item->post_mime_type
);
$thumbnail_src = image_downsize( $media_item->ID, $thumbnail_size );
$_media_item['thumbnail'] = $_media_item['link'];
/**
- * Filter XML-RPC-prepared data for the given media item.
+ * Filters XML-RPC-prepared data for the given media item.
*
* @since 3.4.0
*
protected function _prepare_page( $page ) {
// Get all of the page content and link.
$full_page = get_extended( $page->post_content );
- $link = post_permalink( $page->ID );
+ $link = get_permalink( $page->ID );
// Get info the page parent if there is one.
$parent_title = "";
);
/**
- * Filter XML-RPC-prepared data for the given page.
+ * Filters XML-RPC-prepared data for the given page.
*
* @since 3.4.0
*
);
/**
- * Filter XML-RPC-prepared data for the given comment.
+ * Filters XML-RPC-prepared data for the given comment.
*
* @since 3.4.0
*
- * @param array $_comment An array of prepared comment data.
- * @param object $comment Comment object.
+ * @param array $_comment An array of prepared comment data.
+ * @param WP_Comment $comment Comment object.
*/
return apply_filters( 'xmlrpc_prepare_comment', $_comment, $comment );
}
}
/**
- * Filter XML-RPC-prepared data for the given user.
+ * Filters XML-RPC-prepared data for the given user.
*
* @since 3.5.0
*
*
* @since 3.4.0
*
- * @link http://en.wikipedia.org/wiki/RSS_enclosure for information on RSS enclosures.
+ * @link https://en.wikipedia.org/wiki/RSS_enclosure for information on RSS enclosures.
*
* @param array $args {
* Method arguments. Note: top-level arguments must be ordered as documented.
$post_type = get_post_type_object( $post_data['post_type'] );
if ( ! $post_type )
- return new IXR_Error( 403, __( 'Invalid post type' ) );
+ return new IXR_Error( 403, __( 'Invalid post type.' ) );
$update = ! empty( $post_data['ID'] );
$post_data['post_author'] = absint( $post_data['post_author'] );
if ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] != $user->ID ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) )
- return new IXR_Error( 401, __( 'You are not allowed to create posts as this user.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) );
$author = get_userdata( $post_data['post_author'] );
$dateCreated = $post_data['post_date']->getIso();
}
+ // Default to not flagging the post date to be edited unless it's intentional.
+ $post_data['edit_date'] = false;
+
if ( ! empty( $dateCreated ) ) {
$post_data['post_date'] = get_date_from_gmt( iso8601_to_datetime( $dateCreated ) );
$post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'GMT' );
+
+ // Flag the post date to be edited.
+ $post_data['edit_date'] = true;
}
if ( ! isset( $post_data['ID'] ) )
$term = get_term_by( 'id', $term_id, $taxonomy );
if ( ! $term )
- return new IXR_Error( 403, __( 'Invalid term ID' ) );
+ return new IXR_Error( 403, __( 'Invalid term ID.' ) );
$terms[$taxonomy][] = (int) $term_id;
}
$this->attach_uploads( $post_ID, $post_data['post_content'] );
/**
- * Filter post data array to be inserted via XML-RPC.
+ * Filters post data array to be inserted via XML-RPC.
*
* @since 3.4.0
*
do_action( 'xmlrpc_call', 'wp.deletePost' );
$post = get_post( $post_id, ARRAY_A );
- if ( empty( $post['ID'] ) )
+ if ( empty( $post['ID'] ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
+ }
- if ( ! current_user_can( 'delete_post', $post_id ) )
+ if ( ! current_user_can( 'delete_post', $post_id ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) );
+ }
$result = wp_delete_post( $post_id );
- if ( ! $result )
+ if ( ! $result ) {
return new IXR_Error( 500, __( 'The post cannot be deleted.' ) );
+ }
return true;
}
$fields = $args[4];
} else {
/**
- * Filter the list of post query fields used by the given XML-RPC method.
+ * Filters the list of post query fields used by the given XML-RPC method.
*
* @since 3.4.0
*
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( ! current_user_can( 'edit_post', $post_id ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
return $this->_prepare_post( $post, $fields );
}
* @type string $username Username.
* @type string $password Password.
* @type array $filter Optional. Modifies the query used to retrieve posts. Accepts 'post_type',
- * 'post_status', 'number', 'offset', 'orderby', and 'order'.
+ * 'post_status', 'number', 'offset', 'orderby', 's', and 'order'.
* Default empty array.
* @type array $fields Optional. The subset of post type fields to return in the response array.
* }
}
if ( ! current_user_can( $post_type->cap->edit_posts ) )
- return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type' ));
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ));
$query['post_type'] = $post_type->name;
do_action( 'xmlrpc_call', 'wp.newTerm' );
if ( ! taxonomy_exists( $content_struct['taxonomy'] ) )
- return new IXR_Error( 403, __( 'Invalid taxonomy' ) );
+ return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
$taxonomy = get_taxonomy( $content_struct['taxonomy'] );
if ( ! current_user_can( $taxonomy->cap->manage_terms ) )
- return new IXR_Error( 401, __( 'You are not allowed to create terms in this taxonomy.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) );
$taxonomy = (array) $taxonomy;
do_action( 'xmlrpc_call', 'wp.editTerm' );
if ( ! taxonomy_exists( $content_struct['taxonomy'] ) )
- return new IXR_Error( 403, __( 'Invalid taxonomy' ) );
+ return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
$taxonomy = get_taxonomy( $content_struct['taxonomy'] );
if ( ! current_user_can( $taxonomy->cap->edit_terms ) )
- return new IXR_Error( 401, __( 'You are not allowed to edit terms in this taxonomy.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit terms in this taxonomy.' ) );
$taxonomy = (array) $taxonomy;
return new IXR_Error( 500, $term->get_error_message() );
if ( ! $term )
- return new IXR_Error( 404, __( 'Invalid term ID' ) );
+ return new IXR_Error( 404, __( 'Invalid term ID.' ) );
if ( isset( $content_struct['name'] ) ) {
$term_data['name'] = trim( $content_struct['name'] );
return new IXR_Error( 403, __( 'The term name cannot be empty.' ) );
}
- if ( isset( $content_struct['parent'] ) ) {
+ if ( ! empty( $content_struct['parent'] ) ) {
if ( ! $taxonomy['hierarchical'] )
return new IXR_Error( 403, __( "This taxonomy is not hierarchical so you can't set a parent." ) );
do_action( 'xmlrpc_call', 'wp.deleteTerm' );
if ( ! taxonomy_exists( $taxonomy ) )
- return new IXR_Error( 403, __( 'Invalid taxonomy' ) );
+ return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
$taxonomy = get_taxonomy( $taxonomy );
if ( ! current_user_can( $taxonomy->cap->delete_terms ) )
- return new IXR_Error( 401, __( 'You are not allowed to delete terms in this taxonomy.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete terms in this taxonomy.' ) );
$term = get_term( $term_id, $taxonomy->name );
return new IXR_Error( 500, $term->get_error_message() );
if ( ! $term )
- return new IXR_Error( 404, __( 'Invalid term ID' ) );
+ return new IXR_Error( 404, __( 'Invalid term ID.' ) );
$result = wp_delete_term( $term_id, $taxonomy->name );
do_action( 'xmlrpc_call', 'wp.getTerm' );
if ( ! taxonomy_exists( $taxonomy ) )
- return new IXR_Error( 403, __( 'Invalid taxonomy' ) );
+ return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
$taxonomy = get_taxonomy( $taxonomy );
if ( ! current_user_can( $taxonomy->cap->assign_terms ) )
- return new IXR_Error( 401, __( 'You are not allowed to assign terms in this taxonomy.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
$term = get_term( $term_id , $taxonomy->name, ARRAY_A );
return new IXR_Error( 500, $term->get_error_message() );
if ( ! $term )
- return new IXR_Error( 404, __( 'Invalid term ID' ) );
+ return new IXR_Error( 404, __( 'Invalid term ID.' ) );
return $this->_prepare_term( $term );
}
do_action( 'xmlrpc_call', 'wp.getTerms' );
if ( ! taxonomy_exists( $taxonomy ) )
- return new IXR_Error( 403, __( 'Invalid taxonomy' ) );
+ return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
$taxonomy = get_taxonomy( $taxonomy );
if ( ! current_user_can( $taxonomy->cap->assign_terms ) )
- return new IXR_Error( 401, __( 'You are not allowed to assign terms in this taxonomy.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
$query = array();
$fields = $args[4];
} else {
/**
- * Filter the taxonomy query fields used by the given XML-RPC method.
+ * Filters the taxonomy query fields used by the given XML-RPC method.
*
* @since 3.4.0
*
do_action( 'xmlrpc_call', 'wp.getTaxonomy' );
if ( ! taxonomy_exists( $taxonomy ) )
- return new IXR_Error( 403, __( 'Invalid taxonomy' ) );
+ return new IXR_Error( 403, __( 'Invalid taxonomy.' ) );
$taxonomy = get_taxonomy( $taxonomy );
if ( ! current_user_can( $taxonomy->cap->assign_terms ) )
- return new IXR_Error( 401, __( 'You are not allowed to assign terms in this taxonomy.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
return $this->_prepare_taxonomy( $taxonomy, $fields );
}
$fields = $args[4];
} else {
/**
- * Filter the default user query fields used by the given XML-RPC method.
+ * Filters the default user query fields used by the given XML-RPC method.
*
* @since 3.5.0
*
do_action( 'xmlrpc_call', 'wp.getUser' );
if ( ! current_user_can( 'edit_user', $user_id ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit users.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this user.' ) );
$user_data = get_userdata( $user_id );
do_action( 'xmlrpc_call', 'wp.getUsers' );
if ( ! current_user_can( 'list_users' ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot list users.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to browse users.' ) );
$query = array( 'fields' => 'all_with_meta' );
do_action( 'xmlrpc_call', 'wp.getProfile' );
if ( ! current_user_can( 'edit_user', $user->ID ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit your profile.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) );
$user_data = get_userdata( $user->ID );
do_action( 'xmlrpc_call', 'wp.editProfile' );
if ( ! current_user_can( 'edit_user', $user->ID ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit your profile.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) );
// holds data of the user
$user_data = array();
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( !current_user_can( 'edit_page', $page_id ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit this page.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getPage' );
return $this->error;
if ( !current_user_can( 'edit_pages' ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit pages.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getPages' );
// Make sure the user can delete pages.
if ( !current_user_can('delete_page', $page_id) )
- return new IXR_Error( 401, __( 'Sorry, you do not have the right to delete this page.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this page.' ) );
// Attempt to delete the page.
$result = wp_delete_post($page_id);
// Make sure the user is allowed to edit pages.
if ( !current_user_can('edit_page', $page_id) )
- return new IXR_Error( 401, __( 'Sorry, you do not have the right to edit this page.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) );
// Mark this as content for a page.
$content['post_type'] = 'page';
*
* @since 2.2.0
*
- * @global wpdb $wpdb
+ * @global wpdb $wpdb WordPress database abstraction object.
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
return $this->error;
if ( !current_user_can( 'edit_pages' ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit pages.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getPageList' );
return $this->error;
if ( !current_user_can('edit_posts') )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit posts on this site.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getAuthors' );
$tags = array();
if ( $all_tags = get_tags() ) {
- foreach( (array) $all_tags as $tag ) {
+ foreach ( (array) $all_tags as $tag ) {
$struct = array();
$struct['tag_id'] = $tag->term_id;
$struct['name'] = $tag->name;
// Make sure the user is allowed to add a category.
if ( !current_user_can('manage_categories') )
- return new IXR_Error(401, __('Sorry, you do not have the right to add a category.'));
+ return new IXR_Error(401, __('Sorry, you are not allowed to add a category.'));
// If no slug was provided make it empty so that
// WordPress will generate one.
* @type string $password
* @type int $category_id
* }
- * @return bool|IXR_Error See {@link wp_delete_term()} for return info.
+ * @return bool|IXR_Error See wp_delete_term() for return info.
*/
public function wp_deleteCategory( $args ) {
$this->escape( $args );
do_action( 'xmlrpc_call', 'wp.deleteCategory' );
if ( !current_user_can('manage_categories') )
- return new IXR_Error( 401, __( 'Sorry, you do not have the right to delete a category.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete a category.' ) );
$status = wp_delete_term( $category_id, 'category' );
$password = $args[2];
$comment_id = (int) $args[3];
- if ( !$user = $this->login($username, $password) )
+ if ( ! $user = $this->login( $username, $password ) ) {
return $this->error;
-
- if ( !current_user_can( 'moderate_comments' ) )
- return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) );
+ }
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getComment' );
- if ( ! $comment = get_comment($comment_id) )
+ if ( ! $comment = get_comment( $comment_id ) ) {
return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
+ }
+
+ if ( ! current_user_can( 'edit_comment', $comment_id ) ) {
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
+ }
return $this->_prepare_comment( $comment );
}
* - 'status' - Default is ''. Filter by status (e.g., 'approve', 'hold')
* - 'post_id' - Default is ''. The post where the comment is posted. Empty string shows all comments.
* - 'number' - Default is 10. Total number of media items to retrieve.
- * - 'offset' - Default is 0. See {@link WP_Query::query()} for more.
+ * - 'offset' - Default is 0. See WP_Query::query() for more.
*
* @since 2.7.0
*
* @type string $password
* @type array $struct
* }
- * @return array|IXR_Error Contains a collection of comments. See {@link wp_xmlrpc_server::wp_getComment()} for a description of each item contents
+ * @return array|IXR_Error Contains a collection of comments. See wp_xmlrpc_server::wp_getComment() for a description of each item contents
*/
public function wp_getComments( $args ) {
$this->escape( $args );
$password = $args[2];
$struct = isset( $args[3] ) ? $args[3] : array();
- if ( !$user = $this->login($username, $password) )
+ if ( ! $user = $this->login( $username, $password ) ) {
return $this->error;
-
- if ( !current_user_can( 'moderate_comments' ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit comments.' ) );
+ }
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getComments' );
- if ( isset($struct['status']) )
+ if ( isset( $struct['status'] ) ) {
$status = $struct['status'];
- else
+ } else {
$status = '';
+ }
+
+ if ( ! current_user_can( 'moderate_comments' ) && 'approve' !== $status ) {
+ return new IXR_Error( 401, __( 'Invalid comment status.' ) );
+ }
$post_id = '';
- if ( isset($struct['post_id']) )
- $post_id = absint($struct['post_id']);
+ if ( isset( $struct['post_id'] ) ) {
+ $post_id = absint( $struct['post_id'] );
+ }
+
+ $post_type = '';
+ if ( isset( $struct['post_type'] ) ) {
+ $post_type_object = get_post_type_object( $struct['post_type'] );
+ if ( ! $post_type_object || ! post_type_supports( $post_type_object->name, 'comments' ) ) {
+ return new IXR_Error( 404, __( 'Invalid post type.' ) );
+ }
+ $post_type = $struct['post_type'];
+ }
$offset = 0;
- if ( isset($struct['offset']) )
- $offset = absint($struct['offset']);
+ if ( isset( $struct['offset'] ) ) {
+ $offset = absint( $struct['offset'] );
+ }
$number = 10;
- if ( isset($struct['number']) )
- $number = absint($struct['number']);
+ if ( isset( $struct['number'] ) ) {
+ $number = absint( $struct['number'] );
+ }
- $comments = get_comments( array( 'status' => $status, 'post_id' => $post_id, 'offset' => $offset, 'number' => $number ) );
+ $comments = get_comments( array(
+ 'status' => $status,
+ 'post_id' => $post_id,
+ 'offset' => $offset,
+ 'number' => $number,
+ 'post_type' => $post_type,
+ ) );
$comments_struct = array();
if ( is_array( $comments ) ) {
* Delete a comment.
*
* By default, the comment will be moved to the trash instead of deleted.
- * See {@link wp_delete_comment()} for more information on
- * this behavior.
+ * See wp_delete_comment() for more information on this behavior.
*
* @since 2.7.0
*
* @type string $password
* @type int $comment_ID
* }
- * @return bool|IXR_Error {@link wp_delete_comment()}
+ * @return bool|IXR_Error See wp_delete_comment().
*/
- public function wp_deleteComment($args) {
+ public function wp_deleteComment( $args ) {
$this->escape($args);
$username = $args[1];
$password = $args[2];
$comment_ID = (int) $args[3];
- if ( !$user = $this->login($username, $password) )
+ if ( ! $user = $this->login( $username, $password ) ) {
return $this->error;
+ }
- if ( !current_user_can( 'moderate_comments' ) )
- return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) );
-
- if ( ! get_comment($comment_ID) )
+ if ( ! get_comment( $comment_ID ) ) {
return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
+ }
- if ( !current_user_can( 'edit_comment', $comment_ID ) )
- return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) );
+ if ( !current_user_can( 'edit_comment', $comment_ID ) ) {
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
+ }
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.deleteComment' );
$comment_ID = (int) $args[3];
$content_struct = $args[4];
- if ( !$user = $this->login($username, $password) )
+ if ( !$user = $this->login( $username, $password ) ) {
return $this->error;
+ }
- if ( !current_user_can( 'moderate_comments' ) )
- return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) );
-
- if ( ! get_comment($comment_ID) )
+ if ( ! get_comment( $comment_ID ) ) {
return new IXR_Error( 404, __( 'Invalid comment ID.' ) );
+ }
- if ( !current_user_can( 'edit_comment', $comment_ID ) )
- return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) );
+ if ( ! current_user_can( 'edit_comment', $comment_ID ) ) {
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
+ }
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.editComment' );
* @type string|int $post
* @type array $content_struct
* }
- * @return int|IXR_Error {@link wp_new_comment()}
+ * @return int|IXR_Error See wp_new_comment().
*/
public function wp_newComment($args) {
$this->escape($args);
$content_struct = $args[4];
/**
- * Filter whether to allow anonymous comments over XML-RPC.
+ * Filters whether to allow anonymous comments over XML-RPC.
*
* @since 2.7.0
*
else
$post_id = url_to_postid($post);
- if ( ! $post_id )
+ if ( ! $post_id ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
+ }
- if ( ! get_post($post_id) )
+ if ( ! get_post( $post_id ) ) {
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
+ }
+
+ if ( ! comments_open( $post_id ) ) {
+ return new IXR_Error( 403, __( 'Sorry, comments are closed for this item.' ) );
+ }
$comment = array();
$comment['comment_post_ID'] = $post_id;
if ( $logged_in ) {
- $comment['comment_author'] = $this->escape( $user->display_name );
- $comment['comment_author_email'] = $this->escape( $user->user_email );
- $comment['comment_author_url'] = $this->escape( $user->user_url );
+ $display_name = $user->display_name;
+ $user_email = $user->user_email;
+ $user_url = $user->user_url;
+
+ $comment['comment_author'] = $this->escape( $display_name );
+ $comment['comment_author_email'] = $this->escape( $user_email );
+ $comment['comment_author_url'] = $this->escape( $user_url );
$comment['user_ID'] = $user->ID;
} else {
$comment['comment_author'] = '';
* }
* @return array|IXR_Error
*/
- public function wp_getCommentStatusList($args) {
+ public function wp_getCommentStatusList( $args ) {
$this->escape( $args );
$username = $args[1];
$password = $args[2];
- if ( !$user = $this->login($username, $password) )
+ if ( ! $user = $this->login( $username, $password ) ) {
return $this->error;
+ }
- if ( !current_user_can( 'moderate_comments' ) )
- return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );
+ if ( ! current_user_can( 'publish_posts' ) ) {
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) );
+ }
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getCommentStatusList' );
$password = $args[2];
$post_id = (int) $args[3];
- if ( !$user = $this->login($username, $password) )
+ if ( ! $user = $this->login( $username, $password ) ) {
return $this->error;
+ }
- if ( !current_user_can( 'edit_posts' ) )
- return new IXR_Error( 403, __( 'You are not allowed access to details about comments.' ) );
+ $post = get_post( $post_id, ARRAY_A );
+ if ( empty( $post['ID'] ) ) {
+ return new IXR_Error( 404, __( 'Invalid post ID.' ) );
+ }
+
+ if ( ! current_user_can( 'edit_post', $post_id ) ) {
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details of this post.' ) );
+ }
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getCommentCount' );
$count = wp_count_comments( $post_id );
+
return array(
'approved' => $count->approved,
'awaiting_moderation' => $count->moderated,
return $this->error;
if ( !current_user_can( 'edit_posts' ) )
- return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getPostStatusList' );
return $this->error;
if ( !current_user_can( 'edit_pages' ) )
- return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getPageStatusList' );
return $this->error;
if ( !current_user_can( 'edit_pages' ) )
- return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) );
$templates = get_page_templates();
$templates['Default'] = 'default';
return $this->error;
if ( !current_user_can( 'manage_options' ) )
- return new IXR_Error( 403, __( 'You are not allowed to update options.' ) );
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed to update options.' ) );
$option_names = array();
foreach ( $options as $o_name => $o_value ) {
return $this->error;
if ( !current_user_can( 'upload_files' ) )
- return new IXR_Error( 403, __( 'You do not have permission to upload files.' ) );
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed to upload files.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getMediaItem' );
return $this->error;
if ( !current_user_can( 'upload_files' ) )
- return new IXR_Error( 401, __( 'You do not have permission to upload files.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getMediaLibrary' );
return $this->error;
if ( !current_user_can( 'edit_posts' ) )
- return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) );
+ return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'wp.getPostFormats' );
$fields = $args[4];
} else {
/**
- * Filter the default query fields used by the given XML-RPC method.
+ * Filters the default query fields used by the given XML-RPC method.
*
* @since 3.4.0
*
do_action( 'xmlrpc_call', 'wp.getPostType' );
if ( ! post_type_exists( $post_type_name ) )
- return new IXR_Error( 403, __( 'Invalid post type' ) );
+ return new IXR_Error( 403, __( 'Invalid post type.' ) );
$post_type = get_post_type_object( $post_type_name );
$struct = array();
- foreach( $post_types as $post_type ) {
+ foreach ( $post_types as $post_type ) {
if ( ! current_user_can( $post_type->cap->edit_posts ) )
continue;
$fields = $args[4];
} else {
/**
- * Filter the default revision query fields used by the given XML-RPC method.
+ * Filters the default revision query fields used by the given XML-RPC method.
*
* @since 3.5.0
*
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( ! current_user_can( 'edit_post', $revision->post_parent ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
// Check if revisions are disabled.
if ( ! wp_revisions_enabled( $post ) )
}
/* Blogger API functions.
- * specs on http://plant.blogger.com/api and http://groups.yahoo.com/group/bloggerDev/
+ * specs on http://plant.blogger.com/api and https://groups.yahoo.com/group/bloggerDev/
*/
/**
/**
* Private function for retrieving a users blogs for multisite setups
*
+ * @since 3.0.0
* @access protected
*
+ * @param array $args {
+ * Method arguments. Note: arguments must be ordered as documented.
+ *
+ * @type string $username Username.
+ * @type string $password Password.
+ * }
* @return array|IXR_Error
*/
- protected function _multisite_getUsersBlogs($args) {
+ protected function _multisite_getUsersBlogs( $args ) {
$current_blog = get_blog_details();
$domain = $current_blog->domain;
return $this->error;
if ( !current_user_can( 'edit_posts' ) )
- return new IXR_Error( 401, __( 'Sorry, you do not have access to user data on this site.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to access user data on this site.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'blogger.getUserInfo' );
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( !current_user_can( 'edit_post', $post_ID ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'blogger.getPost' );
return $this->error;
if ( ! current_user_can( 'edit_posts' ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit posts on this site.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'blogger.getRecentPosts' );
*
* @since 1.5.0
* @deprecated 3.5.0
- * @return IXR_Error
+ *
+ * @param array $args Unused.
+ * @return IXR_Error Error object.
*/
public function blogger_getTemplate($args) {
return new IXR_Error( 403, __('Sorry, that file cannot be edited.' ) );
*
* @since 1.5.0
* @deprecated 3.5.0
- * @return IXR_Error
+ *
+ * @param array $args Unused.
+ * @return IXR_Error Error object.
*/
public function blogger_setTemplate($args) {
return new IXR_Error( 403, __('Sorry, that file cannot be edited.' ) );
}
/**
- * Create new post.
+ * Creates new post.
*
* @since 1.5.0
*
- * @param array $args {
+ * @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
*
* @type string $appkey (unused)
* @type string $username
* @type string $password
* @type string $content
+ * @type bool $publish
* }
* @return true|IXR_Error true when done.
*/
$username = $args[2];
$password = $args[3];
$content = $args[4];
+ $publish = $args[5];
if ( ! $user = $this->login( $username, $password ) ) {
return $this->error;
$this->escape($actual_post);
if ( ! current_user_can( 'edit_post', $post_ID ) ) {
- return new IXR_Error(401, __('Sorry, you do not have the right to edit this post.'));
+ return new IXR_Error(401, __('Sorry, you are not allowed to edit this post.'));
}
if ( 'publish' == $actual_post['post_status'] && ! current_user_can( 'publish_posts' ) ) {
- return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) );
}
$postdata = array();
$postdata['post_category'] = xmlrpc_getpostcategory( $content );
$postdata['post_status'] = $actual_post['post_status'];
$postdata['post_excerpt'] = $actual_post['post_excerpt'];
+ $postdata['post_status'] = $publish ? 'publish' : 'draft';
$result = wp_update_post( $postdata );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'blogger.deletePost' );
- $actual_post = get_post($post_ID,ARRAY_A);
+ $actual_post = get_post( $post_ID, ARRAY_A );
- if ( !$actual_post || $actual_post['post_type'] != 'post' )
- return new IXR_Error(404, __('Sorry, no such post.'));
+ if ( ! $actual_post || $actual_post['post_type'] != 'post' ) {
+ return new IXR_Error( 404, __( 'Sorry, no such post.' ) );
+ }
- if ( !current_user_can('delete_post', $post_ID) )
- return new IXR_Error(401, __('Sorry, you do not have the right to delete this post.'));
+ if ( ! current_user_can( 'delete_post', $post_ID ) ) {
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) );
+ }
- $result = wp_delete_post($post_ID);
+ $result = wp_delete_post( $post_ID );
- if ( !$result )
- return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be deleted.'));
+ if ( ! $result ) {
+ return new IXR_Error( 500, __( 'The post cannot be deleted.' ) );
+ }
/**
* Fires after a post has been successfully deleted via the XML-RPC Blogger API.
$post_type = 'post';
} else {
// No other post_type values are allowed here
- return new IXR_Error( 401, __( 'Invalid post type' ) );
+ return new IXR_Error( 401, __( 'Invalid post type.' ) );
}
} else {
if ( $publish )
switch ( $post_type ) {
case "post":
if ( !current_user_can( 'edit_others_posts' ) )
- return new IXR_Error( 401, __( 'You are not allowed to create posts as this user.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) );
break;
case "page":
if ( !current_user_can( 'edit_others_pages' ) )
- return new IXR_Error( 401, __( 'You are not allowed to create pages as this user.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to create pages as this user.' ) );
break;
default:
- return new IXR_Error( 401, __( 'Invalid post type' ) );
+ return new IXR_Error( 401, __( 'Invalid post type.' ) );
}
$author = get_userdata( $content_struct['wp_author_id'] );
if ( ! $author )
$post_date = get_date_from_gmt(iso8601_to_datetime($dateCreated));
$post_date_gmt = iso8601_to_datetime($dateCreated, 'GMT');
} else {
- $post_date = current_time('mysql');
- $post_date_gmt = current_time('mysql', 1);
+ $post_date = '';
+ $post_date_gmt = '';
}
$post_category = array();
}
/**
- * @param integer $post_ID
- * @param array $enclosure
+ * Adds an enclosure to a post if it's new.
+ *
+ * @since 2.8.0
+ *
+ * @param integer $post_ID Post ID.
+ * @param array $enclosure Enclosure data.
*/
public function add_enclosure_if_new( $post_ID, $enclosure ) {
if ( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) {
*
* @since 2.1.0
*
- * @global wpdb $wpdb
+ * @global wpdb $wpdb WordPress database abstraction object.
*
* @param int $post_ID Post ID.
* @param string $post_content Post Content for attachment.
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( ! current_user_can( 'edit_post', $post_ID ) )
- return new IXR_Error( 401, __( 'Sorry, you do not have the right to edit this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
// Use wp.editPost to edit post types other than post and page.
if ( ! in_array( $postdata[ 'post_type' ], array( 'post', 'page' ) ) )
- return new IXR_Error( 401, __( 'Invalid post type' ) );
+ return new IXR_Error( 401, __( 'Invalid post type.' ) );
// Thwart attempt to change the post type.
if ( ! empty( $content_struct[ 'post_type' ] ) && ( $content_struct['post_type'] != $postdata[ 'post_type' ] ) )
switch ( $post_type ) {
case 'post':
if ( ! current_user_can( 'edit_others_posts' ) ) {
- return new IXR_Error( 401, __( 'You are not allowed to change the post author as this user.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the post author as this user.' ) );
}
break;
case 'page':
if ( ! current_user_can( 'edit_others_pages' ) ) {
- return new IXR_Error( 401, __( 'You are not allowed to change the page author as this user.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the page author as this user.' ) );
}
break;
default:
- return new IXR_Error( 401, __( 'Invalid post type' ) );
- break;
+ return new IXR_Error( 401, __( 'Invalid post type.' ) );
}
$post_author = $content_struct['wp_author_id'];
}
if ( 'publish' == $post_status || 'private' == $post_status ) {
if ( 'page' == $post_type && ! current_user_can( 'publish_pages' ) ) {
- return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this page.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this page.' ) );
} elseif ( ! current_user_can( 'publish_posts' ) ) {
- return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) );
}
}
elseif ( !empty( $content_struct['dateCreated']) )
$dateCreated = $content_struct['dateCreated']->getIso();
+ // Default to not flagging the post date to be edited unless it's intentional.
+ $edit_date = false;
+
if ( !empty( $dateCreated ) ) {
$post_date = get_date_from_gmt(iso8601_to_datetime($dateCreated));
$post_date_gmt = iso8601_to_datetime($dateCreated, 'GMT');
+
+ // Flag the post date to be edited.
+ $edit_date = true;
} else {
$post_date = $postdata['post_date'];
$post_date_gmt = $postdata['post_date_gmt'];
}
// We've got all the data -- post it.
- $newpost = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template');
+ $newpost = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'edit_date', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template');
$result = wp_update_post($newpost, true);
if ( is_wp_error( $result ) )
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( !current_user_can( 'edit_post', $post_ID ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'metaWeblog.getPost' );
$categories = array();
$catids = wp_get_post_categories($post_ID);
- foreach($catids as $catid)
+ foreach ($catids as $catid)
$categories[] = get_cat_name($catid);
$tagnames = array();
}
$post = get_extended($postdata['post_content']);
- $link = post_permalink($postdata['ID']);
+ $link = get_permalink($postdata['ID']);
// Get the author info.
$author = get_userdata($postdata['post_author']);
return $this->error;
if ( ! current_user_can( 'edit_posts' ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit posts on this site.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'metaWeblog.getRecentPosts' );
$categories = array();
$catids = wp_get_post_categories($entry['ID']);
- foreach( $catids as $catid )
+ foreach ( $catids as $catid )
$categories[] = get_cat_name($catid);
$tagnames = array();
}
$post = get_extended($entry['post_content']);
- $link = post_permalink($entry['ID']);
+ $link = get_permalink($entry['ID']);
// Get the post author info.
$author = get_userdata($entry['post_author']);
*
* @since 1.5.0
*
- * @global wpdb $wpdb
+ * @global wpdb $wpdb WordPress database abstraction object.
*
* @param array $args {
* Method arguments. Note: arguments must be ordered as documented.
do_action( 'xmlrpc_call', 'metaWeblog.newMediaObject' );
if ( !current_user_can('upload_files') ) {
- $this->error = new IXR_Error( 401, __( 'You do not have permission to upload files.' ) );
+ $this->error = new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) );
+ return $this->error;
+ }
+
+ if ( is_multisite() && upload_is_user_over_quota( false ) ) {
+ $this->error = new IXR_Error( 401, __( 'Sorry, you have used your space allocation.' ) );
return $this->error;
}
/**
- * Filter whether to preempt the XML-RPC media upload.
+ * Filters whether to preempt the XML-RPC media upload.
*
* Passing a truthy value will effectively short-circuit the media upload,
* returning that value as a 500 error instead.
return new IXR_Error( 500, $upload_err );
}
- if ( !empty($data['overwrite']) && ($data['overwrite'] == true) ) {
- // Get postmeta info on the object.
- $old_file = $wpdb->get_row("
- SELECT ID
- FROM {$wpdb->posts}
- WHERE post_title = '{$name}'
- AND post_type = 'attachment'
- ");
-
- // Delete previous file.
- wp_delete_attachment($old_file->ID);
-
- // Make sure the new name is different by pre-pending the
- // previous post id.
- $filename = preg_replace('/^wpid\d+-/', '', $name);
- $name = "wpid{$old_file->ID}-{$filename}";
- }
-
$upload = wp_upload_bits($name, null, $bits);
if ( ! empty($upload['error']) ) {
$errorString = sprintf(__('Could not write file %1$s (%2$s)'), $name, $upload['error']);
$post_id = (int) $data['post_id'];
if ( ! current_user_can( 'edit_post', $post_id ) )
- return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
}
$attachment = array(
'post_title' => $name,
*/
do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args );
- $struct = array(
- 'id' => strval( $id ),
- 'file' => $name,
- 'url' => $upload[ 'url' ],
- 'type' => $type
- );
+ $struct = $this->_prepare_media_item( get_post( $id ) );
+
+ // Deprecated values
+ $struct['id'] = $struct['attachment_id'];
+ $struct['file'] = $struct['title'];
+ $struct['url'] = $struct['link'];
- /** This filter is documented in wp-admin/includes/file.php */
- return apply_filters( 'wp_handle_upload', $struct, 'upload' );
+ return $struct;
}
/* MovableType API functions
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( !current_user_can( 'edit_post', $post_ID ) )
- return new IXR_Error( 401, __( 'Sorry, you can not edit this post.' ) );
+ return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) );
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action( 'xmlrpc_call', 'mt.getPostCategories' );
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( !current_user_can('edit_post', $post_ID) )
- return new IXR_Error(401, __('Sorry, you cannot edit this post.'));
+ return new IXR_Error(401, __('Sorry, you are not allowed to edit this post.'));
$catids = array();
foreach ( $categories as $cat ) {
do_action( 'xmlrpc_call', 'mt.supportedTextFilters' );
/**
- * Filter the MoveableType text filters list for XML-RPC.
+ * Filters the MoveableType text filters list for XML-RPC.
*
* @since 2.2.0
*
*
* @since 1.5.0
*
- * @global wpdb $wpdb
+ * @global wpdb $wpdb WordPress database abstraction object.
*
* @param int $post_ID
* @return array|IXR_Error
return new IXR_Error( 404, __( 'Invalid post ID.' ) );
if ( !current_user_can('publish_posts') || !current_user_can('edit_post', $post_ID) )
- return new IXR_Error(401, __('Sorry, you cannot publish this post.'));
+ return new IXR_Error(401, __('Sorry, you are not allowed to publish this post.'));
$postdata['post_status'] = 'publish';
*
* @since 1.5.0
*
- * @global wpdb $wpdb
+ * @global wpdb $wpdb WordPress database abstraction object.
* @global string $wp_version
*
* @param array $args {
$pagelinkedto = str_replace( '&', '&', $pagelinkedto );
/**
- * Filter the pingback source URI.
+ * Filters the pingback source URI.
*
* @since 3.6.0
*
'X-Pingback-Forwarded-For' => $remote_ip,
),
);
+
$request = wp_safe_remote_get( $pagelinkedfrom, $http_api_args );
- $linea = wp_remote_retrieve_body( $request );
+ $remote_source = $remote_source_original = wp_remote_retrieve_body( $request );
- if ( !$linea )
+ if ( ! $remote_source ) {
return $this->pingback_error( 16, __( 'The source URL does not exist.' ) );
+ }
/**
- * Filter the pingback remote source.
+ * Filters the pingback remote source.
*
* @since 2.5.0
*
- * @param string $linea Response object for the page linked from.
- * @param string $pagelinkedto URL of the page linked to.
+ * @param string $remote_source Response source for the page linked from.
+ * @param string $pagelinkedto URL of the page linked to.
*/
- $linea = apply_filters( 'pre_remote_source', $linea, $pagelinkedto );
+ $remote_source = apply_filters( 'pre_remote_source', $remote_source, $pagelinkedto );
// Work around bug in strip_tags():
- $linea = str_replace('<!DOC', '<DOC', $linea);
- $linea = preg_replace( '/[\r\n\t ]+/', ' ', $linea ); // normalize spaces
- $linea = preg_replace( "/<\/*(h1|h2|h3|h4|h5|h6|p|th|td|li|dt|dd|pre|caption|input|textarea|button|body)[^>]*>/", "\n\n", $linea );
+ $remote_source = str_replace( '<!DOC', '<DOC', $remote_source );
+ $remote_source = preg_replace( '/[\r\n\t ]+/', ' ', $remote_source ); // normalize spaces
+ $remote_source = preg_replace( "/<\/*(h1|h2|h3|h4|h5|h6|p|th|td|li|dt|dd|pre|caption|input|textarea|button|body)[^>]*>/", "\n\n", $remote_source );
- preg_match('|<title>([^<]*?)</title>|is', $linea, $matchtitle);
+ preg_match( '|<title>([^<]*?)</title>|is', $remote_source, $matchtitle );
$title = $matchtitle[1];
if ( empty( $title ) )
return $this->pingback_error( 32, __('We cannot find a title on that page.' ) );
- $linea = strip_tags( $linea, '<a>' ); // just keep the tag we need
+ $remote_source = strip_tags( $remote_source, '<a>' ); // just keep the tag we need
- $p = explode( "\n\n", $linea );
+ $p = explode( "\n\n", $remote_source );
$preg_target = preg_quote($pagelinkedto, '|');
$this->escape($comment_content);
$comment_type = 'pingback';
- $commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', 'comment_content', 'comment_type');
+ $commentdata = compact(
+ 'comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email',
+ 'comment_content', 'comment_type', 'remote_source', 'remote_source_original'
+ );
$comment_ID = wp_new_comment($commentdata);
*
* @since 1.5.0
*
- * @global wpdb $wpdb
+ * @global wpdb $wpdb WordPress database abstraction object.
*
* @param string $url
* @return array|IXR_Error
}
/**
- * @param integer $code
- * @param string $message
- * @return IXR_Error
+ * Sends a pingback error based on the given error code and message.
+ *
+ * @since 3.6.0
+ *
+ * @param int $code Error code.
+ * @param string $message Error message.
+ * @return IXR_Error Error object.
*/
protected function pingback_error( $code, $message ) {
/**
- * Filter the XML-RPC pingback error return.
+ * Filters the XML-RPC pingback error return.
*
* @since 3.5.1
*