2010-09-23 23:22:21 +02:00
< ? php
/**
* XML - RPC protocol support for WordPress
*
* @ package WordPress
2014-02-25 18:14:14 +01:00
* @ subpackage Publishing
2010-09-23 23:22:21 +02:00
*/
/**
* WordPress XMLRPC server implementation .
*
2011-09-03 18:02:41 +02:00
* Implements compatibility for Blogger API , MetaWeblog API , MovableType , and
2010-09-23 23:22:21 +02:00
* pingback . Additional WordPress API for managing comments , pages , posts ,
* options , etc .
*
2013-07-17 22:19:06 +02:00
* As of WordPress 3.5 . 0 , XML - RPC is enabled by default . It can be disabled
2016-05-23 20:54:27 +02:00
* via the { @ see 'xmlrpc_enabled' } filter found in wp_xmlrpc_server :: login () .
2010-09-23 23:22:21 +02:00
*
* @ since 1.5 . 0
2017-07-01 18:58:42 +02:00
*
* @ see IXR_Server
2010-09-23 23:22:21 +02:00
*/
class wp_xmlrpc_server extends IXR_Server {
2014-11-03 04:04:22 +01:00
/**
2015-05-23 21:23:25 +02:00
* Methods .
*
2014-11-03 04:04:22 +01:00
* @ var array
*/
public $methods ;
2015-05-23 21:23:25 +02:00
2014-11-03 04:04:22 +01:00
/**
2015-05-23 21:23:25 +02:00
* Blog options .
*
2014-11-03 04:04:22 +01:00
* @ var array
*/
public $blog_options ;
2015-05-23 21:23:25 +02:00
2014-11-03 04:04:22 +01:00
/**
2015-05-23 21:23:25 +02:00
* IXR_Error instance .
*
2014-11-03 04:04:22 +01:00
* @ var IXR_Error
*/
public $error ;
2015-05-23 21:23:25 +02:00
2015-10-23 06:46:24 +02:00
/**
* Flags that the user authentication has failed in this instance of wp_xmlrpc_server .
*
* @ var bool
*/
protected $auth_failed = false ;
2010-09-23 23:22:21 +02:00
/**
2016-05-23 20:54:27 +02:00
* Registers all of the XMLRPC methods that XMLRPC server understands .
2010-09-23 23:22:21 +02:00
*
2011-04-29 22:05:12 +02:00
* Sets up server and method property . Passes XMLRPC
2016-05-23 20:54:27 +02:00
* methods through the { @ see 'xmlrpc_methods' } filter to allow plugins to extend
* or replace XML - RPC methods .
2010-09-23 23:22:21 +02:00
*
* @ since 1.5 . 0
*/
2014-05-19 08:09:13 +02:00
public function __construct () {
2010-09-23 23:22:21 +02:00
$this -> methods = array (
2020-01-29 01:45:18 +01:00
// WordPress API.
2017-12-01 00:11:00 +01:00
'wp.getUsersBlogs' => 'this:wp_getUsersBlogs' ,
'wp.newPost' => 'this:wp_newPost' ,
'wp.editPost' => 'this:wp_editPost' ,
'wp.deletePost' => 'this:wp_deletePost' ,
'wp.getPost' => 'this:wp_getPost' ,
'wp.getPosts' => 'this:wp_getPosts' ,
'wp.newTerm' => 'this:wp_newTerm' ,
'wp.editTerm' => 'this:wp_editTerm' ,
'wp.deleteTerm' => 'this:wp_deleteTerm' ,
'wp.getTerm' => 'this:wp_getTerm' ,
'wp.getTerms' => 'this:wp_getTerms' ,
'wp.getTaxonomy' => 'this:wp_getTaxonomy' ,
'wp.getTaxonomies' => 'this:wp_getTaxonomies' ,
'wp.getUser' => 'this:wp_getUser' ,
'wp.getUsers' => 'this:wp_getUsers' ,
'wp.getProfile' => 'this:wp_getProfile' ,
'wp.editProfile' => 'this:wp_editProfile' ,
'wp.getPage' => 'this:wp_getPage' ,
'wp.getPages' => 'this:wp_getPages' ,
'wp.newPage' => 'this:wp_newPage' ,
'wp.deletePage' => 'this:wp_deletePage' ,
'wp.editPage' => 'this:wp_editPage' ,
'wp.getPageList' => 'this:wp_getPageList' ,
'wp.getAuthors' => 'this:wp_getAuthors' ,
2020-01-29 01:45:18 +01:00
'wp.getCategories' => 'this:mw_getCategories' , // Alias.
2017-12-01 00:11:00 +01:00
'wp.getTags' => 'this:wp_getTags' ,
'wp.newCategory' => 'this:wp_newCategory' ,
'wp.deleteCategory' => 'this:wp_deleteCategory' ,
'wp.suggestCategories' => 'this:wp_suggestCategories' ,
2020-01-29 01:45:18 +01:00
'wp.uploadFile' => 'this:mw_newMediaObject' , // Alias.
'wp.deleteFile' => 'this:wp_deletePost' , // Alias.
2017-12-01 00:11:00 +01:00
'wp.getCommentCount' => 'this:wp_getCommentCount' ,
'wp.getPostStatusList' => 'this:wp_getPostStatusList' ,
'wp.getPageStatusList' => 'this:wp_getPageStatusList' ,
'wp.getPageTemplates' => 'this:wp_getPageTemplates' ,
'wp.getOptions' => 'this:wp_getOptions' ,
'wp.setOptions' => 'this:wp_setOptions' ,
'wp.getComment' => 'this:wp_getComment' ,
'wp.getComments' => 'this:wp_getComments' ,
'wp.deleteComment' => 'this:wp_deleteComment' ,
'wp.editComment' => 'this:wp_editComment' ,
'wp.newComment' => 'this:wp_newComment' ,
'wp.getCommentStatusList' => 'this:wp_getCommentStatusList' ,
'wp.getMediaItem' => 'this:wp_getMediaItem' ,
'wp.getMediaLibrary' => 'this:wp_getMediaLibrary' ,
'wp.getPostFormats' => 'this:wp_getPostFormats' ,
'wp.getPostType' => 'this:wp_getPostType' ,
'wp.getPostTypes' => 'this:wp_getPostTypes' ,
'wp.getRevisions' => 'this:wp_getRevisions' ,
'wp.restoreRevision' => 'this:wp_restoreRevision' ,
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Blogger API.
2017-12-01 00:11:00 +01:00
'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs' ,
'blogger.getUserInfo' => 'this:blogger_getUserInfo' ,
'blogger.getPost' => 'this:blogger_getPost' ,
'blogger.getRecentPosts' => 'this:blogger_getRecentPosts' ,
'blogger.newPost' => 'this:blogger_newPost' ,
'blogger.editPost' => 'this:blogger_editPost' ,
'blogger.deletePost' => 'this:blogger_deletePost' ,
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// MetaWeblog API (with MT extensions to structs).
2017-12-01 00:11:00 +01:00
'metaWeblog.newPost' => 'this:mw_newPost' ,
'metaWeblog.editPost' => 'this:mw_editPost' ,
'metaWeblog.getPost' => 'this:mw_getPost' ,
'metaWeblog.getRecentPosts' => 'this:mw_getRecentPosts' ,
'metaWeblog.getCategories' => 'this:mw_getCategories' ,
'metaWeblog.newMediaObject' => 'this:mw_newMediaObject' ,
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// MetaWeblog API aliases for Blogger API.
// See http://www.xmlrpc.com/stories/storyReader$2460
2017-12-01 00:11:00 +01:00
'metaWeblog.deletePost' => 'this:blogger_deletePost' ,
'metaWeblog.getUsersBlogs' => 'this:blogger_getUsersBlogs' ,
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// MovableType API.
2017-12-01 00:11:00 +01:00
'mt.getCategoryList' => 'this:mt_getCategoryList' ,
'mt.getRecentPostTitles' => 'this:mt_getRecentPostTitles' ,
'mt.getPostCategories' => 'this:mt_getPostCategories' ,
'mt.setPostCategories' => 'this:mt_setPostCategories' ,
'mt.supportedMethods' => 'this:mt_supportedMethods' ,
'mt.supportedTextFilters' => 'this:mt_supportedTextFilters' ,
'mt.getTrackbackPings' => 'this:mt_getTrackbackPings' ,
'mt.publishPost' => 'this:mt_publishPost' ,
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Pingback.
2017-12-01 00:11:00 +01:00
'pingback.ping' => 'this:pingback_ping' ,
2010-09-23 23:22:21 +02:00
'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks' ,
2017-12-01 00:11:00 +01:00
'demo.sayHello' => 'this:sayHello' ,
'demo.addTwoNumbers' => 'this:addTwoNumbers' ,
2010-09-23 23:22:21 +02:00
);
2012-03-02 19:06:30 +01:00
$this -> initialise_blog_option_info ();
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters the methods exposed by the XML - RPC server .
2014-03-26 06:44:16 +01:00
*
* This filter can be used to add new methods , and remove built - in methods .
*
* @ since 1.5 . 0
*
2019-10-26 23:09:04 +02:00
* @ param string [] $methods An array of XML - RPC methods , keyed by their methodName .
2014-03-26 06:44:16 +01:00
*/
$this -> methods = apply_filters ( 'xmlrpc_methods' , $this -> methods );
2010-09-23 23:22:21 +02:00
}
2014-05-19 08:09:13 +02:00
/**
2016-05-13 20:41:31 +02:00
* Make private / protected methods readable for backward compatibility .
2014-05-19 08:09:13 +02:00
*
* @ since 4.0 . 0
2014-07-14 02:46:15 +02:00
*
2017-11-10 23:56:47 +01:00
* @ param string $name Method to call .
2014-07-14 02:46:15 +02:00
* @ param array $arguments Arguments to pass when calling .
2015-05-22 21:37:24 +02:00
* @ return array | IXR_Error | false Return value of the callback , false otherwise .
2014-05-19 08:09:13 +02:00
*/
public function __call ( $name , $arguments ) {
2015-01-11 23:31:22 +01:00
if ( '_multisite_getUsersBlogs' === $name ) {
2019-09-15 13:53:56 +02:00
return $this -> _multisite_getUsersBlogs ( ... $arguments );
2015-01-11 23:31:22 +01:00
}
return false ;
2014-05-19 08:09:13 +02:00
}
2015-05-29 23:37:24 +02:00
/**
2015-12-16 06:43:26 +01:00
* Serves the XML - RPC request .
*
* @ since 2.9 . 0
2015-05-29 23:37:24 +02:00
*/
2014-05-19 08:09:13 +02:00
public function serve_request () {
2017-12-01 00:11:00 +01:00
$this -> IXR_Server ( $this -> methods );
2010-09-23 23:22:21 +02:00
}
/**
* Test XMLRPC API by saying , " Hello! " to client .
*
* @ since 1.5 . 0
*
2015-05-23 21:26:26 +02:00
* @ return string Hello string response .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function sayHello () {
2010-09-23 23:22:21 +02:00
return 'Hello!' ;
}
/**
* Test XMLRPC API by adding two numbers for client .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-23 21:26:26 +02:00
* @ type int $number1 A number to add .
* @ type int $number2 A second number to add .
2015-05-22 21:37:24 +02:00
* }
2015-05-23 21:26:26 +02:00
* @ return int Sum of the two given numbers .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function addTwoNumbers ( $args ) {
2010-09-23 23:22:21 +02:00
$number1 = $args [ 0 ];
$number2 = $args [ 1 ];
return $number1 + $number2 ;
}
/**
* Log user in .
*
2012-09-19 03:27:21 +02:00
* @ since 2.8 . 0
2010-09-23 23:22:21 +02:00
*
* @ param string $username User ' s username .
* @ param string $password User ' s password .
2014-11-03 04:04:22 +01:00
* @ return WP_User | bool WP_User object if authentication passed , false otherwise
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function login ( $username , $password ) {
2014-04-10 23:04:14 +02:00
/*
* Respect old get_option () filters left for back - compat when the 'enable_xmlrpc'
* option was deprecated in 3.5 . 0. Use the 'xmlrpc_enabled' hook instead .
2014-03-26 06:44:16 +01:00
*/
2019-11-09 14:31:01 +01:00
$enabled = apply_filters ( 'pre_option_enable_xmlrpc' , false );
2014-04-10 23:04:14 +02:00
if ( false === $enabled ) {
2019-11-09 14:31:01 +01:00
$enabled = apply_filters ( 'option_enable_xmlrpc' , true );
2014-04-10 23:04:14 +02:00
}
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters whether XML - RPC methods requiring authentication are enabled .
2014-03-26 06:44:16 +01:00
*
2016-03-17 04:53:26 +01:00
* 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 :
*
* 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 .
2014-03-26 06:44:16 +01:00
*
* @ since 3.5 . 0
*
* @ param bool $enabled Whether XML - RPC is enabled . Default true .
*/
2012-09-11 02:37:31 +02:00
$enabled = apply_filters ( 'xmlrpc_enabled' , $enabled );
if ( ! $enabled ) {
$this -> error = new IXR_Error ( 405 , sprintf ( __ ( 'XML-RPC services are disabled on this site.' ) ) );
2010-09-23 23:22:21 +02:00
return false ;
}
2015-10-23 06:46:24 +02:00
if ( $this -> auth_failed ) {
$user = new WP_Error ( 'login_prevented' );
} else {
$user = wp_authenticate ( $username , $password );
}
2010-09-23 23:22:21 +02:00
2015-10-23 06:46:24 +02:00
if ( is_wp_error ( $user ) ) {
2012-09-19 03:36:47 +02:00
$this -> error = new IXR_Error ( 403 , __ ( 'Incorrect username or password.' ) );
2014-03-26 06:44:16 +01:00
2020-01-29 01:45:18 +01:00
// Flag that authentication has failed once on this wp_xmlrpc_server instance.
2015-10-23 06:46:24 +02:00
$this -> auth_failed = true ;
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters the XML - RPC user login error message .
2014-03-26 06:44:16 +01:00
*
* @ since 3.5 . 0
*
2019-09-21 19:41:57 +02:00
* @ param string $error The XML - RPC error message .
* @ param WP_Error $user WP_Error object .
2014-03-26 06:44:16 +01:00
*/
2012-09-19 03:36:47 +02:00
$this -> error = apply_filters ( 'xmlrpc_login_error' , $this -> error , $user );
2010-09-23 23:22:21 +02:00
return false ;
}
wp_set_current_user ( $user -> ID );
return $user ;
}
2012-09-19 03:27:21 +02:00
/**
* Check user ' s credentials . Deprecated .
*
* @ since 1.5 . 0
2015-08-21 00:38:25 +02:00
* @ deprecated 2.8 . 0 Use wp_xmlrpc_server :: login ()
* @ see wp_xmlrpc_server :: login ()
2012-09-19 03:27:21 +02:00
*
* @ param string $username User ' s username .
* @ param string $password User ' s password .
* @ return bool Whether authentication passed .
*/
2014-05-19 08:09:13 +02:00
public function login_pass_ok ( $username , $password ) {
2012-09-19 03:27:21 +02:00
return ( bool ) $this -> login ( $username , $password );
}
2010-09-23 23:22:21 +02:00
/**
2013-07-16 16:38:54 +02:00
* Escape string or array of strings for database .
2010-09-23 23:22:21 +02:00
*
* @ since 1.5 . 2
*
2013-07-16 16:38:54 +02:00
* @ param string | array $data Escape single string or array of strings .
2015-05-24 07:40:25 +02:00
* @ return string | void Returns with string is passed , alters by - reference
2015-05-22 21:37:24 +02:00
* when array is passed .
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function escape ( & $data ) {
2017-12-01 00:11:00 +01:00
if ( ! is_array ( $data ) ) {
2013-07-16 16:38:54 +02:00
return wp_slash ( $data );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2013-07-16 16:38:54 +02:00
foreach ( $data as & $v ) {
2017-12-01 00:11:00 +01:00
if ( is_array ( $v ) ) {
2013-07-18 16:31:25 +02:00
$this -> escape ( $v );
2017-12-01 00:11:00 +01:00
} elseif ( ! is_object ( $v ) ) {
2013-07-16 16:38:54 +02:00
$v = wp_slash ( $v );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
}
}
/**
* Retrieve custom fields for post .
*
* @ since 2.5 . 0
*
* @ param int $post_id Post ID .
* @ return array Custom fields , if exist .
*/
2017-12-01 00:11:00 +01:00
public function get_custom_fields ( $post_id ) {
2010-09-23 23:22:21 +02:00
$post_id = ( int ) $post_id ;
$custom_fields = array ();
2017-12-01 00:11:00 +01:00
foreach ( ( array ) has_meta ( $post_id ) as $meta ) {
2010-09-23 23:22:21 +02:00
// Don't expose protected fields.
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post_meta' , $post_id , $meta [ 'meta_key' ] ) ) {
2010-09-23 23:22:21 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$custom_fields [] = array (
2017-12-01 00:11:00 +01:00
'id' => $meta [ 'meta_id' ],
'key' => $meta [ 'meta_key' ],
'value' => $meta [ 'meta_value' ],
2010-09-23 23:22:21 +02:00
);
}
return $custom_fields ;
}
/**
* Set custom fields for post .
*
* @ since 2.5 . 0
*
* @ param int $post_id Post ID .
* @ param array $fields Custom fields .
*/
2017-12-01 00:11:00 +01:00
public function set_custom_fields ( $post_id , $fields ) {
2010-09-23 23:22:21 +02:00
$post_id = ( int ) $post_id ;
foreach ( ( array ) $fields as $meta ) {
2017-12-01 00:11:00 +01:00
if ( isset ( $meta [ 'id' ] ) ) {
2010-09-23 23:22:21 +02:00
$meta [ 'id' ] = ( int ) $meta [ 'id' ];
2017-12-01 00:11:00 +01:00
$pmeta = get_metadata_by_mid ( 'post' , $meta [ 'id' ] );
2017-05-16 10:46:42 +02:00
if ( ! $pmeta || $pmeta -> post_id != $post_id ) {
continue ;
}
2017-12-01 00:11:00 +01:00
if ( isset ( $meta [ 'key' ] ) ) {
2013-03-03 17:30:38 +01:00
$meta [ 'key' ] = wp_unslash ( $meta [ 'key' ] );
2017-12-01 00:11:00 +01:00
if ( $meta [ 'key' ] !== $pmeta -> meta_key ) {
2011-07-21 00:04:35 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2013-03-03 17:30:38 +01:00
$meta [ 'value' ] = wp_unslash ( $meta [ 'value' ] );
2017-12-01 00:11:00 +01:00
if ( current_user_can ( 'edit_post_meta' , $post_id , $meta [ 'key' ] ) ) {
2011-08-03 20:20:15 +02:00
update_metadata_by_mid ( 'post' , $meta [ 'id' ], $meta [ 'value' ] );
2017-12-01 00:11:00 +01:00
}
2011-07-21 00:04:35 +02:00
} elseif ( current_user_can ( 'delete_post_meta' , $post_id , $pmeta -> meta_key ) ) {
2011-08-03 20:20:15 +02:00
delete_metadata_by_mid ( 'post' , $meta [ 'id' ] );
2010-09-23 23:22:21 +02:00
}
2013-03-03 17:30:38 +01:00
} elseif ( current_user_can ( 'add_post_meta' , $post_id , wp_unslash ( $meta [ 'key' ] ) ) ) {
2013-03-01 17:28:40 +01:00
add_post_meta ( $post_id , $meta [ 'key' ], $meta [ 'value' ] );
2010-09-23 23:22:21 +02:00
}
}
}
2017-06-18 12:40:46 +02:00
/**
* Retrieve custom fields for a term .
*
* @ since 4.9 . 0
*
2017-07-21 15:40:43 +02:00
* @ param int $term_id Term ID .
2017-06-18 12:40:46 +02:00
* @ return array Array of custom fields , if they exist .
*/
public function get_term_custom_fields ( $term_id ) {
$term_id = ( int ) $term_id ;
$custom_fields = array ();
foreach ( ( array ) has_term_meta ( $term_id ) as $meta ) {
if ( ! current_user_can ( 'edit_term_meta' , $term_id ) ) {
continue ;
}
$custom_fields [] = array (
'id' => $meta [ 'meta_id' ],
'key' => $meta [ 'meta_key' ],
'value' => $meta [ 'meta_value' ],
);
}
return $custom_fields ;
}
/**
* Set custom fields for a term .
*
* @ since 4.9 . 0
*
2017-07-21 15:40:43 +02:00
* @ param int $term_id Term ID .
2017-06-18 12:40:46 +02:00
* @ param array $fields Custom fields .
*/
public function set_term_custom_fields ( $term_id , $fields ) {
$term_id = ( int ) $term_id ;
foreach ( ( array ) $fields as $meta ) {
if ( isset ( $meta [ 'id' ] ) ) {
$meta [ 'id' ] = ( int ) $meta [ 'id' ];
2017-12-01 00:11:00 +01:00
$pmeta = get_metadata_by_mid ( 'term' , $meta [ 'id' ] );
2017-06-18 12:40:46 +02:00
if ( isset ( $meta [ 'key' ] ) ) {
$meta [ 'key' ] = wp_unslash ( $meta [ 'key' ] );
if ( $meta [ 'key' ] !== $pmeta -> meta_key ) {
continue ;
}
$meta [ 'value' ] = wp_unslash ( $meta [ 'value' ] );
if ( current_user_can ( 'edit_term_meta' , $term_id ) ) {
update_metadata_by_mid ( 'term' , $meta [ 'id' ], $meta [ 'value' ] );
}
} elseif ( current_user_can ( 'delete_term_meta' , $term_id ) ) {
delete_metadata_by_mid ( 'term' , $meta [ 'id' ] );
}
} elseif ( current_user_can ( 'add_term_meta' , $term_id ) ) {
add_term_meta ( $term_id , $meta [ 'key' ], $meta [ 'value' ] );
}
}
}
2010-09-23 23:22:21 +02:00
/**
* Set up blog options property .
*
2015-05-23 21:30:26 +02:00
* Passes property through { @ see 'xmlrpc_blog_options' } filter .
2010-09-23 23:22:21 +02:00
*
* @ since 2.6 . 0
*/
2014-05-19 08:09:13 +02:00
public function initialise_blog_option_info () {
2010-09-23 23:22:21 +02:00
$this -> blog_options = array (
2020-01-29 01:45:18 +01:00
// Read-only options.
2017-12-01 00:11:00 +01:00
'software_name' => array (
'desc' => __ ( 'Software Name' ),
'readonly' => true ,
'value' => 'WordPress' ,
2010-09-23 23:22:21 +02:00
),
2017-12-01 00:11:00 +01:00
'software_version' => array (
'desc' => __ ( 'Software Version' ),
'readonly' => true ,
'value' => get_bloginfo ( 'version' ),
2010-09-23 23:22:21 +02:00
),
2017-12-01 00:11:00 +01:00
'blog_url' => array (
'desc' => __ ( 'WordPress Address (URL)' ),
'readonly' => true ,
'option' => 'siteurl' ,
2010-09-23 23:22:21 +02:00
),
2017-12-01 00:11:00 +01:00
'home_url' => array (
'desc' => __ ( 'Site Address (URL)' ),
'readonly' => true ,
'option' => 'home' ,
2012-09-11 03:26:38 +02:00
),
2017-12-01 00:11:00 +01:00
'login_url' => array (
'desc' => __ ( 'Login Address (URL)' ),
'readonly' => true ,
'value' => wp_login_url (),
2013-05-29 13:01:32 +02:00
),
2017-12-01 00:11:00 +01:00
'admin_url' => array (
'desc' => __ ( 'The URL to the admin area' ),
'readonly' => true ,
'value' => get_admin_url (),
2013-05-29 13:01:32 +02:00
),
2012-03-02 19:06:30 +01:00
'image_default_link_type' => array (
2017-12-01 00:11:00 +01:00
'desc' => __ ( 'Image default link type' ),
'readonly' => true ,
'option' => 'image_default_link_type' ,
2012-02-09 00:28:23 +01:00
),
2017-12-01 00:11:00 +01:00
'image_default_size' => array (
'desc' => __ ( 'Image default size' ),
'readonly' => true ,
'option' => 'image_default_size' ,
2012-02-09 00:28:23 +01:00
),
2017-12-01 00:11:00 +01:00
'image_default_align' => array (
'desc' => __ ( 'Image default align' ),
'readonly' => true ,
'option' => 'image_default_align' ,
2012-02-09 00:28:23 +01:00
),
2017-12-01 00:11:00 +01:00
'template' => array (
'desc' => __ ( 'Template' ),
'readonly' => true ,
'option' => 'template' ,
2012-03-02 18:59:47 +01:00
),
2017-12-01 00:11:00 +01:00
'stylesheet' => array (
'desc' => __ ( 'Stylesheet' ),
'readonly' => true ,
'option' => 'stylesheet' ,
2012-03-02 18:59:47 +01:00
),
2017-12-01 00:11:00 +01:00
'post_thumbnail' => array (
'desc' => __ ( 'Post Thumbnail' ),
'readonly' => true ,
'value' => current_theme_supports ( 'post-thumbnails' ),
2012-03-08 13:19:45 +01:00
),
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Updatable options.
2017-12-01 00:11:00 +01:00
'time_zone' => array (
'desc' => __ ( 'Time Zone' ),
'readonly' => false ,
'option' => 'gmt_offset' ,
2010-09-23 23:22:21 +02:00
),
2017-12-01 00:11:00 +01:00
'blog_title' => array (
'desc' => __ ( 'Site Title' ),
'readonly' => false ,
'option' => 'blogname' ,
2010-09-23 23:22:21 +02:00
),
2017-12-01 00:11:00 +01:00
'blog_tagline' => array (
'desc' => __ ( 'Site Tagline' ),
'readonly' => false ,
'option' => 'blogdescription' ,
2010-09-23 23:22:21 +02:00
),
2017-12-01 00:11:00 +01:00
'date_format' => array (
'desc' => __ ( 'Date Format' ),
'readonly' => false ,
'option' => 'date_format' ,
2010-09-23 23:22:21 +02:00
),
2017-12-01 00:11:00 +01:00
'time_format' => array (
'desc' => __ ( 'Time Format' ),
'readonly' => false ,
'option' => 'time_format' ,
2010-09-23 23:22:21 +02:00
),
2017-12-01 00:11:00 +01:00
'users_can_register' => array (
'desc' => __ ( 'Allow new users to sign up' ),
'readonly' => false ,
'option' => 'users_can_register' ,
2010-10-26 19:46:29 +02:00
),
2017-12-01 00:11:00 +01:00
'thumbnail_size_w' => array (
'desc' => __ ( 'Thumbnail Width' ),
'readonly' => false ,
'option' => 'thumbnail_size_w' ,
2010-10-26 19:46:29 +02:00
),
2017-12-01 00:11:00 +01:00
'thumbnail_size_h' => array (
'desc' => __ ( 'Thumbnail Height' ),
'readonly' => false ,
'option' => 'thumbnail_size_h' ,
2010-10-26 19:46:29 +02:00
),
2017-12-01 00:11:00 +01:00
'thumbnail_crop' => array (
'desc' => __ ( 'Crop thumbnail to exact dimensions' ),
'readonly' => false ,
'option' => 'thumbnail_crop' ,
2010-10-26 19:46:29 +02:00
),
2017-12-01 00:11:00 +01:00
'medium_size_w' => array (
'desc' => __ ( 'Medium size image width' ),
'readonly' => false ,
'option' => 'medium_size_w' ,
2010-10-26 19:46:29 +02:00
),
2017-12-01 00:11:00 +01:00
'medium_size_h' => array (
'desc' => __ ( 'Medium size image height' ),
'readonly' => false ,
'option' => 'medium_size_h' ,
2010-10-26 19:46:29 +02:00
),
2017-12-01 00:11:00 +01:00
'medium_large_size_w' => array (
'desc' => __ ( 'Medium-Large size image width' ),
'readonly' => false ,
'option' => 'medium_large_size_w' ,
2015-10-31 21:50:25 +01:00
),
2017-12-01 00:11:00 +01:00
'medium_large_size_h' => array (
'desc' => __ ( 'Medium-Large size image height' ),
'readonly' => false ,
'option' => 'medium_large_size_h' ,
2015-10-31 21:50:25 +01:00
),
2017-12-01 00:11:00 +01:00
'large_size_w' => array (
'desc' => __ ( 'Large size image width' ),
'readonly' => false ,
'option' => 'large_size_w' ,
2010-10-26 19:46:29 +02:00
),
2017-12-01 00:11:00 +01:00
'large_size_h' => array (
'desc' => __ ( 'Large size image height' ),
'readonly' => false ,
'option' => 'large_size_h' ,
2012-01-07 20:08:48 +01:00
),
2017-12-01 00:11:00 +01:00
'default_comment_status' => array (
2019-06-20 14:53:52 +02:00
'desc' => __ ( 'Allow people to submit comments on new posts.' ),
2017-12-01 00:11:00 +01:00
'readonly' => false ,
'option' => 'default_comment_status' ,
),
'default_ping_status' => array (
2019-06-20 14:53:52 +02:00
'desc' => __ ( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new posts.' ),
2017-12-01 00:11:00 +01:00
'readonly' => false ,
'option' => 'default_ping_status' ,
2012-01-07 20:08:48 +01:00
),
2010-09-23 23:22:21 +02:00
);
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters the XML - RPC blog options property .
2014-03-26 06:44:16 +01:00
*
* @ since 2.6 . 0
*
* @ param array $blog_options An array of XML - RPC blog options .
*/
2010-09-23 23:22:21 +02:00
$this -> blog_options = apply_filters ( 'xmlrpc_blog_options' , $this -> blog_options );
}
/**
* Retrieve the blogs of the user .
*
* @ since 2.6 . 0
*
2015-05-23 21:33:27 +02:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-23 21:33:27 +02:00
* @ type string $username Username .
* @ type string $password Password .
2015-05-22 21:37:24 +02:00
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error Array contains :
2011-04-18 09:23:47 +02:00
* - 'isAdmin'
2015-09-26 06:35:25 +02:00
* - 'isPrimary' - whether the blog is the user ' s primary blog
2011-04-18 09:23:47 +02:00
* - 'url'
* - 'blogid'
* - 'blogName'
* - 'xmlrpc' - url of xmlrpc endpoint
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getUsersBlogs ( $args ) {
2016-09-14 01:17:28 +02:00
if ( ! $this -> minimum_args ( $args , 2 ) ) {
return $this -> error ;
}
2020-01-29 01:45:18 +01:00
// If this isn't on WPMU then just use blogger_getUsersBlogs().
2017-12-01 00:11:00 +01:00
if ( ! is_multisite () ) {
2010-09-23 23:22:21 +02:00
array_unshift ( $args , 1 );
return $this -> blogger_getUsersBlogs ( $args );
}
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2010-09-23 23:22:21 +02:00
$username = $args [ 0 ];
$password = $args [ 1 ];
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/**
* Fires after the XML - RPC user has been authenticated but before the rest of
* the method logic begins .
*
* All built - in XML - RPC methods use the action xmlrpc_call , with a parameter
* equal to the method ' s name , e . g . , wp . getUsersBlogs , wp . newPost , etc .
*
* @ since 2.5 . 0
*
2015-05-23 21:36:26 +02:00
* @ param string $name The method name .
2014-03-26 06:44:16 +01:00
*/
2010-09-23 23:22:21 +02:00
do_action ( 'xmlrpc_call' , 'wp.getUsersBlogs' );
2017-12-01 00:11:00 +01:00
$blogs = ( array ) get_blogs_of_user ( $user -> ID );
$struct = array ();
2015-09-26 06:35:25 +02:00
$primary_blog_id = 0 ;
2017-12-01 00:11:00 +01:00
$active_blog = get_active_blog_for_user ( $user -> ID );
2015-09-26 06:35:25 +02:00
if ( $active_blog ) {
$primary_blog_id = ( int ) $active_blog -> blog_id ;
}
2010-09-23 23:22:21 +02:00
foreach ( $blogs as $blog ) {
2015-05-23 21:37:26 +02:00
// Don't include blogs that aren't hosted at this site.
2020-02-09 17:55:09 +01:00
if ( get_current_network_id () != $blog -> site_id ) {
2010-09-23 23:22:21 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$blog_id = $blog -> userblog_id ;
2012-08-03 19:51:42 +02:00
switch_to_blog ( $blog_id );
2012-08-09 18:28:15 +02:00
2017-12-01 00:11:00 +01:00
$is_admin = current_user_can ( 'manage_options' );
2015-09-26 06:35:25 +02:00
$is_primary = ( ( int ) $blog_id === $primary_blog_id );
2012-08-09 18:28:15 +02:00
2010-09-23 23:22:21 +02:00
$struct [] = array (
2015-09-26 06:35:25 +02:00
'isAdmin' => $is_admin ,
'isPrimary' => $is_primary ,
'url' => home_url ( '/' ),
'blogid' => ( string ) $blog_id ,
'blogName' => get_option ( 'blogname' ),
'xmlrpc' => site_url ( 'xmlrpc.php' , 'rpc' ),
2010-09-23 23:22:21 +02:00
);
2012-08-09 18:28:15 +02:00
2012-08-03 19:51:42 +02:00
restore_current_blog ();
2010-09-23 23:22:21 +02:00
}
return $struct ;
}
2012-05-02 23:13:08 +02:00
/**
* Checks if the method received at least the minimum number of arguments .
*
2012-05-14 12:10:01 +02:00
* @ since 3.4 . 0
2012-05-02 23:13:08 +02:00
*
2019-09-16 11:58:56 +02:00
* @ param array $args An array of arguments to check .
* @ param int $count Minimum number of arguments .
2019-09-16 18:32:55 +02:00
* @ return bool True if `$args` contains at least `$count` arguments , false otherwise .
2012-05-02 23:13:08 +02:00
*/
protected function minimum_args ( $args , $count ) {
2019-09-16 11:58:56 +02:00
if ( ! is_array ( $args ) || count ( $args ) < $count ) {
2012-05-02 23:13:08 +02:00
$this -> error = new IXR_Error ( 400 , __ ( 'Insufficient arguments passed to this XML-RPC method.' ) );
return false ;
}
return true ;
}
2012-04-28 23:25:25 +02:00
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
/**
* Prepares taxonomy data for return in an XML - RPC object .
*
2015-05-23 21:38:25 +02:00
* @ param object $taxonomy The unprepared taxonomy data .
* @ param array $fields The subset of taxonomy fields to return .
* @ return array The prepared taxonomy data .
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
*/
2012-04-28 20:48:10 +02:00
protected function _prepare_taxonomy ( $taxonomy , $fields ) {
$_taxonomy = array (
2017-12-01 00:11:00 +01:00
'name' => $taxonomy -> name ,
'label' => $taxonomy -> label ,
2012-04-28 20:48:10 +02:00
'hierarchical' => ( bool ) $taxonomy -> hierarchical ,
2017-12-01 00:11:00 +01:00
'public' => ( bool ) $taxonomy -> public ,
'show_ui' => ( bool ) $taxonomy -> show_ui ,
'_builtin' => ( bool ) $taxonomy -> _builtin ,
2012-04-28 20:48:10 +02:00
);
2017-12-01 00:11:00 +01:00
if ( in_array ( 'labels' , $fields ) ) {
2012-04-28 20:48:10 +02:00
$_taxonomy [ 'labels' ] = ( array ) $taxonomy -> labels ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( in_array ( 'cap' , $fields ) ) {
2012-05-01 22:33:06 +02:00
$_taxonomy [ 'cap' ] = ( array ) $taxonomy -> cap ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( in_array ( 'menu' , $fields ) ) {
2013-08-27 00:35:10 +02:00
$_taxonomy [ 'show_in_menu' ] = ( bool ) $_taxonomy -> show_in_menu ;
2017-12-01 00:11:00 +01:00
}
2013-08-27 00:35:10 +02:00
2017-12-01 00:11:00 +01:00
if ( in_array ( 'object_type' , $fields ) ) {
2012-05-01 23:03:50 +02:00
$_taxonomy [ 'object_type' ] = array_unique ( ( array ) $taxonomy -> object_type );
2017-12-01 00:11:00 +01:00
}
2012-04-28 20:48:10 +02:00
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters XML - RPC - prepared data for the given taxonomy .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
2016-10-07 19:12:29 +02:00
* @ param array $_taxonomy An array of taxonomy data .
* @ param WP_Taxonomy $taxonomy Taxonomy object .
* @ param array $fields The subset of taxonomy fields to return .
2014-03-26 06:44:16 +01:00
*/
2012-04-28 20:48:10 +02:00
return apply_filters ( 'xmlrpc_prepare_taxonomy' , $_taxonomy , $taxonomy , $fields );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
}
/**
* Prepares term data for return in an XML - RPC object .
*
2015-05-23 21:40:24 +02:00
* @ param array | object $term The unprepared term data .
* @ return array The prepared term data .
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
*/
protected function _prepare_term ( $term ) {
$_term = $term ;
2017-12-01 00:11:00 +01:00
if ( ! is_array ( $_term ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$_term = get_object_vars ( $_term );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2013-05-14 20:22:54 +02:00
// For integers which may be larger than XML-RPC supports ensure we return strings.
2017-12-01 00:11:00 +01:00
$_term [ 'term_id' ] = strval ( $_term [ 'term_id' ] );
$_term [ 'term_group' ] = strval ( $_term [ 'term_group' ] );
2012-03-08 14:31:32 +01:00
$_term [ 'term_taxonomy_id' ] = strval ( $_term [ 'term_taxonomy_id' ] );
2017-12-01 00:11:00 +01:00
$_term [ 'parent' ] = strval ( $_term [ 'parent' ] );
2012-03-08 14:31:32 +01:00
2013-05-14 20:22:54 +02:00
// Count we are happy to return as an integer because people really shouldn't use terms that much.
2012-03-08 14:31:32 +01:00
$_term [ 'count' ] = intval ( $_term [ 'count' ] );
2017-06-18 12:40:46 +02:00
// Get term meta.
$_term [ 'custom_fields' ] = $this -> get_term_custom_fields ( $_term [ 'term_id' ] );
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters XML - RPC - prepared data for the given term .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
* @ param array $_term An array of term data .
* @ param array | object $term Term object or array .
*/
2012-04-26 00:28:43 +02:00
return apply_filters ( 'xmlrpc_prepare_term' , $_term , $term );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
}
2012-03-08 12:19:53 +01:00
/**
* Convert a WordPress date string to an IXR_Date object .
*
2015-05-23 21:40:24 +02:00
* @ param string $date Date string to convert .
* @ return IXR_Date IXR_Date object .
2012-03-08 12:19:53 +01:00
*/
protected function _convert_date ( $date ) {
2020-02-09 17:55:09 +01:00
if ( '0000-00-00 00:00:00' === $date ) {
2012-03-08 12:19:53 +01:00
return new IXR_Date ( '00000000T00:00:00Z' );
}
return new IXR_Date ( mysql2date ( 'Ymd\TH:i:s' , $date , false ) );
}
2012-04-04 23:32:28 +02:00
/**
2012-05-14 12:10:01 +02:00
* Convert a WordPress GMT date string to an IXR_Date object .
2012-04-04 23:32:28 +02:00
*
2015-05-23 21:41:24 +02:00
* @ param string $date_gmt WordPress GMT date string .
* @ param string $date Date string .
* @ return IXR_Date IXR_Date object .
2012-04-04 23:32:28 +02:00
*/
protected function _convert_date_gmt ( $date_gmt , $date ) {
2020-02-09 17:55:09 +01:00
if ( '0000-00-00 00:00:00' !== $date && '0000-00-00 00:00:00' === $date_gmt ) {
2012-04-04 23:32:28 +02:00
return new IXR_Date ( get_gmt_from_date ( mysql2date ( 'Y-m-d H:i:s' , $date , false ), 'Ymd\TH:i:s' ) );
}
return $this -> _convert_date ( $date_gmt );
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
/**
* Prepares post data for return in an XML - RPC object .
*
2015-05-23 21:47:25 +02:00
* @ param array $post The unprepared post data .
* @ param array $fields The subset of post type fields to return .
* @ return array The prepared post data .
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*/
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
protected function _prepare_post ( $post , $fields ) {
2015-05-23 21:47:25 +02:00
// Holds the data for this post. built up based on $fields.
2012-03-08 12:19:53 +01:00
$_post = array ( 'post_id' => strval ( $post [ 'ID' ] ) );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-23 21:47:25 +02:00
// Prepare common post fields.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_fields = array (
'post_title' => $post [ 'post_title' ],
2012-03-08 12:19:53 +01:00
'post_date' => $this -> _convert_date ( $post [ 'post_date' ] ),
2012-04-04 23:32:28 +02:00
'post_date_gmt' => $this -> _convert_date_gmt ( $post [ 'post_date_gmt' ], $post [ 'post_date' ] ),
2012-03-08 12:19:53 +01:00
'post_modified' => $this -> _convert_date ( $post [ 'post_modified' ] ),
2012-04-04 23:32:28 +02:00
'post_modified_gmt' => $this -> _convert_date_gmt ( $post [ 'post_modified_gmt' ], $post [ 'post_modified' ] ),
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
'post_status' => $post [ 'post_status' ],
'post_type' => $post [ 'post_type' ],
'post_name' => $post [ 'post_name' ],
2013-02-28 20:40:26 +01:00
'post_author' => $post [ 'post_author' ],
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
'post_password' => $post [ 'post_password' ],
'post_excerpt' => $post [ 'post_excerpt' ],
'post_content' => $post [ 'post_content' ],
2012-08-15 18:06:05 +02:00
'post_parent' => strval ( $post [ 'post_parent' ] ),
'post_mime_type' => $post [ 'post_mime_type' ],
2015-08-20 08:24:26 +02:00
'link' => get_permalink ( $post [ 'ID' ] ),
2012-08-15 18:06:05 +02:00
'guid' => $post [ 'guid' ],
'menu_order' => intval ( $post [ 'menu_order' ] ),
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
'comment_status' => $post [ 'comment_status' ],
'ping_status' => $post [ 'ping_status' ],
2020-02-09 17:55:09 +01:00
'sticky' => ( 'post' === $post [ 'post_type' ] && is_sticky ( $post [ 'ID' ] ) ),
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
);
2015-05-23 21:47:25 +02:00
// Thumbnail.
2012-04-26 22:56:52 +02:00
$post_fields [ 'post_thumbnail' ] = array ();
2017-12-01 00:11:00 +01:00
$thumbnail_id = get_post_thumbnail_id ( $post [ 'ID' ] );
2012-04-26 22:56:52 +02:00
if ( $thumbnail_id ) {
2017-12-01 00:11:00 +01:00
$thumbnail_size = current_theme_supports ( 'post-thumbnail' ) ? 'post-thumbnail' : 'thumbnail' ;
2012-04-26 22:56:52 +02:00
$post_fields [ 'post_thumbnail' ] = $this -> _prepare_media_item ( get_post ( $thumbnail_id ), $thumbnail_size );
}
2012-03-23 16:35:44 +01:00
2015-05-23 21:47:25 +02:00
// Consider future posts as published.
2020-02-09 17:55:09 +01:00
if ( 'future' === $post_fields [ 'post_status' ] ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_fields [ 'post_status' ] = 'publish' ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-23 21:47:25 +02:00
// Fill in blank post format.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_fields [ 'post_format' ] = get_post_format ( $post [ 'ID' ] );
2017-12-01 00:11:00 +01:00
if ( empty ( $post_fields [ 'post_format' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_fields [ 'post_format' ] = 'standard' ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-23 21:47:25 +02:00
// Merge requested $post_fields fields into $_post.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
if ( in_array ( 'post' , $fields ) ) {
$_post = array_merge ( $_post , $post_fields );
} else {
$requested_fields = array_intersect_key ( $post_fields , array_flip ( $fields ) );
2017-12-01 00:11:00 +01:00
$_post = array_merge ( $_post , $requested_fields );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
$all_taxonomy_fields = in_array ( 'taxonomies' , $fields );
if ( $all_taxonomy_fields || in_array ( 'terms' , $fields ) ) {
$post_type_taxonomies = get_object_taxonomies ( $post [ 'post_type' ], 'names' );
2017-12-01 00:11:00 +01:00
$terms = wp_get_object_terms ( $post [ 'ID' ], $post_type_taxonomies );
$_post [ 'terms' ] = array ();
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
foreach ( $terms as $term ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$_post [ 'terms' ][] = $this -> _prepare_term ( $term );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
}
2017-12-01 00:11:00 +01:00
if ( in_array ( 'custom_fields' , $fields ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$_post [ 'custom_fields' ] = $this -> get_custom_fields ( $post [ 'ID' ] );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
if ( in_array ( 'enclosure' , $fields ) ) {
$_post [ 'enclosure' ] = array ();
2017-12-01 00:11:00 +01:00
$enclosures = ( array ) get_post_meta ( $post [ 'ID' ], 'enclosure' );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
if ( ! empty ( $enclosures ) ) {
2017-12-01 00:11:00 +01:00
$encdata = explode ( " \n " , $enclosures [ 0 ] );
$_post [ 'enclosure' ][ 'url' ] = trim ( htmlspecialchars ( $encdata [ 0 ] ) );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$_post [ 'enclosure' ][ 'length' ] = ( int ) trim ( $encdata [ 1 ] );
2017-12-01 00:11:00 +01:00
$_post [ 'enclosure' ][ 'type' ] = trim ( $encdata [ 2 ] );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
}
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters XML - RPC - prepared date for the given post .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
* @ param array $_post An array of modified post data .
* @ param array $post An array of post data .
* @ param array $fields An array of post fields .
*/
2012-04-26 00:28:43 +02:00
return apply_filters ( 'xmlrpc_prepare_post' , $_post , $post , $fields );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
2012-03-23 18:53:14 +01:00
/**
* Prepares post data for return in an XML - RPC object .
*
2016-07-13 17:24:28 +02:00
* @ since 3.4 . 0
* @ since 4.6 . 0 Converted the `$post_type` parameter to accept a WP_Post_Type object .
2012-03-23 18:53:14 +01:00
*
2016-06-28 18:41:35 +02:00
* @ param WP_Post_Type $post_type Post type object .
* @ param array $fields The subset of post fields to return .
2015-05-23 21:47:25 +02:00
* @ return array The prepared post type data .
2012-03-23 18:53:14 +01:00
*/
2012-05-03 17:59:50 +02:00
protected function _prepare_post_type ( $post_type , $fields ) {
2012-03-23 18:53:14 +01:00
$_post_type = array (
2017-12-01 00:11:00 +01:00
'name' => $post_type -> name ,
'label' => $post_type -> label ,
2012-04-28 20:48:10 +02:00
'hierarchical' => ( bool ) $post_type -> hierarchical ,
2017-12-01 00:11:00 +01:00
'public' => ( bool ) $post_type -> public ,
'show_ui' => ( bool ) $post_type -> show_ui ,
'_builtin' => ( bool ) $post_type -> _builtin ,
'has_archive' => ( bool ) $post_type -> has_archive ,
'supports' => get_all_post_type_supports ( $post_type -> name ),
2012-03-23 18:53:14 +01:00
);
if ( in_array ( 'labels' , $fields ) ) {
2012-04-28 20:48:10 +02:00
$_post_type [ 'labels' ] = ( array ) $post_type -> labels ;
2012-03-23 18:53:14 +01:00
}
2012-05-02 22:29:34 +02:00
if ( in_array ( 'cap' , $fields ) ) {
2017-12-01 00:11:00 +01:00
$_post_type [ 'cap' ] = ( array ) $post_type -> cap ;
2012-04-28 20:48:10 +02:00
$_post_type [ 'map_meta_cap' ] = ( bool ) $post_type -> map_meta_cap ;
2012-03-23 18:53:14 +01:00
}
if ( in_array ( 'menu' , $fields ) ) {
2012-04-28 20:48:10 +02:00
$_post_type [ 'menu_position' ] = ( int ) $post_type -> menu_position ;
2017-12-01 00:11:00 +01:00
$_post_type [ 'menu_icon' ] = $post_type -> menu_icon ;
$_post_type [ 'show_in_menu' ] = ( bool ) $post_type -> show_in_menu ;
2012-03-23 18:53:14 +01:00
}
2017-12-01 00:11:00 +01:00
if ( in_array ( 'taxonomies' , $fields ) ) {
2012-04-28 23:22:07 +02:00
$_post_type [ 'taxonomies' ] = get_object_taxonomies ( $post_type -> name , 'names' );
2017-12-01 00:11:00 +01:00
}
2012-03-23 18:53:14 +01:00
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters XML - RPC - prepared date for the given post type .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
2016-07-13 17:24:28 +02:00
* @ since 4.6 . 0 Converted the `$post_type` parameter to accept a WP_Post_Type object .
2014-03-26 06:44:16 +01:00
*
2016-06-28 18:41:35 +02:00
* @ param array $_post_type An array of post type data .
* @ param WP_Post_Type $post_type Post type object .
2014-03-26 06:44:16 +01:00
*/
2012-04-26 00:28:43 +02:00
return apply_filters ( 'xmlrpc_prepare_post_type' , $_post_type , $post_type );
2012-03-23 18:53:14 +01:00
}
2012-04-26 22:56:52 +02:00
/**
* Prepares media item data for return in an XML - RPC object .
*
2015-05-23 21:47:25 +02:00
* @ param object $media_item The unprepared media item data .
* @ param string $thumbnail_size The image size to use for the thumbnail URL .
* @ return array The prepared media item data .
2012-04-26 22:56:52 +02:00
*/
2012-05-14 12:10:01 +02:00
protected function _prepare_media_item ( $media_item , $thumbnail_size = 'thumbnail' ) {
2012-04-26 22:56:52 +02:00
$_media_item = array (
'attachment_id' => strval ( $media_item -> ID ),
'date_created_gmt' => $this -> _convert_date_gmt ( $media_item -> post_date_gmt , $media_item -> post_date ),
'parent' => $media_item -> post_parent ,
'link' => wp_get_attachment_url ( $media_item -> ID ),
'title' => $media_item -> post_title ,
'caption' => $media_item -> post_excerpt ,
'description' => $media_item -> post_content ,
'metadata' => wp_get_attachment_metadata ( $media_item -> ID ),
2017-12-01 00:11:00 +01:00
'type' => $media_item -> post_mime_type ,
2012-04-26 22:56:52 +02:00
);
$thumbnail_src = image_downsize ( $media_item -> ID , $thumbnail_size );
2017-12-01 00:11:00 +01:00
if ( $thumbnail_src ) {
2012-04-26 22:56:52 +02:00
$_media_item [ 'thumbnail' ] = $thumbnail_src [ 0 ];
2017-12-01 00:11:00 +01:00
} else {
2012-04-26 22:56:52 +02:00
$_media_item [ 'thumbnail' ] = $_media_item [ 'link' ];
2017-12-01 00:11:00 +01:00
}
2012-04-26 22:56:52 +02:00
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters XML - RPC - prepared data for the given media item .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
* @ param array $_media_item An array of media item data .
* @ param object $media_item Media item object .
* @ param string $thumbnail_size Image size .
*/
2012-05-11 23:04:47 +02:00
return apply_filters ( 'xmlrpc_prepare_media_item' , $_media_item , $media_item , $thumbnail_size );
2012-04-26 22:56:52 +02:00
}
2012-05-16 20:06:34 +02:00
/**
* Prepares page data for return in an XML - RPC object .
*
2015-05-23 21:47:25 +02:00
* @ param object $page The unprepared page data .
* @ return array The prepared page data .
2012-05-16 20:06:34 +02:00
*/
protected function _prepare_page ( $page ) {
// Get all of the page content and link.
$full_page = get_extended ( $page -> post_content );
2017-12-01 00:11:00 +01:00
$link = get_permalink ( $page -> ID );
2012-05-16 20:06:34 +02:00
// Get info the page parent if there is one.
2017-12-01 00:11:00 +01:00
$parent_title = '' ;
2012-05-16 20:06:34 +02:00
if ( ! empty ( $page -> post_parent ) ) {
2017-12-01 00:11:00 +01:00
$parent = get_post ( $page -> post_parent );
2012-05-16 20:06:34 +02:00
$parent_title = $parent -> post_title ;
}
// Determine comment and ping settings.
$allow_comments = comments_open ( $page -> ID ) ? 1 : 0 ;
2017-12-01 00:11:00 +01:00
$allow_pings = pings_open ( $page -> ID ) ? 1 : 0 ;
2012-05-16 20:06:34 +02:00
// Format page date.
2017-12-01 00:11:00 +01:00
$page_date = $this -> _convert_date ( $page -> post_date );
2012-05-16 20:06:34 +02:00
$page_date_gmt = $this -> _convert_date_gmt ( $page -> post_date_gmt , $page -> post_date );
// Pull the categories info together.
$categories = array ();
2014-09-11 15:56:15 +02:00
if ( is_object_in_taxonomy ( 'page' , 'category' ) ) {
foreach ( wp_get_post_categories ( $page -> ID ) as $cat_id ) {
$categories [] = get_cat_name ( $cat_id );
}
2012-05-16 20:06:34 +02:00
}
// Get the author info.
$author = get_userdata ( $page -> post_author );
$page_template = get_page_template_slug ( $page -> ID );
2017-12-01 00:11:00 +01:00
if ( empty ( $page_template ) ) {
2012-05-16 20:06:34 +02:00
$page_template = 'default' ;
2017-12-01 00:11:00 +01:00
}
2012-05-16 20:06:34 +02:00
$_page = array (
'dateCreated' => $page_date ,
2013-02-28 20:40:26 +01:00
'userid' => $page -> post_author ,
2012-05-16 20:06:34 +02:00
'page_id' => $page -> ID ,
'page_status' => $page -> post_status ,
'description' => $full_page [ 'main' ],
'title' => $page -> post_title ,
'link' => $link ,
'permaLink' => $link ,
'categories' => $categories ,
'excerpt' => $page -> post_excerpt ,
'text_more' => $full_page [ 'extended' ],
'mt_allow_comments' => $allow_comments ,
'mt_allow_pings' => $allow_pings ,
'wp_slug' => $page -> post_name ,
'wp_password' => $page -> post_password ,
'wp_author' => $author -> display_name ,
'wp_page_parent_id' => $page -> post_parent ,
'wp_page_parent_title' => $parent_title ,
'wp_page_order' => $page -> menu_order ,
'wp_author_id' => ( string ) $author -> ID ,
'wp_author_display_name' => $author -> display_name ,
'date_created_gmt' => $page_date_gmt ,
'custom_fields' => $this -> get_custom_fields ( $page -> ID ),
2017-12-01 00:11:00 +01:00
'wp_page_template' => $page_template ,
2012-05-16 20:06:34 +02:00
);
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters XML - RPC - prepared data for the given page .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
* @ param array $_page An array of page data .
* @ param WP_Post $page Page object .
*/
2012-05-16 20:06:34 +02:00
return apply_filters ( 'xmlrpc_prepare_page' , $_page , $page );
}
2012-05-23 22:40:40 +02:00
/**
* Prepares comment data for return in an XML - RPC object .
*
2015-05-23 21:47:25 +02:00
* @ param object $comment The unprepared comment data .
* @ return array The prepared comment data .
2012-05-23 22:40:40 +02:00
*/
protected function _prepare_comment ( $comment ) {
// Format page date.
$comment_date_gmt = $this -> _convert_date_gmt ( $comment -> comment_date_gmt , $comment -> comment_date );
2014-11-01 02:29:24 +01:00
if ( '0' == $comment -> comment_approved ) {
2012-05-23 22:40:40 +02:00
$comment_status = 'hold' ;
2014-11-01 02:29:24 +01:00
} elseif ( 'spam' == $comment -> comment_approved ) {
2012-05-23 22:40:40 +02:00
$comment_status = 'spam' ;
2014-11-01 02:29:24 +01:00
} elseif ( '1' == $comment -> comment_approved ) {
2012-05-23 22:40:40 +02:00
$comment_status = 'approve' ;
2014-11-01 02:29:24 +01:00
} else {
2012-05-23 22:40:40 +02:00
$comment_status = $comment -> comment_approved ;
2014-11-01 02:29:24 +01:00
}
2012-05-23 22:40:40 +02:00
$_comment = array (
'date_created_gmt' => $comment_date_gmt ,
'user_id' => $comment -> user_id ,
'comment_id' => $comment -> comment_ID ,
'parent' => $comment -> comment_parent ,
'status' => $comment_status ,
'content' => $comment -> comment_content ,
2017-12-01 00:11:00 +01:00
'link' => get_comment_link ( $comment ),
2012-05-23 22:40:40 +02:00
'post_id' => $comment -> comment_post_ID ,
2017-12-01 00:11:00 +01:00
'post_title' => get_the_title ( $comment -> comment_post_ID ),
2012-05-23 22:40:40 +02:00
'author' => $comment -> comment_author ,
'author_url' => $comment -> comment_author_url ,
'author_email' => $comment -> comment_author_email ,
'author_ip' => $comment -> comment_author_IP ,
'type' => $comment -> comment_type ,
);
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters XML - RPC - prepared data for the given comment .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
2015-09-03 20:17:24 +02:00
* @ param array $_comment An array of prepared comment data .
* @ param WP_Comment $comment Comment object .
2014-03-26 06:44:16 +01:00
*/
2012-05-23 22:40:40 +02:00
return apply_filters ( 'xmlrpc_prepare_comment' , $_comment , $comment );
}
2012-09-12 02:04:21 +02:00
/**
* Prepares user data for return in an XML - RPC object .
*
2015-05-23 21:47:25 +02:00
* @ param WP_User $user The unprepared user object .
* @ param array $fields The subset of user fields to return .
* @ return array The prepared user data .
2012-09-12 02:04:21 +02:00
*/
protected function _prepare_user ( $user , $fields ) {
$_user = array ( 'user_id' => strval ( $user -> ID ) );
$user_fields = array (
2017-12-01 00:11:00 +01:00
'username' => $user -> user_login ,
'first_name' => $user -> user_firstname ,
'last_name' => $user -> user_lastname ,
'registered' => $this -> _convert_date ( $user -> user_registered ),
'bio' => $user -> user_description ,
'email' => $user -> user_email ,
'nickname' => $user -> nickname ,
'nicename' => $user -> user_nicename ,
'url' => $user -> user_url ,
'display_name' => $user -> display_name ,
'roles' => $user -> roles ,
2012-09-12 02:04:21 +02:00
);
if ( in_array ( 'all' , $fields ) ) {
$_user = array_merge ( $_user , $user_fields );
2012-10-08 01:33:35 +02:00
} else {
2012-09-12 02:04:21 +02:00
if ( in_array ( 'basic' , $fields ) ) {
$basic_fields = array ( 'username' , 'email' , 'registered' , 'display_name' , 'nicename' );
2017-12-01 00:11:00 +01:00
$fields = array_merge ( $fields , $basic_fields );
2012-09-12 02:04:21 +02:00
}
$requested_fields = array_intersect_key ( $user_fields , array_flip ( $fields ) );
2017-12-01 00:11:00 +01:00
$_user = array_merge ( $_user , $requested_fields );
2012-09-12 02:04:21 +02:00
}
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters XML - RPC - prepared data for the given user .
2014-03-26 06:44:16 +01:00
*
* @ since 3.5 . 0
*
* @ param array $_user An array of user data .
* @ param WP_User $user User object .
* @ param array $fields An array of user fields .
*/
2012-09-12 02:04:21 +02:00
return apply_filters ( 'xmlrpc_prepare_user' , $_user , $user , $fields );
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
/**
* Create a new post for any registered post type .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2016-06-10 06:50:33 +02:00
* @ link https :// en . wikipedia . org / wiki / RSS_enclosure for information on RSS enclosures .
2015-05-25 08:25:25 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : top - level arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-25 08:25:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type array $content_struct {
* Content struct for adding a new post . See wp_insert_post () for information on
* additional post fields
*
* @ type string $post_type Post type . Default 'post' .
* @ type string $post_status Post status . Default 'draft'
* @ type string $post_title Post title .
* @ type int $post_author Post author ID .
* @ type string $post_excerpt Post excerpt .
* @ type string $post_content Post content .
* @ type string $post_date_gmt Post date in GMT .
* @ type string $post_date Post date .
* @ type string $post_password Post password ( 20 - character limit ) .
* @ type string $comment_status Post comment enabled status . Accepts 'open' or 'closed' .
* @ type string $ping_status Post ping status . Accepts 'open' or 'closed' .
* @ type bool $sticky Whether the post should be sticky . Automatically false if
* `$post_status` is 'private' .
* @ type int $post_thumbnail ID of an image to use as the post thumbnail / featured image .
* @ type array $custom_fields Array of meta key / value pairs to add to the post .
* @ type array $terms Associative array with taxonomy names as keys and arrays
* of term IDs as values .
* @ type array $terms_names Associative array with taxonomy names as keys and arrays
* of term names as values .
* @ type array $enclosure {
* Array of feed enclosure data to add to post meta .
*
* @ type string $url URL for the feed enclosure .
* @ type int $length Size in bytes of the enclosure .
* @ type string $type Mime - type for the enclosure .
* }
* }
2015-05-22 21:37:24 +02:00
* }
2015-05-25 08:25:25 +02:00
* @ return int | IXR_Error Post ID on success , IXR_Error instance otherwise .
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_newPost ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$content_struct = $args [ 3 ];
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2020-01-29 01:45:18 +01:00
// Convert the date field back to IXR form.
2015-01-16 02:06:24 +01:00
if ( isset ( $content_struct [ 'post_date' ] ) && ! ( $content_struct [ 'post_date' ] instanceof IXR_Date ) ) {
2014-06-26 19:43:14 +02:00
$content_struct [ 'post_date' ] = $this -> _convert_date ( $content_struct [ 'post_date' ] );
}
2020-01-29 01:45:18 +01:00
/*
* Ignore the existing GMT date if it is empty or a non - GMT date was supplied in $content_struct ,
* since _insert_post () will ignore the non - GMT date if the GMT date is set .
*/
2015-01-16 02:06:24 +01:00
if ( isset ( $content_struct [ 'post_date_gmt' ] ) && ! ( $content_struct [ 'post_date_gmt' ] instanceof IXR_Date ) ) {
2020-02-09 17:55:09 +01:00
if ( '0000-00-00 00:00:00' === $content_struct [ 'post_date_gmt' ] || isset ( $content_struct [ 'post_date' ] ) ) {
2014-06-26 19:43:14 +02:00
unset ( $content_struct [ 'post_date_gmt' ] );
} else {
$content_struct [ 'post_date_gmt' ] = $this -> _convert_date ( $content_struct [ 'post_date_gmt' ] );
}
}
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
do_action ( 'xmlrpc_call' , 'wp.newPost' );
unset ( $content_struct [ 'ID' ] );
2012-02-08 18:00:19 +01:00
return $this -> _insert_post ( $user , $content_struct );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
2012-05-14 12:10:01 +02:00
/**
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
* Helper method for filtering out elements from an array .
2012-04-28 20:48:10 +02:00
*
* @ since 3.4 . 0
2012-05-14 12:10:01 +02:00
*
* @ param int $count Number to compare to one .
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*/
2012-05-14 12:10:01 +02:00
private function _is_greater_than_one ( $count ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return $count > 1 ;
}
2015-07-19 20:09:25 +02:00
/**
2015-07-21 17:18:25 +02:00
* Encapsulate the logic for sticking a post
* and determining if the user has permission to do so
*
2015-07-19 20:09:25 +02:00
* @ 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' ] );
}
2017-12-01 00:11:00 +01:00
} elseif ( isset ( $post_data [ 'sticky' ] ) ) {
2015-07-19 20:09:25 +02:00
if ( ! current_user_can ( $post_type -> cap -> edit_others_posts ) ) {
2016-11-17 16:53:33 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to make posts sticky.' ) );
2015-07-19 20:09:25 +02:00
}
$sticky = wp_validate_boolean ( $post_data [ 'sticky' ] );
if ( $sticky ) {
stick_post ( $post_data [ 'ID' ] );
} else {
unstick_post ( $post_data [ 'ID' ] );
}
}
}
2012-05-14 12:10:01 +02:00
/**
2015-05-23 21:47:25 +02:00
* Helper method for wp_newPost () and wp_editPost (), containing shared logic .
2012-04-28 20:48:10 +02:00
*
* @ since 3.4 . 0
2015-05-23 21:47:25 +02:00
*
* @ see wp_insert_post ()
2012-05-14 12:10:01 +02:00
*
2015-05-23 21:47:25 +02:00
* @ param WP_User $user The post author if post_author isn ' t set in $content_struct .
2014-11-03 04:04:22 +01:00
* @ param array | IXR_Error $content_struct Post data to insert .
2015-05-22 21:37:24 +02:00
* @ return IXR_Error | string
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*/
2012-04-28 20:48:10 +02:00
protected function _insert_post ( $user , $content_struct ) {
2017-05-16 10:09:42 +02:00
$defaults = array (
'post_status' => 'draft' ,
'post_type' => 'post' ,
'post_author' => null ,
'post_password' => null ,
'post_excerpt' => null ,
'post_content' => null ,
'post_title' => null ,
'post_date' => null ,
'post_date_gmt' => null ,
'post_format' => null ,
'post_name' => null ,
'post_thumbnail' => null ,
'post_parent' => null ,
'ping_status' => null ,
'comment_status' => null ,
'custom_fields' => null ,
'terms_names' => null ,
'terms' => null ,
'sticky' => null ,
'enclosure' => null ,
'ID' => null ,
);
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-05-16 10:09:42 +02:00
$post_data = wp_parse_args ( array_intersect_key ( $content_struct , $defaults ), $defaults );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_type = get_post_type_object ( $post_data [ 'post_type' ] );
2017-12-01 00:11:00 +01:00
if ( ! $post_type ) {
2016-07-17 18:05:31 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid post type.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2012-04-28 20:48:10 +02:00
$update = ! empty ( $post_data [ 'ID' ] );
2012-02-08 16:40:26 +01:00
if ( $update ) {
2017-12-01 00:11:00 +01:00
if ( ! get_post ( $post_data [ 'ID' ] ) ) {
2012-04-30 02:19:32 +02:00
return new IXR_Error ( 401 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
if ( ! current_user_can ( 'edit_post' , $post_data [ 'ID' ] ) ) {
2012-02-08 16:40:26 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2017-12-01 00:11:00 +01:00
}
2020-02-09 17:55:09 +01:00
if ( get_post_type ( $post_data [ 'ID' ] ) !== $post_data [ 'post_type' ] ) {
2012-04-28 20:48:10 +02:00
return new IXR_Error ( 401 , __ ( 'The post type may not be changed.' ) );
2017-12-01 00:11:00 +01:00
}
2012-02-08 16:40:26 +01:00
} else {
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type -> cap -> create_posts ) || ! current_user_can ( $post_type -> cap -> edit_posts ) ) {
2012-02-08 16:40:26 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to post on this site.' ) );
2017-12-01 00:11:00 +01:00
}
2012-02-08 16:40:26 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
switch ( $post_data [ 'post_status' ] ) {
case 'draft' :
case 'pending' :
break ;
case 'private' :
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type -> cap -> publish_posts ) ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to create private posts in this post type.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
break ;
case 'publish' :
case 'future' :
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type -> cap -> publish_posts ) ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to publish posts in this post type.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
break ;
default :
2017-12-01 00:11:00 +01:00
if ( ! get_post_status_object ( $post_data [ 'post_status' ] ) ) {
2012-11-05 15:44:25 +01:00
$post_data [ 'post_status' ] = 'draft' ;
2017-12-01 00:11:00 +01:00
}
break ;
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
2017-12-01 00:11:00 +01:00
if ( ! empty ( $post_data [ 'post_password' ] ) && ! current_user_can ( $post_type -> cap -> publish_posts ) ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to create password protected posts in this post type.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_data [ 'post_author' ] = absint ( $post_data [ 'post_author' ] );
2012-02-08 15:54:15 +01:00
if ( ! empty ( $post_data [ 'post_author' ] ) && $post_data [ 'post_author' ] != $user -> ID ) {
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type -> cap -> edit_others_posts ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to create posts as this user.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$author = get_userdata ( $post_data [ 'post_author' ] );
2017-12-01 00:11:00 +01:00
if ( ! $author ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 404 , __ ( 'Invalid author ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-02-08 16:40:26 +01:00
} else {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_data [ 'post_author' ] = $user -> ID ;
}
2020-02-09 17:55:09 +01:00
if ( isset ( $post_data [ 'comment_status' ] ) && 'open' !== $post_data [ 'comment_status' ] && 'closed' !== $post_data [ 'comment_status' ] ) {
2012-04-28 20:48:10 +02:00
unset ( $post_data [ 'comment_status' ] );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2020-02-09 17:55:09 +01:00
if ( isset ( $post_data [ 'ping_status' ] ) && 'open' !== $post_data [ 'ping_status' ] && 'closed' !== $post_data [ 'ping_status' ] ) {
2012-04-28 20:48:10 +02:00
unset ( $post_data [ 'ping_status' ] );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-23 21:47:25 +02:00
// Do some timestamp voodoo.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
if ( ! empty ( $post_data [ 'post_date_gmt' ] ) ) {
2015-05-23 21:47:25 +02:00
// We know this is supposed to be GMT, so we're going to slap that Z on there by force.
2012-04-28 20:48:10 +02:00
$dateCreated = rtrim ( $post_data [ 'post_date_gmt' ] -> getIso (), 'Z' ) . 'Z' ;
2012-02-08 17:04:58 +01:00
} elseif ( ! empty ( $post_data [ 'post_date' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$dateCreated = $post_data [ 'post_date' ] -> getIso ();
}
2016-03-22 16:10:28 +01:00
// Default to not flagging the post date to be edited unless it's intentional.
$post_data [ 'edit_date' ] = false ;
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
if ( ! empty ( $dateCreated ) ) {
2019-12-09 20:56:05 +01:00
$post_data [ 'post_date' ] = iso8601_to_datetime ( $dateCreated );
$post_data [ 'post_date_gmt' ] = iso8601_to_datetime ( $dateCreated , 'gmt' );
2016-03-22 16:10:28 +01:00
// Flag the post date to be edited.
$post_data [ 'edit_date' ] = true ;
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
2017-12-01 00:11:00 +01:00
if ( ! isset ( $post_data [ 'ID' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_data [ 'ID' ] = get_default_post_to_edit ( $post_data [ 'post_type' ], true ) -> ID ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_ID = $post_data [ 'ID' ];
2020-02-09 17:55:09 +01:00
if ( 'post' === $post_data [ 'post_type' ] ) {
2015-07-19 20:09:25 +02:00
$error = $this -> _toggle_sticky ( $post_data , $update );
if ( $error ) {
return $error ;
2012-04-28 20:48:10 +02:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
2012-04-28 20:48:10 +02:00
if ( isset ( $post_data [ 'post_thumbnail' ] ) ) {
2020-01-29 01:45:18 +01:00
// Empty value deletes, non-empty value adds/updates.
2017-12-01 00:11:00 +01:00
if ( ! $post_data [ 'post_thumbnail' ] ) {
2012-03-23 16:35:44 +01:00
delete_post_thumbnail ( $post_ID );
2017-12-01 00:11:00 +01:00
} elseif ( ! get_post ( absint ( $post_data [ 'post_thumbnail' ] ) ) ) {
2012-10-23 16:08:20 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid attachment ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-10-23 16:08:20 +02:00
set_post_thumbnail ( $post_ID , $post_data [ 'post_thumbnail' ] );
2012-04-13 22:23:31 +02:00
unset ( $content_struct [ 'post_thumbnail' ] );
2012-03-23 16:35:44 +01:00
}
2017-12-01 00:11:00 +01:00
if ( isset ( $post_data [ 'custom_fields' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$this -> set_custom_fields ( $post_ID , $post_data [ 'custom_fields' ] );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2012-02-08 15:54:15 +01:00
if ( isset ( $post_data [ 'terms' ] ) || isset ( $post_data [ 'terms_names' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_type_taxonomies = get_object_taxonomies ( $post_data [ 'post_type' ], 'objects' );
2015-05-23 21:47:25 +02:00
// Accumulate term IDs from terms and terms_names.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$terms = array ();
2015-05-23 21:47:25 +02:00
// First validate the terms specified by ID.
2012-02-08 15:54:15 +01:00
if ( isset ( $post_data [ 'terms' ] ) && is_array ( $post_data [ 'terms' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$taxonomies = array_keys ( $post_data [ 'terms' ] );
2015-05-23 21:47:25 +02:00
// Validating term ids.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
foreach ( $taxonomies as $taxonomy ) {
2017-12-01 00:11:00 +01:00
if ( ! array_key_exists ( $taxonomy , $post_type_taxonomies ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, one of the given taxonomies is not supported by the post type.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type_taxonomies [ $taxonomy ] -> cap -> assign_terms ) ) {
2012-02-08 19:50:25 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
$term_ids = $post_data [ 'terms' ][ $taxonomy ];
2014-03-15 06:09:14 +01:00
$terms [ $taxonomy ] = array ();
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
foreach ( $term_ids as $term_id ) {
$term = get_term_by ( 'id' , $term_id , $taxonomy );
2017-12-01 00:11:00 +01:00
if ( ! $term ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid term ID.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
$terms [ $taxonomy ][] = ( int ) $term_id ;
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
}
}
2015-05-23 21:47:25 +02:00
// Now validate terms specified by name.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
if ( isset ( $post_data [ 'terms_names' ] ) && is_array ( $post_data [ 'terms_names' ] ) ) {
$taxonomies = array_keys ( $post_data [ 'terms_names' ] );
foreach ( $taxonomies as $taxonomy ) {
2017-12-01 00:11:00 +01:00
if ( ! array_key_exists ( $taxonomy , $post_type_taxonomies ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, one of the given taxonomies is not supported by the post type.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type_taxonomies [ $taxonomy ] -> cap -> assign_terms ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-23 21:47:25 +02:00
/*
* For hierarchical taxonomies , we can ' t assign a term when multiple terms
* in the hierarchy share the same name .
*/
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$ambiguous_terms = array ();
2012-02-08 15:54:15 +01:00
if ( is_taxonomy_hierarchical ( $taxonomy ) ) {
2017-12-01 00:11:00 +01:00
$tax_term_names = get_terms (
2018-08-17 03:51:36 +02:00
array (
2019-08-03 05:35:56 +02:00
'taxonomy' => $taxonomy ,
2017-12-01 00:11:00 +01:00
'fields' => 'names' ,
'hide_empty' => false ,
)
);
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-23 21:47:25 +02:00
// Count the number of terms with the same name.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$tax_term_names_count = array_count_values ( $tax_term_names );
2015-05-23 21:47:25 +02:00
// Filter out non-ambiguous term names.
2017-12-01 00:11:00 +01:00
$ambiguous_tax_term_counts = array_filter ( $tax_term_names_count , array ( $this , '_is_greater_than_one' ) );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$ambiguous_terms = array_keys ( $ambiguous_tax_term_counts );
}
2017-12-01 00:11:00 +01:00
$term_names = $post_data [ 'terms_names' ][ $taxonomy ];
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
foreach ( $term_names as $term_name ) {
2017-12-01 00:11:00 +01:00
if ( in_array ( $term_name , $ambiguous_terms ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 401 , __ ( 'Ambiguous term name used in a hierarchical taxonomy. Please use term ID instead.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$term = get_term_by ( 'name' , $term_name , $taxonomy );
if ( ! $term ) {
2015-05-23 21:47:25 +02:00
// Term doesn't exist, so check that the user is allowed to create new terms.
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type_taxonomies [ $taxonomy ] -> cap -> edit_terms ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to add a term to one of the given taxonomies.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-23 21:47:25 +02:00
// Create the new term.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$term_info = wp_insert_term ( $term_name , $taxonomy );
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $term_info ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 500 , $term_info -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
$terms [ $taxonomy ][] = ( int ) $term_info [ 'term_id' ];
2012-02-08 17:04:58 +01:00
} else {
2017-12-01 00:11:00 +01:00
$terms [ $taxonomy ][] = ( int ) $term -> term_id ;
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
}
}
}
$post_data [ 'tax_input' ] = $terms ;
2012-04-28 20:48:10 +02:00
unset ( $post_data [ 'terms' ], $post_data [ 'terms_names' ] );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
2012-02-08 15:54:15 +01:00
if ( isset ( $post_data [ 'post_format' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$format = set_post_format ( $post_ID , $post_data [ 'post_format' ] );
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $format ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 500 , $format -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
unset ( $post_data [ 'post_format' ] );
}
2015-05-23 21:47:25 +02:00
// Handle enclosures.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$enclosure = isset ( $post_data [ 'enclosure' ] ) ? $post_data [ 'enclosure' ] : null ;
$this -> add_enclosure_if_new ( $post_ID , $enclosure );
$this -> attach_uploads ( $post_ID , $post_data [ 'post_content' ] );
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters post data array to be inserted via XML - RPC .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
* @ param array $post_data Parsed array of post data .
* @ param array $content_struct Post data array .
*/
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$post_data = apply_filters ( 'xmlrpc_wp_insert_post_data' , $post_data , $content_struct );
2012-11-14 23:58:24 +01:00
$post_ID = $update ? wp_update_post ( $post_data , true ) : wp_insert_post ( $post_data , true );
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $post_ID ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 500 , $post_ID -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $post_ID ) {
2019-12-05 14:48:03 +01:00
if ( $update ) {
return new IXR_Error ( 401 , __ ( 'Sorry, the post could not be updated.' ) );
} else {
return new IXR_Error ( 401 , __ ( 'Sorry, the post could not be created.' ) );
}
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return strval ( $post_ID );
}
2012-02-08 17:03:31 +01:00
/**
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
* Edit a post for any registered post type .
*
* The $content_struct parameter only needs to contain fields that
* should be changed . All other fields will retain their existing values .
*
2012-05-14 12:10:01 +02:00
* @ since 3.4 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-23 21:47:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type int $post_id Post ID .
* @ type array $content_struct Extra content arguments .
2015-05-22 21:37:24 +02:00
* }
2015-05-23 21:47:25 +02:00
* @ return true | IXR_Error True on success , IXR_Error on failure .
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_editPost ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 5 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$post_id = ( int ) $args [ 3 ];
$content_struct = $args [ 4 ];
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
do_action ( 'xmlrpc_call' , 'wp.editPost' );
$post = get_post ( $post_id , ARRAY_A );
2017-12-01 00:11:00 +01:00
if ( empty ( $post [ 'ID' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2012-09-27 05:39:40 +02:00
if ( isset ( $content_struct [ 'if_not_modified_since' ] ) ) {
// If the post has been modified since the date provided, return an error.
if ( mysql2date ( 'U' , $post [ 'post_modified_gmt' ] ) > $content_struct [ 'if_not_modified_since' ] -> getTimestamp () ) {
return new IXR_Error ( 409 , __ ( 'There is a revision of this post that is more recent.' ) );
}
}
2015-05-25 08:25:25 +02:00
// Convert the date field back to IXR form.
2012-03-08 12:19:53 +01:00
$post [ 'post_date' ] = $this -> _convert_date ( $post [ 'post_date' ] );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-25 08:25:25 +02:00
/*
* Ignore the existing GMT date if it is empty or a non - GMT date was supplied in $content_struct ,
* since _insert_post () will ignore the non - GMT date if the GMT date is set .
*/
2020-02-09 17:55:09 +01:00
if ( '0000-00-00 00:00:00' === $post [ 'post_date_gmt' ] || isset ( $content_struct [ 'post_date' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
unset ( $post [ 'post_date_gmt' ] );
2017-12-01 00:11:00 +01:00
} else {
2012-03-08 12:19:53 +01:00
$post [ 'post_date_gmt' ] = $this -> _convert_date ( $post [ 'post_date_gmt' ] );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2019-08-29 04:10:56 +02:00
/*
2020-01-29 01:45:18 +01:00
* If the API client did not provide 'post_date' , then we must not perpetuate the value that
* was stored in the database , or it will appear to be an intentional edit . Conveying it here
* as if it was coming from the API client will cause an otherwise zeroed out 'post_date_gmt'
* to get set with the value that was originally stored in the database when the draft was created .
2019-08-29 04:10:56 +02:00
*/
if ( ! isset ( $content_struct [ 'post_date' ] ) ) {
unset ( $post [ 'post_date' ] );
}
2013-03-01 17:28:40 +01:00
$this -> escape ( $post );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$merged_content_struct = array_merge ( $post , $content_struct );
2012-02-08 18:00:19 +01:00
$retval = $this -> _insert_post ( $user , $merged_content_struct );
2017-12-01 00:11:00 +01:00
if ( $retval instanceof IXR_Error ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return $retval ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return true ;
}
/**
* Delete a post for any registered post type .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see wp_delete_post ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-25 08:25:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type int $post_id Post ID .
2015-05-22 21:37:24 +02:00
* }
2015-05-25 08:25:25 +02:00
* @ return true | IXR_Error True on success , IXR_Error instance on failure .
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_deletePost ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$post_id = ( int ) $args [ 3 ];
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
do_action ( 'xmlrpc_call' , 'wp.deletePost' );
2012-08-28 21:08:28 +02:00
$post = get_post ( $post_id , ARRAY_A );
2015-10-03 16:09:43 +02:00
if ( empty ( $post [ 'ID' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2015-10-03 16:09:43 +02:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-10-03 16:09:43 +02:00
if ( ! current_user_can ( 'delete_post' , $post_id ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to delete this post.' ) );
2015-10-03 16:09:43 +02:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$result = wp_delete_post ( $post_id );
2015-10-03 16:09:43 +02:00
if ( ! $result ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the post could not be deleted.' ) );
2015-10-03 16:09:43 +02:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return true ;
}
/**
* Retrieve a post .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
* The optional $fields parameter specifies what fields will be included
* in the response array . This should be a list of field names . 'post_id' will
* always be included in the response regardless of the value of $fields .
*
* Instead of , or in addition to , individual field names , conceptual group
* names can be used to specify multiple fields . The available conceptual
* groups are 'post' ( all basic fields ), 'taxonomies' , 'custom_fields' ,
* and 'enclosure' .
*
2015-05-25 08:25:25 +02:00
* @ see get_post ()
*
* @ param array $args {
* Method arguments . Note : arguments must be ordered as documented .
*
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type int $post_id Post ID .
* @ type array $fields The subset of post type fields to return .
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error Array contains ( based on $fields parameter ) :
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
* - 'post_id'
* - 'post_title'
* - 'post_date'
* - 'post_date_gmt'
* - 'post_modified'
* - 'post_modified_gmt'
* - 'post_status'
* - 'post_type'
* - 'post_name'
* - 'post_author'
* - 'post_password'
* - 'post_excerpt'
* - 'post_content'
* - 'link'
* - 'comment_status'
* - 'ping_status'
* - 'sticky'
* - 'custom_fields'
* - 'terms'
* - 'categories'
* - 'tags'
* - 'enclosure'
*/
2014-05-19 08:09:13 +02:00
public function wp_getPost ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$post_id = ( int ) $args [ 3 ];
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2014-04-10 23:04:14 +02:00
if ( isset ( $args [ 4 ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$fields = $args [ 4 ];
2014-04-10 23:04:14 +02:00
} else {
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters the list of post query fields used by the given XML - RPC method .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ param array $fields Array of post fields . Default array contains 'post' , 'terms' , and 'custom_fields' .
2014-03-26 06:44:16 +01:00
* @ param string $method Method name .
*/
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$fields = apply_filters ( 'xmlrpc_default_post_fields' , array ( 'post' , 'terms' , 'custom_fields' ), 'wp.getPost' );
2014-04-10 23:04:14 +02:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
do_action ( 'xmlrpc_call' , 'wp.getPost' );
2012-08-28 21:08:28 +02:00
$post = get_post ( $post_id , ARRAY_A );
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( empty ( $post [ 'ID' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post_id ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return $this -> _prepare_post ( $post , $fields );
}
/**
* Retrieve posts .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see wp_get_recent_posts ()
* @ see wp_getPost () for more on `$fields`
* @ see get_posts () for more on `$filter` values
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*
2015-05-25 08:25:25 +02:00
* @ param array $args {
* Method arguments . Note : arguments must be ordered as documented .
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*
2015-05-25 08:25:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type array $filter Optional . Modifies the query used to retrieve posts . Accepts 'post_type' ,
2015-10-06 15:41:26 +02:00
* 'post_status' , 'number' , 'offset' , 'orderby' , 's' , and 'order' .
2015-05-25 08:25:25 +02:00
* Default empty array .
* @ type array $fields Optional . The subset of post type fields to return in the response array .
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error Array contains a collection of posts .
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getPosts ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 3 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$filter = isset ( $args [ 3 ] ) ? $args [ 3 ] : array ();
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 4 ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$fields = $args [ 4 ];
2014-03-26 06:44:16 +01:00
} else {
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$fields = apply_filters ( 'xmlrpc_default_post_fields' , array ( 'post' , 'terms' , 'custom_fields' ), 'wp.getPosts' );
2014-03-26 06:44:16 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
do_action ( 'xmlrpc_call' , 'wp.getPosts' );
$query = array ();
if ( isset ( $filter [ 'post_type' ] ) ) {
$post_type = get_post_type_object ( $filter [ 'post_type' ] );
2017-12-01 00:11:00 +01:00
if ( ! ( ( bool ) $post_type ) ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid post type.' ) );
2017-12-01 00:11:00 +01:00
}
2012-06-26 21:04:10 +02:00
} else {
$post_type = get_post_type_object ( 'post' );
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type -> cap -> edit_posts ) ) {
2016-11-17 16:53:33 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit posts in this post type.' ) );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2012-06-26 21:04:10 +02:00
$query [ 'post_type' ] = $post_type -> name ;
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'post_status' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$query [ 'post_status' ] = $filter [ 'post_status' ];
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'number' ] ) ) {
2012-05-23 00:25:17 +02:00
$query [ 'numberposts' ] = absint ( $filter [ 'number' ] );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'offset' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$query [ 'offset' ] = absint ( $filter [ 'offset' ] );
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
if ( isset ( $filter [ 'orderby' ] ) ) {
$query [ 'orderby' ] = $filter [ 'orderby' ];
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'order' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$query [ 'order' ] = $filter [ 'order' ];
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
}
2012-09-27 05:39:40 +02:00
2012-09-21 12:18:32 +02:00
if ( isset ( $filter [ 's' ] ) ) {
$query [ 's' ] = $filter [ 's' ];
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$posts_list = wp_get_recent_posts ( $query );
2017-12-01 00:11:00 +01:00
if ( ! $posts_list ) {
2012-03-02 19:06:30 +01:00
return array ();
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
2015-05-25 08:25:25 +02:00
// Holds all the posts data.
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$struct = array ();
foreach ( $posts_list as $post ) {
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post [ 'ID' ] ) ) {
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
continue ;
2017-12-01 00:11:00 +01:00
}
XMLRPC: Introduce new create,read,update and delete XMLRPC apis for Posts, Pages and all Custom Post Types.
Introduces: wp.newPost, wp.editPost, wp.deletePost, wp.getPost, and wp.getPosts
See #18429, #18430, #18431, #18432, and #18433 props maxcutler and markoheijnen.
git-svn-id: http://svn.automattic.com/wordpress/trunk@19848 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-07 12:33:39 +01:00
$struct [] = $this -> _prepare_post ( $post , $fields );
}
return $struct ;
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
/**
* Create a new term .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see wp_insert_term ()
*
* @ param array $args {
* Method arguments . Note : arguments must be ordered as documented .
*
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type array $content_struct Content struct for adding a new term . The struct must contain
* the term 'name' and 'taxonomy' . Optional accepted values include
* 'parent' , 'description' , and 'slug' .
* }
* @ return int | IXR_Error The term ID on success , or an IXR_Error object on failure .
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_newTerm ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$content_struct = $args [ 3 ];
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
do_action ( 'xmlrpc_call' , 'wp.newTerm' );
2017-12-01 00:11:00 +01:00
if ( ! taxonomy_exists ( $content_struct [ 'taxonomy' ] ) ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid taxonomy.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$taxonomy = get_taxonomy ( $content_struct [ 'taxonomy' ] );
Taxonomy: Introduce more fine grained capabilities for managing taxonomy terms.
This introduces the singular `edit_term`, `delete_term`, and `assign_term` meta capabilities for terms, and switches the base capability name for tags from `manage_categories` to `manage_post_tags` and the corresponding `edit_post_tags`, `delete_post_tags`, and `assign_post_tags`.
All of these capabilities ultimately map to `manage_categories` so by default there is no change in the behaviour of the capabilities for categories, tags, or custom taxonomies. The `map_meta_cap` filter and the `capabilities` argument when registering a taxonomy now allow for control over editing, deleting, and assigning individual terms, as well as a separation of capabilities for tags from those of categories.
Fixes #35614
Props johnjamesjacoby for feedback
Built from https://develop.svn.wordpress.org/trunk@38698
git-svn-id: http://core.svn.wordpress.org/trunk@38641 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-01 00:40:28 +02:00
if ( ! current_user_can ( $taxonomy -> cap -> edit_terms ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to create terms in this taxonomy.' ) );
Taxonomy: Introduce more fine grained capabilities for managing taxonomy terms.
This introduces the singular `edit_term`, `delete_term`, and `assign_term` meta capabilities for terms, and switches the base capability name for tags from `manage_categories` to `manage_post_tags` and the corresponding `edit_post_tags`, `delete_post_tags`, and `assign_post_tags`.
All of these capabilities ultimately map to `manage_categories` so by default there is no change in the behaviour of the capabilities for categories, tags, or custom taxonomies. The `map_meta_cap` filter and the `capabilities` argument when registering a taxonomy now allow for control over editing, deleting, and assigning individual terms, as well as a separation of capabilities for tags from those of categories.
Fixes #35614
Props johnjamesjacoby for feedback
Built from https://develop.svn.wordpress.org/trunk@38698
git-svn-id: http://core.svn.wordpress.org/trunk@38641 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-01 00:40:28 +02:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$taxonomy = ( array ) $taxonomy ;
2020-01-29 01:45:18 +01:00
// Hold the data of the term.
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$term_data = array ();
$term_data [ 'name' ] = trim ( $content_struct [ 'name' ] );
2017-12-01 00:11:00 +01:00
if ( empty ( $term_data [ 'name' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 403 , __ ( 'The term name cannot be empty.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
if ( isset ( $content_struct [ 'parent' ] ) ) {
2017-12-01 00:11:00 +01:00
if ( ! $taxonomy [ 'hierarchical' ] ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 403 , __ ( 'This taxonomy is not hierarchical.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$parent_term_id = ( int ) $content_struct [ 'parent' ];
2017-12-01 00:11:00 +01:00
$parent_term = get_term ( $parent_term_id , $taxonomy [ 'name' ] );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $parent_term ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $parent_term -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $parent_term ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 403 , __ ( 'Parent term does not exist.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$term_data [ 'parent' ] = $content_struct [ 'parent' ];
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'description' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$term_data [ 'description' ] = $content_struct [ 'description' ];
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'slug' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$term_data [ 'slug' ] = $content_struct [ 'slug' ];
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
$term = wp_insert_term ( $term_data [ 'name' ], $taxonomy [ 'name' ], $term_data );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $term ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $term -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $term ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the term could not be created.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-06-18 12:40:46 +02:00
// Add term meta.
if ( isset ( $content_struct [ 'custom_fields' ] ) ) {
$this -> set_term_custom_fields ( $term [ 'term_id' ], $content_struct [ 'custom_fields' ] );
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return strval ( $term [ 'term_id' ] );
}
/**
* Edit a term .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see wp_update_term ()
*
* @ param array $args {
* Method arguments . Note : arguments must be ordered as documented .
*
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type int $term_id Term ID .
* @ type array $content_struct Content struct for editing a term . The struct must contain the
* term '' taxonomy '. Optional accepted values include ' name ', ' parent ' ,
* 'description' , and 'slug' .
* }
* @ return true | IXR_Error True on success , IXR_Error instance on failure .
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_editTerm ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 5 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$term_id = ( int ) $args [ 3 ];
$content_struct = $args [ 4 ];
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
do_action ( 'xmlrpc_call' , 'wp.editTerm' );
2017-12-01 00:11:00 +01:00
if ( ! taxonomy_exists ( $content_struct [ 'taxonomy' ] ) ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid taxonomy.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$taxonomy = get_taxonomy ( $content_struct [ 'taxonomy' ] );
$taxonomy = ( array ) $taxonomy ;
2020-01-29 01:45:18 +01:00
// Hold the data of the term.
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$term_data = array ();
2017-12-01 00:11:00 +01:00
$term = get_term ( $term_id , $content_struct [ 'taxonomy' ] );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $term ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $term -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $term ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid term ID.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
Taxonomy: Introduce more fine grained capabilities for managing taxonomy terms.
This introduces the singular `edit_term`, `delete_term`, and `assign_term` meta capabilities for terms, and switches the base capability name for tags from `manage_categories` to `manage_post_tags` and the corresponding `edit_post_tags`, `delete_post_tags`, and `assign_post_tags`.
All of these capabilities ultimately map to `manage_categories` so by default there is no change in the behaviour of the capabilities for categories, tags, or custom taxonomies. The `map_meta_cap` filter and the `capabilities` argument when registering a taxonomy now allow for control over editing, deleting, and assigning individual terms, as well as a separation of capabilities for tags from those of categories.
Fixes #35614
Props johnjamesjacoby for feedback
Built from https://develop.svn.wordpress.org/trunk@38698
git-svn-id: http://core.svn.wordpress.org/trunk@38641 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-01 00:40:28 +02:00
if ( ! current_user_can ( 'edit_term' , $term_id ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this term.' ) );
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
if ( isset ( $content_struct [ 'name' ] ) ) {
$term_data [ 'name' ] = trim ( $content_struct [ 'name' ] );
2017-12-01 00:11:00 +01:00
if ( empty ( $term_data [ 'name' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 403 , __ ( 'The term name cannot be empty.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
}
2015-09-26 07:31:25 +02:00
if ( ! empty ( $content_struct [ 'parent' ] ) ) {
2017-12-01 00:11:00 +01:00
if ( ! $taxonomy [ 'hierarchical' ] ) {
2017-09-23 00:08:46 +02:00
return new IXR_Error ( 403 , __ ( 'Cannot set parent term, taxonomy is not hierarchical.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$parent_term_id = ( int ) $content_struct [ 'parent' ];
2017-12-01 00:11:00 +01:00
$parent_term = get_term ( $parent_term_id , $taxonomy [ 'name' ] );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $parent_term ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $parent_term -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $parent_term ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 403 , __ ( 'Parent term does not exist.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$term_data [ 'parent' ] = $content_struct [ 'parent' ];
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'description' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$term_data [ 'description' ] = $content_struct [ 'description' ];
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'slug' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$term_data [ 'slug' ] = $content_struct [ 'slug' ];
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
$term = wp_update_term ( $term_id , $taxonomy [ 'name' ], $term_data );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $term ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $term -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $term ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, editing the term failed.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-06-18 12:40:46 +02:00
// Update term meta.
if ( isset ( $content_struct [ 'custom_fields' ] ) ) {
$this -> set_term_custom_fields ( $term_id , $content_struct [ 'custom_fields' ] );
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return true ;
}
/**
* Delete a term .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see wp_delete_term ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-25 08:25:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type string $taxnomy_name Taxonomy name .
* @ type int $term_id Term ID .
2015-05-22 21:37:24 +02:00
* }
2015-05-25 08:25:25 +02:00
* @ return bool | IXR_Error True on success , IXR_Error instance on failure .
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_deleteTerm ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 5 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$taxonomy = $args [ 3 ];
$term_id = ( int ) $args [ 4 ];
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
do_action ( 'xmlrpc_call' , 'wp.deleteTerm' );
2017-12-01 00:11:00 +01:00
if ( ! taxonomy_exists ( $taxonomy ) ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid taxonomy.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2012-04-15 18:47:31 +02:00
$taxonomy = get_taxonomy ( $taxonomy );
2017-12-01 00:11:00 +01:00
$term = get_term ( $term_id , $taxonomy -> name );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $term ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $term -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $term ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid term ID.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
Taxonomy: Introduce more fine grained capabilities for managing taxonomy terms.
This introduces the singular `edit_term`, `delete_term`, and `assign_term` meta capabilities for terms, and switches the base capability name for tags from `manage_categories` to `manage_post_tags` and the corresponding `edit_post_tags`, `delete_post_tags`, and `assign_post_tags`.
All of these capabilities ultimately map to `manage_categories` so by default there is no change in the behaviour of the capabilities for categories, tags, or custom taxonomies. The `map_meta_cap` filter and the `capabilities` argument when registering a taxonomy now allow for control over editing, deleting, and assigning individual terms, as well as a separation of capabilities for tags from those of categories.
Fixes #35614
Props johnjamesjacoby for feedback
Built from https://develop.svn.wordpress.org/trunk@38698
git-svn-id: http://core.svn.wordpress.org/trunk@38641 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-01 00:40:28 +02:00
if ( ! current_user_can ( 'delete_term' , $term_id ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to delete this term.' ) );
}
2012-04-15 18:47:31 +02:00
$result = wp_delete_term ( $term_id , $taxonomy -> name );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $result ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $term -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $result ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, deleting the term failed.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $result ;
}
/**
* Retrieve a term .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see get_term ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-25 08:25:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type string $taxnomy Taxonomy name .
* @ type string $term_id Term ID .
2015-05-22 21:37:24 +02:00
* }
2015-05-25 08:25:25 +02:00
* @ return array | IXR_Error IXR_Error on failure , array on success , containing :
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
* - 'term_id'
* - 'name'
* - 'slug'
* - 'term_group'
* - 'term_taxonomy_id'
* - 'taxonomy'
* - 'description'
* - 'parent'
* - 'count'
*/
2014-05-19 08:09:13 +02:00
public function wp_getTerm ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 5 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$taxonomy = $args [ 3 ];
$term_id = ( int ) $args [ 4 ];
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
do_action ( 'xmlrpc_call' , 'wp.getTerm' );
2017-12-01 00:11:00 +01:00
if ( ! taxonomy_exists ( $taxonomy ) ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid taxonomy.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2012-04-15 18:47:31 +02:00
$taxonomy = get_taxonomy ( $taxonomy );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
$term = get_term ( $term_id , $taxonomy -> name , ARRAY_A );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $term ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $term -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $term ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid term ID.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
Taxonomy: Introduce more fine grained capabilities for managing taxonomy terms.
This introduces the singular `edit_term`, `delete_term`, and `assign_term` meta capabilities for terms, and switches the base capability name for tags from `manage_categories` to `manage_post_tags` and the corresponding `edit_post_tags`, `delete_post_tags`, and `assign_post_tags`.
All of these capabilities ultimately map to `manage_categories` so by default there is no change in the behaviour of the capabilities for categories, tags, or custom taxonomies. The `map_meta_cap` filter and the `capabilities` argument when registering a taxonomy now allow for control over editing, deleting, and assigning individual terms, as well as a separation of capabilities for tags from those of categories.
Fixes #35614
Props johnjamesjacoby for feedback
Built from https://develop.svn.wordpress.org/trunk@38698
git-svn-id: http://core.svn.wordpress.org/trunk@38641 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2016-10-01 00:40:28 +02:00
if ( ! current_user_can ( 'assign_term' , $term_id ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to assign this term.' ) );
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $this -> _prepare_term ( $term );
}
/**
* Retrieve all terms for a taxonomy .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
* The optional $filter parameter modifies the query used to retrieve terms .
* Accepted keys are 'number' , 'offset' , 'orderby' , 'order' , 'hide_empty' , and 'search' .
*
2015-05-25 08:25:25 +02:00
* @ see get_terms ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-25 08:25:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type string $taxnomy Taxonomy name .
* @ type array $filter Optional . Modifies the query used to retrieve posts . Accepts 'number' ,
* 'offset' , 'orderby' , 'order' , 'hide_empty' , and 'search' . Default empty array .
2015-05-22 21:37:24 +02:00
* }
2015-05-25 08:25:25 +02:00
* @ return array | IXR_Error An associative array of terms data on success , IXR_Error instance otherwise .
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getTerms ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$taxonomy = $args [ 3 ];
$filter = isset ( $args [ 4 ] ) ? $args [ 4 ] : array ();
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
do_action ( 'xmlrpc_call' , 'wp.getTerms' );
2017-12-01 00:11:00 +01:00
if ( ! taxonomy_exists ( $taxonomy ) ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid taxonomy.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2012-04-15 18:47:31 +02:00
$taxonomy = get_taxonomy ( $taxonomy );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $taxonomy -> cap -> assign_terms ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2019-08-03 05:35:56 +02:00
$query = array ( 'taxonomy' => $taxonomy -> name );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'number' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$query [ 'number' ] = absint ( $filter [ 'number' ] );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'offset' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$query [ 'offset' ] = absint ( $filter [ 'offset' ] );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
if ( isset ( $filter [ 'orderby' ] ) ) {
$query [ 'orderby' ] = $filter [ 'orderby' ];
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'order' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$query [ 'order' ] = $filter [ 'order' ];
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
}
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'hide_empty' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$query [ 'hide_empty' ] = $filter [ 'hide_empty' ];
2017-12-01 00:11:00 +01:00
} else {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$query [ 'get' ] = 'all' ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'search' ] ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$query [ 'search' ] = $filter [ 'search' ];
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2019-08-03 05:35:56 +02:00
$terms = get_terms ( $query );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $terms ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return new IXR_Error ( 500 , $terms -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$struct = array ();
foreach ( $terms as $term ) {
$struct [] = $this -> _prepare_term ( $term );
}
return $struct ;
}
/**
* Retrieve a taxonomy .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see get_taxonomy ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-25 08:25:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type string $taxnomy Taxonomy name .
* @ type array $fields Optional . Array of taxonomy fields to limit to in the return .
* Accepts 'labels' , 'cap' , 'menu' , and 'object_type' .
* Default empty array .
2015-05-22 21:37:24 +02:00
* }
2015-05-25 08:25:25 +02:00
* @ return array | IXR_Error An array of taxonomy data on success , IXR_Error instance otherwise .
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getTaxonomy ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$taxonomy = $args [ 3 ];
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 4 ] ) ) {
2012-04-28 20:48:10 +02:00
$fields = $args [ 4 ];
2014-03-26 06:44:16 +01:00
} else {
/**
2016-05-22 20:15:28 +02:00
* Filters the taxonomy query fields used by the given XML - RPC method .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
* @ param array $fields An array of taxonomy fields to retrieve .
* @ param string $method The method name .
*/
2012-05-02 22:29:34 +02:00
$fields = apply_filters ( 'xmlrpc_default_taxonomy_fields' , array ( 'labels' , 'cap' , 'object_type' ), 'wp.getTaxonomy' );
2014-03-26 06:44:16 +01:00
}
2012-04-28 20:48:10 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
do_action ( 'xmlrpc_call' , 'wp.getTaxonomy' );
2017-12-01 00:11:00 +01:00
if ( ! taxonomy_exists ( $taxonomy ) ) {
2016-07-17 18:15:34 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid taxonomy.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2012-04-15 18:47:31 +02:00
$taxonomy = get_taxonomy ( $taxonomy );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $taxonomy -> cap -> assign_terms ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) );
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2012-04-28 20:48:10 +02:00
return $this -> _prepare_taxonomy ( $taxonomy , $fields );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
}
/**
* Retrieve all taxonomies .
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see get_taxonomies ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
2015-05-25 08:25:25 +02:00
* @ type int $blog_id Blog ID ( unused ) .
* @ type string $username Username .
* @ type string $password Password .
* @ type array $filter Optional . An array of arguments for retrieving taxonomies .
* @ type array $fields Optional . The subset of taxonomy fields to return .
2015-05-22 21:37:24 +02:00
* }
2015-05-25 08:25:25 +02:00
* @ return array | IXR_Error An associative array of taxonomy data with returned fields determined
* by `$fields` , or an IXR_Error instance on failure .
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getTaxonomies ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 3 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$filter = isset ( $args [ 3 ] ) ? $args [ 3 ] : array ( 'public' => true );
2012-04-28 20:48:10 +02:00
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 4 ] ) ) {
2012-04-28 20:48:10 +02:00
$fields = $args [ 4 ];
2014-03-26 06:44:16 +01:00
} else {
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-05-02 22:29:34 +02:00
$fields = apply_filters ( 'xmlrpc_default_taxonomy_fields' , array ( 'labels' , 'cap' , 'object_type' ), 'wp.getTaxonomies' );
2014-03-26 06:44:16 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
do_action ( 'xmlrpc_call' , 'wp.getTaxonomies' );
2012-04-28 20:48:10 +02:00
$taxonomies = get_taxonomies ( $filter , 'objects' );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2020-01-29 01:45:18 +01:00
// Holds all the taxonomy data.
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
$struct = array ();
foreach ( $taxonomies as $taxonomy ) {
2020-01-29 01:45:18 +01:00
// Capability check for post types.
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $taxonomy -> cap -> assign_terms ) ) {
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
continue ;
2017-12-01 00:11:00 +01:00
}
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
2012-04-28 20:48:10 +02:00
$struct [] = $this -> _prepare_taxonomy ( $taxonomy , $fields );
XML-RPC: Initial implementation of Taxonomy and Term APIs.
Implements: wp.newTerm, wp.editTerm, wp.deleteTerm, wp.getTerm, wp.getTerms, wp.getTaxonomy and wp.getTaxonomies
See: #18438, #18439, #18440, #18441, #18442, #18443, and #18444 props maxcutler, markoheijnen and nprasath002.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20137 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-03-07 18:02:22 +01:00
}
return $struct ;
}
2012-09-12 02:04:21 +02:00
/**
* Retrieve a user .
*
* The optional $fields parameter specifies what fields will be included
* in the response array . This should be a list of field names . 'user_id' will
* always be included in the response regardless of the value of $fields .
*
* Instead of , or in addition to , individual field names , conceptual group
* names can be used to specify multiple fields . The available conceptual
* groups are 'basic' and 'all' .
*
* @ uses get_userdata ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $user_id
* @ type array $fields ( optional )
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error Array contains ( based on $fields parameter ) :
2012-09-12 02:04:21 +02:00
* - 'user_id'
* - 'username'
* - 'first_name'
* - 'last_name'
* - 'registered'
* - 'bio'
* - 'email'
* - 'nickname'
* - 'nicename'
* - 'url'
* - 'display_name'
* - 'roles'
*/
2014-05-19 08:09:13 +02:00
public function wp_getUser ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-09-12 02:04:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$user_id = ( int ) $args [ 3 ];
2012-09-12 02:04:21 +02:00
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 4 ] ) ) {
2012-09-12 02:04:21 +02:00
$fields = $args [ 4 ];
2014-03-26 06:44:16 +01:00
} else {
/**
2016-05-22 20:15:28 +02:00
* Filters the default user query fields used by the given XML - RPC method .
2014-03-26 06:44:16 +01:00
*
* @ since 3.5 . 0
*
* @ param array $fields User query fields for given method . Default 'all' .
* @ param string $method The method name .
*/
2012-09-12 02:04:21 +02:00
$fields = apply_filters ( 'xmlrpc_default_user_fields' , array ( 'all' ), 'wp.getUser' );
2014-03-26 06:44:16 +01:00
}
2012-09-12 02:04:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2012-09-12 02:04:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-09-12 02:04:21 +02:00
do_action ( 'xmlrpc_call' , 'wp.getUser' );
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_user' , $user_id ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this user.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
$user_data = get_userdata ( $user_id );
2017-12-01 00:11:00 +01:00
if ( ! $user_data ) {
2015-05-09 23:09:25 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid user ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
return $this -> _prepare_user ( $user_data , $fields );
}
/**
* Retrieve users .
*
* The optional $filter parameter modifies the query used to retrieve users .
* Accepted keys are 'number' ( default : 50 ), 'offset' ( default : 0 ), 'role' ,
* 'who' , 'orderby' , and 'order' .
*
* The optional $fields parameter specifies what fields will be included
* in the response array .
*
* @ uses get_users ()
* @ see wp_getUser () for more on $fields and return values
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $filter ( optional )
* @ type array $fields ( optional )
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error users data
2012-09-12 02:04:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getUsers ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 3 ) ) {
2012-09-12 02:04:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$filter = isset ( $args [ 3 ] ) ? $args [ 3 ] : array ();
2012-09-12 02:04:21 +02:00
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 4 ] ) ) {
2012-09-12 02:04:21 +02:00
$fields = $args [ 4 ];
2014-03-26 06:44:16 +01:00
} else {
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-09-12 02:04:21 +02:00
$fields = apply_filters ( 'xmlrpc_default_user_fields' , array ( 'all' ), 'wp.getUsers' );
2014-03-26 06:44:16 +01:00
}
2012-09-12 02:04:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2012-09-12 02:04:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-09-12 02:04:21 +02:00
do_action ( 'xmlrpc_call' , 'wp.getUsers' );
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'list_users' ) ) {
2016-11-19 03:16:30 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to list users.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2012-10-08 01:33:35 +02:00
$query = array ( 'fields' => 'all_with_meta' );
2012-09-12 02:04:21 +02:00
$query [ 'number' ] = ( isset ( $filter [ 'number' ] ) ) ? absint ( $filter [ 'number' ] ) : 50 ;
$query [ 'offset' ] = ( isset ( $filter [ 'offset' ] ) ) ? absint ( $filter [ 'offset' ] ) : 0 ;
if ( isset ( $filter [ 'orderby' ] ) ) {
$query [ 'orderby' ] = $filter [ 'orderby' ];
2017-12-01 00:11:00 +01:00
if ( isset ( $filter [ 'order' ] ) ) {
2012-09-12 02:04:21 +02:00
$query [ 'order' ] = $filter [ 'order' ];
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
}
if ( isset ( $filter [ 'role' ] ) ) {
2017-12-01 00:11:00 +01:00
if ( get_role ( $filter [ 'role' ] ) === null ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid role.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
$query [ 'role' ] = $filter [ 'role' ];
}
if ( isset ( $filter [ 'who' ] ) ) {
$query [ 'who' ] = $filter [ 'who' ];
}
$users = get_users ( $query );
$_users = array ();
foreach ( $users as $user_data ) {
2017-12-01 00:11:00 +01:00
if ( current_user_can ( 'edit_user' , $user_data -> ID ) ) {
2012-09-12 02:04:21 +02:00
$_users [] = $this -> _prepare_user ( $user_data , $fields );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
}
return $_users ;
}
/**
* Retrieve information about the requesting user .
*
* @ uses get_userdata ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $fields ( optional )
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error ( @ see wp_getUser )
2012-09-12 02:04:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getProfile ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 3 ) ) {
2012-09-12 02:04:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2012-09-12 02:04:21 +02:00
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 3 ] ) ) {
2012-09-12 02:04:21 +02:00
$fields = $args [ 3 ];
2014-03-26 06:44:16 +01:00
} else {
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-09-12 02:04:21 +02:00
$fields = apply_filters ( 'xmlrpc_default_user_fields' , array ( 'all' ), 'wp.getProfile' );
2014-03-26 06:44:16 +01:00
}
2012-09-12 02:04:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2012-09-12 02:04:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-09-12 02:04:21 +02:00
do_action ( 'xmlrpc_call' , 'wp.getProfile' );
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_user' , $user -> ID ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit your profile.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
$user_data = get_userdata ( $user -> ID );
return $this -> _prepare_user ( $user_data , $fields );
}
/**
* Edit user ' s profile .
*
* @ uses wp_update_user ()
2015-05-22 21:37:24 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $content_struct It can optionally contain :
2012-09-12 02:04:21 +02:00
* - 'first_name'
* - 'last_name'
* - 'website'
* - 'display_name'
* - 'nickname'
* - 'nicename'
* - 'bio'
2015-05-22 21:37:24 +02:00
* }
* @ return true | IXR_Error True , on success .
2012-09-12 02:04:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_editProfile ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-09-12 02:04:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2012-09-12 02:04:21 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$content_struct = $args [ 3 ];
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2012-09-12 02:04:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-09-12 02:04:21 +02:00
do_action ( 'xmlrpc_call' , 'wp.editProfile' );
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_user' , $user -> ID ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit your profile.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2020-01-29 01:45:18 +01:00
// Holds data of the user.
2017-12-01 00:11:00 +01:00
$user_data = array ();
2012-09-12 02:04:21 +02:00
$user_data [ 'ID' ] = $user -> ID ;
2020-01-29 01:45:18 +01:00
// Only set the user details if they were given.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'first_name' ] ) ) {
2012-09-12 02:04:21 +02:00
$user_data [ 'first_name' ] = $content_struct [ 'first_name' ];
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'last_name' ] ) ) {
2012-09-12 02:04:21 +02:00
$user_data [ 'last_name' ] = $content_struct [ 'last_name' ];
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'url' ] ) ) {
2012-09-23 21:36:17 +02:00
$user_data [ 'user_url' ] = $content_struct [ 'url' ];
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'display_name' ] ) ) {
2012-09-12 02:04:21 +02:00
$user_data [ 'display_name' ] = $content_struct [ 'display_name' ];
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'nickname' ] ) ) {
2012-09-12 02:04:21 +02:00
$user_data [ 'nickname' ] = $content_struct [ 'nickname' ];
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'nicename' ] ) ) {
2012-09-12 02:04:21 +02:00
$user_data [ 'user_nicename' ] = $content_struct [ 'nicename' ];
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'bio' ] ) ) {
2012-09-12 02:04:21 +02:00
$user_data [ 'description' ] = $content_struct [ 'bio' ];
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
$result = wp_update_user ( $user_data );
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $result ) ) {
2012-09-12 02:04:21 +02:00
return new IXR_Error ( 500 , $result -> get_error_message () );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $result ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the user could not be updated.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-12 02:04:21 +02:00
return true ;
}
2010-09-23 23:22:21 +02:00
/**
* Retrieve page .
*
* @ since 2.2 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type int $page_id
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_getPage ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$page_id = ( int ) $args [ 1 ];
$username = $args [ 2 ];
$password = $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
}
2017-12-01 00:11:00 +01:00
$page = get_post ( $page_id );
if ( ! $page ) {
2012-04-30 02:19:32 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-04-30 02:19:32 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_page' , $page_id ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this page.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getPage' );
2010-09-23 23:22:21 +02:00
// If we found the page then format the data.
2020-02-09 17:55:09 +01:00
if ( $page -> ID && ( 'page' === $page -> post_type ) ) {
2012-05-16 20:06:34 +02:00
return $this -> _prepare_page ( $page );
2019-01-11 07:40:50 +01:00
} else {
2020-01-29 01:45:18 +01:00
// If the page doesn't exist, indicate that.
2014-05-30 21:22:13 +02:00
return new IXR_Error ( 404 , __ ( 'Sorry, no such page.' ) );
2010-09-23 23:22:21 +02:00
}
}
/**
* Retrieve Pages .
*
* @ since 2.2 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $num_pages
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_getPages ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2017-12-01 00:11:00 +01:00
$num_pages = isset ( $args [ 3 ] ) ? ( int ) $args [ 3 ] : 10 ;
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_pages' ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit pages.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getPages' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$pages = get_posts (
array (
'post_type' => 'page' ,
'post_status' => 'any' ,
'numberposts' => $num_pages ,
)
);
$num_pages = count ( $pages );
2010-09-23 23:22:21 +02:00
// If we have pages, put together their info.
if ( $num_pages >= 1 ) {
$pages_struct = array ();
2017-12-01 00:11:00 +01:00
foreach ( $pages as $page ) {
if ( current_user_can ( 'edit_page' , $page -> ID ) ) {
2012-05-16 20:06:34 +02:00
$pages_struct [] = $this -> _prepare_page ( $page );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
}
2014-11-03 04:04:22 +01:00
return $pages_struct ;
2010-09-23 23:22:21 +02:00
}
2014-11-03 04:04:22 +01:00
return array ();
2010-09-23 23:22:21 +02:00
}
/**
* Create new page .
*
* @ since 2.2 . 0
*
2015-05-25 08:25:25 +02:00
* @ see wp_xmlrpc_server :: mw_newPost ()
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $content_struct
* }
2014-11-03 04:04:22 +01:00
* @ return int | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_newPage ( $args ) {
2020-01-29 01:45:18 +01:00
// Items not escaped here will be escaped in wp_newPost().
2015-05-22 21:37:24 +02:00
$username = $this -> escape ( $args [ 1 ] );
$password = $this -> escape ( $args [ 2 ] );
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.newPage' );
2010-09-23 23:22:21 +02:00
// Mark this as content for a page.
2017-12-01 00:11:00 +01:00
$args [ 3 ][ 'post_type' ] = 'page' ;
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Let mw_newPost() do all of the heavy lifting.
2014-11-03 04:04:22 +01:00
return $this -> mw_newPost ( $args );
2010-09-23 23:22:21 +02:00
}
/**
* Delete page .
*
* @ since 2.2 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $page_id
* }
* @ return true | IXR_Error True , if success .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_deletePage ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$page_id = ( int ) $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.deletePage' );
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Get the current page based on the 'page_id' and
2010-09-23 23:22:21 +02:00
// make sure it is a page and not a post.
2017-12-01 00:11:00 +01:00
$actual_page = get_post ( $page_id , ARRAY_A );
2020-02-09 17:55:09 +01:00
if ( ! $actual_page || ( 'page' !== $actual_page [ 'post_type' ] ) ) {
2014-11-03 04:04:22 +01:00
return new IXR_Error ( 404 , __ ( 'Sorry, no such page.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
// Make sure the user can delete pages.
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'delete_page' , $page_id ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to delete this page.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
// Attempt to delete the page.
2017-12-01 00:11:00 +01:00
$result = wp_delete_post ( $page_id );
if ( ! $result ) {
2014-11-03 04:04:22 +01:00
return new IXR_Error ( 500 , __ ( 'Failed to delete the page.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/**
* Fires after a page has been successfully deleted via XML - RPC .
*
* @ since 3.4 . 0
*
* @ param int $page_id ID of the deleted page .
* @ param array $args An array of arguments to delete the page .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_wp_deletePage' , $page_id , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:16:26 +01:00
2014-11-03 04:04:22 +01:00
return true ;
2010-09-23 23:22:21 +02:00
}
/**
* Edit page .
*
* @ since 2.2 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type int $page_id
* @ type string $username
* @ type string $password
* @ type string $content
* @ type string $publish
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_editPage ( $args ) {
2020-01-29 01:45:18 +01:00
// Items will be escaped in mw_editPost().
2015-06-29 04:07:23 +02:00
$page_id = ( int ) $args [ 1 ];
$username = $args [ 2 ];
$password = $args [ 3 ];
2015-05-22 21:37:24 +02:00
$content = $args [ 4 ];
$publish = $args [ 5 ];
2010-09-23 23:22:21 +02:00
2015-06-29 04:07:23 +02:00
$escaped_username = $this -> escape ( $username );
$escaped_password = $this -> escape ( $password );
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $escaped_username , $escaped_password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2015-06-29 04:07:23 +02:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.editPage' );
2010-09-23 23:22:21 +02:00
// Get the page data and make sure it is a page.
2017-12-01 00:11:00 +01:00
$actual_page = get_post ( $page_id , ARRAY_A );
2020-02-09 17:55:09 +01:00
if ( ! $actual_page || ( 'page' !== $actual_page [ 'post_type' ] ) ) {
2014-11-03 04:04:22 +01:00
return new IXR_Error ( 404 , __ ( 'Sorry, no such page.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
// Make sure the user is allowed to edit pages.
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_page' , $page_id ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this page.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
// Mark this as content for a page.
2011-05-06 21:51:47 +02:00
$content [ 'post_type' ] = 'page' ;
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Arrange args in the way mw_editPost() understands.
2010-09-23 23:22:21 +02:00
$args = array (
$page_id ,
$username ,
$password ,
$content ,
2017-12-01 00:11:00 +01:00
$publish ,
2010-09-23 23:22:21 +02:00
);
2020-01-29 01:45:18 +01:00
// Let mw_editPost() do all of the heavy lifting.
2014-11-03 04:04:22 +01:00
return $this -> mw_editPost ( $args );
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve page list .
*
* @ since 2.2 . 0
*
2016-10-10 08:38:31 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_getPageList ( $args ) {
2016-10-10 08:38:31 +02:00
global $wpdb ;
2015-05-22 21:37:24 +02:00
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_pages' ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit pages.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getPageList' );
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Get list of page IDs and titles.
2017-12-01 00:11:00 +01:00
$page_list = $wpdb -> get_results (
"
2010-09-23 23:22:21 +02:00
SELECT ID page_id ,
post_title page_title ,
post_parent page_parent_id ,
post_date_gmt ,
post_date ,
post_status
2016-10-10 08:38:31 +02:00
FROM { $wpdb -> posts }
2010-09-23 23:22:21 +02:00
WHERE post_type = 'page'
ORDER BY ID
2017-12-01 00:11:00 +01:00
"
);
2010-09-23 23:22:21 +02:00
2011-09-03 18:02:41 +02:00
// The date needs to be formatted properly.
2017-12-01 00:11:00 +01:00
$num_pages = count ( $page_list );
2010-09-23 23:22:21 +02:00
for ( $i = 0 ; $i < $num_pages ; $i ++ ) {
2017-12-01 00:11:00 +01:00
$page_list [ $i ] -> dateCreated = $this -> _convert_date ( $page_list [ $i ] -> post_date );
$page_list [ $i ] -> date_created_gmt = $this -> _convert_date_gmt ( $page_list [ $i ] -> post_date_gmt , $page_list [ $i ] -> post_date );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
unset ( $page_list [ $i ] -> post_date_gmt );
unset ( $page_list [ $i ] -> post_date );
unset ( $page_list [ $i ] -> post_status );
2010-09-23 23:22:21 +02:00
}
2014-11-03 04:04:22 +01:00
return $page_list ;
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve authors list .
*
* @ since 2.2 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_getAuthors ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit posts.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getAuthors' );
2010-09-23 23:22:21 +02:00
$authors = array ();
2017-12-01 00:11:00 +01:00
foreach ( get_users ( array ( 'fields' => array ( 'ID' , 'user_login' , 'display_name' ) ) ) as $user ) {
2010-09-23 23:22:21 +02:00
$authors [] = array (
2017-12-01 00:11:00 +01:00
'user_id' => $user -> ID ,
'user_login' => $user -> user_login ,
'display_name' => $user -> display_name ,
2010-09-23 23:22:21 +02:00
);
}
return $authors ;
}
/**
* Get list of all tags
*
2012-04-28 20:48:10 +02:00
* @ since 2.7 . 0
2010-09-23 23:22:21 +02:00
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getTags ( $args ) {
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2010-09-23 23:22:21 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you must be able to edit posts on this site in order to view tags.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2010-09-23 23:22:21 +02:00
do_action ( 'xmlrpc_call' , 'wp.getKeywords' );
2012-03-02 19:06:30 +01:00
$tags = array ();
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$all_tags = get_tags ();
if ( $all_tags ) {
2015-08-25 22:28:22 +02:00
foreach ( ( array ) $all_tags as $tag ) {
2017-12-01 00:11:00 +01:00
$struct = array ();
$struct [ 'tag_id' ] = $tag -> term_id ;
$struct [ 'name' ] = $tag -> name ;
$struct [ 'count' ] = $tag -> count ;
$struct [ 'slug' ] = $tag -> slug ;
$struct [ 'html_url' ] = esc_html ( get_tag_link ( $tag -> term_id ) );
$struct [ 'rss_url' ] = esc_html ( get_tag_feed_link ( $tag -> term_id ) );
2010-09-23 23:22:21 +02:00
$tags [] = $struct ;
}
}
return $tags ;
}
/**
* Create new category .
*
* @ since 2.2 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $category
* }
2014-11-03 04:04:22 +01:00
* @ return int | IXR_Error Category ID .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_newCategory ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$category = $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.newCategory' );
2010-09-23 23:22:21 +02:00
// Make sure the user is allowed to add a category.
2017-10-18 23:12:51 +02:00
if ( ! current_user_can ( 'manage_categories' ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to add a category.' ) );
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// If no slug was provided, make it empty
// so that WordPress will generate one.
2017-12-01 00:11:00 +01:00
if ( empty ( $category [ 'slug' ] ) ) {
2011-05-06 21:51:47 +02:00
$category [ 'slug' ] = '' ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// If no parent_id was provided, make it empty
// so that it will be a top-level page (no parent).
2017-12-01 00:11:00 +01:00
if ( ! isset ( $category [ 'parent_id' ] ) ) {
2011-05-06 21:51:47 +02:00
$category [ 'parent_id' ] = '' ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// If no description was provided, make it empty.
2017-12-01 00:11:00 +01:00
if ( empty ( $category [ 'description' ] ) ) {
$category [ 'description' ] = '' ;
}
2010-09-23 23:22:21 +02:00
$new_category = array (
2017-12-01 00:11:00 +01:00
'cat_name' => $category [ 'name' ],
'category_nicename' => $category [ 'slug' ],
'category_parent' => $category [ 'parent_id' ],
'category_description' => $category [ 'description' ],
2010-09-23 23:22:21 +02:00
);
2017-12-01 00:11:00 +01:00
$cat_id = wp_insert_category ( $new_category , true );
2010-09-23 23:22:21 +02:00
if ( is_wp_error ( $cat_id ) ) {
2017-12-01 00:11:00 +01:00
if ( 'term_exists' == $cat_id -> get_error_code () ) {
2010-09-23 23:22:21 +02:00
return ( int ) $cat_id -> get_error_data ();
2017-12-01 00:11:00 +01:00
} else {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the category could not be created.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
} elseif ( ! $cat_id ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the category could not be created.' ) );
2010-09-23 23:22:21 +02:00
}
2014-03-26 06:44:16 +01:00
/**
* Fires after a new category has been successfully created via XML - RPC .
*
* @ since 3.4 . 0
*
* @ param int $cat_id ID of the new category .
* @ param array $args An array of new category arguments .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_wp_newCategory' , $cat_id , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:12:06 +01:00
return $cat_id ;
2010-09-23 23:22:21 +02:00
}
/**
* Remove category .
*
* @ since 2.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $category_id
* }
2016-05-22 19:39:28 +02:00
* @ return bool | IXR_Error See wp_delete_term () for return info .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_deleteCategory ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$category_id = ( int ) $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.deleteCategory' );
2010-09-23 23:22:21 +02:00
2017-10-18 23:12:51 +02:00
if ( ! current_user_can ( 'delete_term' , $category_id ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to delete this category.' ) );
}
2010-09-23 23:22:21 +02:00
2012-03-08 14:12:06 +01:00
$status = wp_delete_term ( $category_id , 'category' );
2014-03-26 06:44:16 +01:00
if ( true == $status ) {
/**
* Fires after a category has been successfully deleted via XML - RPC .
*
* @ since 3.4 . 0
*
* @ param int $category_id ID of the deleted category .
* @ param array $args An array of arguments to delete the category .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_wp_deleteCategory' , $category_id , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2014-03-26 06:44:16 +01:00
}
2012-03-08 14:12:06 +01:00
return $status ;
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve category list .
*
* @ since 2.2 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $category
* @ type int $max_results
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_suggestCategories ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$category = $args [ 3 ];
$max_results = ( int ) $args [ 4 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2015-04-20 17:27:25 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.suggestCategories' );
2010-09-23 23:22:21 +02:00
$category_suggestions = array ();
2017-12-01 00:11:00 +01:00
$args = array (
'get' => 'all' ,
'number' => $max_results ,
'name__like' => $category ,
);
foreach ( ( array ) get_categories ( $args ) as $cat ) {
2010-09-23 23:22:21 +02:00
$category_suggestions [] = array (
2017-12-01 00:11:00 +01:00
'category_id' => $cat -> term_id ,
'category_name' => $cat -> name ,
2010-09-23 23:22:21 +02:00
);
}
2014-11-03 04:04:22 +01:00
return $category_suggestions ;
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve comment .
*
* @ since 2.7 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $comment_id
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2017-12-01 00:11:00 +01:00
public function wp_getComment ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$comment_id = ( int ) $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2015-09-26 04:49:27 +02:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getComment' );
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$comment = get_comment ( $comment_id );
if ( ! $comment ) {
2010-09-23 23:22:21 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid comment ID.' ) );
2015-09-26 04:49:27 +02:00
}
if ( ! current_user_can ( 'edit_comment' , $comment_id ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
2015-09-26 04:49:27 +02:00
}
2010-09-23 23:22:21 +02:00
2012-05-23 22:40:40 +02:00
return $this -> _prepare_comment ( $comment );
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve comments .
*
2014-11-01 02:44:23 +01:00
* Besides the common blog_id ( unused ), username , and password arguments , it takes a filter
2011-04-18 09:26:42 +02:00
* array as last argument .
*
* Accepted 'filter' keys are 'status' , 'post_id' , 'offset' , and 'number' .
*
* The defaults are as follows :
* - '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 .
2016-05-22 19:39:28 +02:00
* - 'offset' - Default is 0. See WP_Query :: query () for more .
2011-06-11 01:01:45 +02:00
*
2010-09-23 23:22:21 +02:00
* @ since 2.7 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $struct
* }
2016-05-22 19:39:28 +02:00
* @ return array | IXR_Error Contains a collection of comments . See wp_xmlrpc_server :: wp_getComment () for a description of each item contents
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_getComments ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2017-12-01 00:11:00 +01:00
$struct = isset ( $args [ 3 ] ) ? $args [ 3 ] : array ();
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2015-09-26 06:45:25 +02:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getComments' );
2010-09-23 23:22:21 +02:00
2015-09-26 06:45:25 +02:00
if ( isset ( $struct [ 'status' ] ) ) {
2010-09-23 23:22:21 +02:00
$status = $struct [ 'status' ];
2015-09-26 06:45:25 +02:00
} else {
2010-09-23 23:22:21 +02:00
$status = '' ;
2015-09-26 06:45:25 +02:00
}
2010-09-23 23:22:21 +02:00
2015-09-26 04:49:27 +02:00
if ( ! current_user_can ( 'moderate_comments' ) && 'approve' !== $status ) {
return new IXR_Error ( 401 , __ ( 'Invalid comment status.' ) );
}
2010-09-23 23:22:21 +02:00
$post_id = '' ;
2015-09-26 06:45:25 +02:00
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' ];
}
2010-09-23 23:22:21 +02:00
$offset = 0 ;
2015-09-26 06:45:25 +02:00
if ( isset ( $struct [ 'offset' ] ) ) {
$offset = absint ( $struct [ 'offset' ] );
}
2010-09-23 23:22:21 +02:00
$number = 10 ;
2015-09-26 06:45:25 +02:00
if ( isset ( $struct [ 'number' ] ) ) {
$number = absint ( $struct [ 'number' ] );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$comments = get_comments (
array (
'status' => $status ,
'post_id' => $post_id ,
'offset' => $offset ,
'number' => $number ,
'post_type' => $post_type ,
)
);
2010-09-23 23:22:21 +02:00
$comments_struct = array ();
2015-05-25 19:59:25 +02:00
if ( is_array ( $comments ) ) {
foreach ( $comments as $comment ) {
$comments_struct [] = $this -> _prepare_comment ( $comment );
}
2010-09-23 23:22:21 +02:00
}
return $comments_struct ;
}
/**
2011-04-18 09:26:42 +02:00
* Delete a comment .
*
2020-02-10 05:12:07 +01:00
* By default , the comment will be moved to the Trash instead of deleted .
2016-05-22 19:39:28 +02:00
* See wp_delete_comment () for more information on this behavior .
2010-09-23 23:22:21 +02:00
*
* @ since 2.7 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $comment_ID
* }
2016-05-22 19:39:28 +02:00
* @ return bool | IXR_Error See wp_delete_comment () .
2010-09-23 23:22:21 +02:00
*/
2015-09-26 04:49:27 +02:00
public function wp_deleteComment ( $args ) {
2017-12-01 00:11:00 +01:00
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$comment_ID = ( int ) $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2015-09-26 04:49:27 +02:00
}
2010-09-23 23:22:21 +02:00
2015-09-26 04:49:27 +02:00
if ( ! get_comment ( $comment_ID ) ) {
2011-08-23 12:22:34 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid comment ID.' ) );
2015-09-26 04:49:27 +02:00
}
2011-08-23 12:22:34 +02:00
2017-10-18 23:12:51 +02:00
if ( ! current_user_can ( 'edit_comment' , $comment_ID ) ) {
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to delete this comment.' ) );
2015-09-26 04:49:27 +02:00
}
2010-12-13 22:21:50 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.deleteComment' );
2010-09-23 23:22:21 +02:00
2012-03-08 14:12:06 +01:00
$status = wp_delete_comment ( $comment_ID );
2015-06-12 19:48:26 +02:00
if ( $status ) {
2014-03-26 06:44:16 +01:00
/**
* Fires after a comment has been successfully deleted via XML - RPC .
*
* @ since 3.4 . 0
*
* @ param int $comment_ID ID of the deleted comment .
* @ param array $args An array of arguments to delete the comment .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_wp_deleteComment' , $comment_ID , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2014-03-26 06:44:16 +01:00
}
2012-03-08 14:12:06 +01:00
return $status ;
2010-09-23 23:22:21 +02:00
}
/**
* Edit comment .
*
2014-11-01 02:44:23 +01:00
* Besides the common blog_id ( unused ), username , and password arguments , it takes a
2011-04-18 09:26:42 +02:00
* comment_id integer and a content_struct array as last argument .
*
* The allowed keys in the content_struct array are :
* - 'author'
* - 'author_url'
* - 'author_email'
* - 'content'
* - 'date_created_gmt'
2015-05-25 08:25:25 +02:00
* - 'status' . Common statuses are 'approve' , 'hold' , 'spam' . See get_comment_statuses () for more details
2011-04-18 09:26:42 +02:00
*
2010-09-23 23:22:21 +02:00
* @ since 2.7 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $comment_ID
* @ type array $content_struct
* }
* @ return true | IXR_Error True , on success .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_editComment ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$comment_ID = ( int ) $args [ 3 ];
2010-09-23 23:22:21 +02:00
$content_struct = $args [ 4 ];
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2015-09-26 04:49:27 +02:00
}
2010-09-23 23:22:21 +02:00
2015-09-26 04:49:27 +02:00
if ( ! get_comment ( $comment_ID ) ) {
2011-08-23 12:22:34 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid comment ID.' ) );
2015-09-26 04:49:27 +02:00
}
2011-08-23 12:22:34 +02:00
2015-09-26 04:49:27 +02:00
if ( ! current_user_can ( 'edit_comment' , $comment_ID ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to moderate or edit this comment.' ) );
2015-09-26 04:49:27 +02:00
}
2010-12-13 22:21:50 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.editComment' );
2018-12-14 06:13:52 +01:00
$comment = array (
'comment_ID' => $comment_ID ,
);
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'status' ] ) ) {
2010-09-23 23:22:21 +02:00
$statuses = get_comment_statuses ();
2017-12-01 00:11:00 +01:00
$statuses = array_keys ( $statuses );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! in_array ( $content_struct [ 'status' ], $statuses ) ) {
2010-09-23 23:22:21 +02:00
return new IXR_Error ( 401 , __ ( 'Invalid comment status.' ) );
2017-12-01 00:11:00 +01:00
}
2018-12-14 06:13:52 +01:00
$comment [ 'comment_approved' ] = $content_struct [ 'status' ];
2010-09-23 23:22:21 +02:00
}
2020-01-29 01:45:18 +01:00
// Do some timestamp voodoo.
2017-12-01 00:11:00 +01:00
if ( ! empty ( $content_struct [ 'date_created_gmt' ] ) ) {
2020-01-29 01:45:18 +01:00
// We know this is supposed to be GMT, so we're going to slap that Z on there by force.
2018-12-14 06:13:52 +01:00
$dateCreated = rtrim ( $content_struct [ 'date_created_gmt' ] -> getIso (), 'Z' ) . 'Z' ;
2019-12-09 20:56:05 +01:00
$comment [ 'comment_date' ] = get_date_from_gmt ( $dateCreated );
$comment [ 'comment_date_gmt' ] = iso8601_to_datetime ( $dateCreated , 'gmt' );
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'content' ] ) ) {
2018-12-14 06:13:52 +01:00
$comment [ 'comment_content' ] = $content_struct [ 'content' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'author' ] ) ) {
2018-12-14 06:13:52 +01:00
$comment [ 'comment_author' ] = $content_struct [ 'author' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'author_url' ] ) ) {
2018-12-14 06:13:52 +01:00
$comment [ 'comment_author_url' ] = $content_struct [ 'author_url' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'author_email' ] ) ) {
2018-12-14 06:13:52 +01:00
$comment [ 'comment_author_email' ] = $content_struct [ 'author_email' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$result = wp_update_comment ( $comment );
if ( is_wp_error ( $result ) ) {
return new IXR_Error ( 500 , $result -> get_error_message () );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $result ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the comment could not be updated.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/**
* Fires after a comment has been successfully updated via XML - RPC .
*
* @ since 3.4 . 0
*
* @ param int $comment_ID ID of the updated comment .
* @ param array $args An array of arguments to update the comment .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_wp_editComment' , $comment_ID , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:12:06 +01:00
2010-09-23 23:22:21 +02:00
return true ;
}
/**
* Create new comment .
*
* @ since 2.7 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type string | int $post
* @ type array $content_struct
* }
2016-05-22 19:39:28 +02:00
* @ return int | IXR_Error See wp_new_comment () .
2010-09-23 23:22:21 +02:00
*/
2017-12-01 00:11:00 +01:00
public function wp_newComment ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$post = $args [ 3 ];
2010-09-23 23:22:21 +02:00
$content_struct = $args [ 4 ];
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters whether to allow anonymous comments over XML - RPC .
2014-03-26 06:44:16 +01:00
*
* @ since 2.7 . 0
*
* @ param bool $allow Whether to allow anonymous commenting via XML - RPC .
* Default false .
*/
$allow_anon = apply_filters ( 'xmlrpc_allow_anonymous_comments' , false );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$user = $this -> login ( $username , $password );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
$logged_in = false ;
2017-12-01 00:11:00 +01:00
if ( $allow_anon && get_option ( 'comment_registration' ) ) {
2020-01-21 15:52:06 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, you must be logged in to comment.' ) );
2015-01-08 08:05:25 +01:00
} elseif ( ! $allow_anon ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2015-01-08 08:05:25 +01:00
}
2010-09-23 23:22:21 +02:00
} else {
$logged_in = true ;
}
2017-12-01 00:11:00 +01:00
if ( is_numeric ( $post ) ) {
$post_id = absint ( $post );
} else {
$post_id = url_to_postid ( $post );
}
2010-09-23 23:22:21 +02:00
2015-09-25 22:20:23 +02:00
if ( ! $post_id ) {
2010-09-23 23:22:21 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2015-09-25 22:20:23 +02:00
}
2010-09-23 23:22:21 +02:00
2015-09-25 22:20:23 +02:00
if ( ! get_post ( $post_id ) ) {
2010-09-23 23:22:21 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2015-09-25 22:20:23 +02:00
}
if ( ! comments_open ( $post_id ) ) {
return new IXR_Error ( 403 , __ ( 'Sorry, comments are closed for this item.' ) );
}
2010-09-23 23:22:21 +02:00
2016-10-31 02:27:31 +01:00
if ( empty ( $content_struct [ 'content' ] ) ) {
return new IXR_Error ( 403 , __ ( 'Comment is required.' ) );
}
$comment = array (
'comment_post_ID' => $post_id ,
'comment_content' => $content_struct [ 'content' ],
);
2010-09-23 23:22:21 +02:00
if ( $logged_in ) {
2015-09-25 22:20:23 +02:00
$display_name = $user -> display_name ;
2017-12-01 00:11:00 +01:00
$user_email = $user -> user_email ;
$user_url = $user -> user_url ;
2015-09-25 22:20:23 +02:00
2017-12-01 00:11:00 +01:00
$comment [ 'comment_author' ] = $this -> escape ( $display_name );
2015-09-25 22:20:23 +02:00
$comment [ 'comment_author_email' ] = $this -> escape ( $user_email );
2017-12-01 00:11:00 +01:00
$comment [ 'comment_author_url' ] = $this -> escape ( $user_url );
$comment [ 'user_ID' ] = $user -> ID ;
2010-09-23 23:22:21 +02:00
} else {
$comment [ 'comment_author' ] = '' ;
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'author' ] ) ) {
2010-09-23 23:22:21 +02:00
$comment [ 'comment_author' ] = $content_struct [ 'author' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$comment [ 'comment_author_email' ] = '' ;
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'author_email' ] ) ) {
2010-09-23 23:22:21 +02:00
$comment [ 'comment_author_email' ] = $content_struct [ 'author_email' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$comment [ 'comment_author_url' ] = '' ;
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'author_url' ] ) ) {
2010-09-23 23:22:21 +02:00
$comment [ 'comment_author_url' ] = $content_struct [ 'author_url' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$comment [ 'user_ID' ] = 0 ;
2017-12-01 00:11:00 +01:00
if ( get_option ( 'require_name_email' ) ) {
if ( 6 > strlen ( $comment [ 'comment_author_email' ] ) || '' == $comment [ 'comment_author' ] ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 403 , __ ( 'Comment author name and email are required.' ) );
2017-12-01 00:11:00 +01:00
} elseif ( ! is_email ( $comment [ 'comment_author_email' ] ) ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 403 , __ ( 'A valid email address is required.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
}
}
2017-12-01 00:11:00 +01:00
$comment [ 'comment_parent' ] = isset ( $content_struct [ 'comment_parent' ] ) ? absint ( $content_struct [ 'comment_parent' ] ) : 0 ;
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.newComment' );
2010-09-23 23:22:21 +02:00
2016-10-31 02:27:31 +01:00
$comment_ID = wp_new_comment ( $comment , true );
if ( is_wp_error ( $comment_ID ) ) {
return new IXR_Error ( 403 , $comment_ID -> get_error_message () );
}
if ( ! $comment_ID ) {
2018-02-19 03:13:32 +01:00
return new IXR_Error ( 403 , __ ( 'Something went wrong.' ) );
2016-10-31 02:27:31 +01:00
}
2012-03-08 14:12:06 +01:00
2014-03-26 06:44:16 +01:00
/**
* Fires after a new comment has been successfully created via XML - RPC .
*
* @ since 3.4 . 0
*
* @ param int $comment_ID ID of the new comment .
* @ param array $args An array of new comment arguments .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_wp_newComment' , $comment_ID , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:12:06 +01:00
return $comment_ID ;
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve all of the comment status .
*
* @ since 2.7 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-09-26 04:49:27 +02:00
public function wp_getCommentStatusList ( $args ) {
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2015-09-26 04:49:27 +02:00
}
2010-09-23 23:22:21 +02:00
2015-09-26 04:49:27 +02:00
if ( ! current_user_can ( 'publish_posts' ) ) {
2018-02-28 04:19:31 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to access details about this site.' ) );
2015-09-26 04:49:27 +02:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getCommentStatusList' );
2010-09-23 23:22:21 +02:00
2012-03-02 19:06:30 +01:00
return get_comment_statuses ();
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve comment count .
*
* @ since 2.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $post_id
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getCommentCount ( $args ) {
2015-05-22 21:37:24 +02:00
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$post_id = ( int ) $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2015-09-26 04:49:27 +02:00
}
2010-09-23 23:22:21 +02:00
2015-09-26 04:49:27 +02:00
$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 ) ) {
2018-02-28 04:19:31 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to access details of this post.' ) );
2015-09-26 04:49:27 +02:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getCommentCount' );
2010-09-23 23:22:21 +02:00
$count = wp_count_comments ( $post_id );
2015-09-26 04:49:27 +02:00
2010-09-23 23:22:21 +02:00
return array (
2017-12-01 00:11:00 +01:00
'approved' => $count -> approved ,
2011-05-06 21:51:47 +02:00
'awaiting_moderation' => $count -> moderated ,
2017-12-01 00:11:00 +01:00
'spam' => $count -> spam ,
'total_comments' => $count -> total_comments ,
2010-09-23 23:22:21 +02:00
);
}
/**
* Retrieve post statuses .
*
* @ since 2.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getPostStatusList ( $args ) {
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2018-02-28 04:19:31 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to access details about this site.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getPostStatusList' );
2010-09-23 23:22:21 +02:00
2012-03-02 19:06:30 +01:00
return get_post_statuses ();
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve page statuses .
*
* @ since 2.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getPageStatusList ( $args ) {
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_pages' ) ) {
2018-02-28 04:19:31 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to access details about this site.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getPageStatusList' );
2010-09-23 23:22:21 +02:00
2012-03-02 19:06:30 +01:00
return get_page_statuses ();
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve page templates .
*
* @ since 2.6 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getPageTemplates ( $args ) {
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_pages' ) ) {
2018-02-28 04:19:31 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to access details about this site.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$templates = get_page_templates ();
2010-09-23 23:22:21 +02:00
$templates [ 'Default' ] = 'default' ;
return $templates ;
}
/**
* Retrieve blog options .
*
* @ since 2.6 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $options
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getOptions ( $args ) {
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$options = isset ( $args [ 3 ] ) ? ( array ) $args [ 3 ] : array ();
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// If no specific options where asked for, return all of them.
2017-12-01 00:11:00 +01:00
if ( count ( $options ) == 0 ) {
$options = array_keys ( $this -> blog_options );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
return $this -> _getOptions ( $options );
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve blog options value from list .
*
* @ since 2.6 . 0
*
* @ param array $options Options to retrieve .
* @ return array
*/
2017-12-01 00:11:00 +01:00
public function _getOptions ( $options ) {
$data = array ();
2013-07-09 04:22:57 +02:00
$can_manage = current_user_can ( 'manage_options' );
2010-09-23 23:22:21 +02:00
foreach ( $options as $option ) {
if ( array_key_exists ( $option , $this -> blog_options ) ) {
2017-12-01 00:11:00 +01:00
$data [ $option ] = $this -> blog_options [ $option ];
2020-01-29 01:45:18 +01:00
// Is the value static or dynamic?
2017-12-01 00:11:00 +01:00
if ( isset ( $data [ $option ][ 'option' ] ) ) {
$data [ $option ][ 'value' ] = get_option ( $data [ $option ][ 'option' ] );
unset ( $data [ $option ][ 'option' ] );
2010-09-23 23:22:21 +02:00
}
2013-07-09 04:22:57 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $can_manage ) {
$data [ $option ][ 'readonly' ] = true ;
}
2010-09-23 23:22:21 +02:00
}
}
return $data ;
}
/**
* Update blog options .
*
* @ since 2.6 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $options
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_setOptions ( $args ) {
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$options = ( array ) $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'manage_options' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to update options.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-11-01 20:45:25 +01:00
$option_names = array ();
2010-09-23 23:22:21 +02:00
foreach ( $options as $o_name => $o_value ) {
$option_names [] = $o_name ;
2017-12-01 00:11:00 +01:00
if ( ! array_key_exists ( $o_name , $this -> blog_options ) ) {
2010-09-23 23:22:21 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-02-09 17:55:09 +01:00
if ( true == $this -> blog_options [ $o_name ][ 'readonly' ] ) {
2010-09-23 23:22:21 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
update_option ( $this -> blog_options [ $o_name ][ 'option' ], wp_unslash ( $o_value ) );
2010-09-23 23:22:21 +02:00
}
2020-01-29 01:45:18 +01:00
// Now return the updated values.
2017-12-01 00:11:00 +01:00
return $this -> _getOptions ( $option_names );
2010-09-23 23:22:21 +02:00
}
2010-10-27 19:20:46 +02:00
/**
2010-10-28 14:12:59 +02:00
* Retrieve a media item by ID
2010-10-27 19:20:46 +02:00
*
* @ since 3.1 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $attachment_id
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error Associative array contains :
2010-10-28 14:12:59 +02:00
* - 'date_created_gmt'
* - 'parent'
* - 'link'
* - 'thumbnail'
* - 'title'
* - 'caption'
* - 'description'
* - 'metadata'
2010-10-27 19:20:46 +02:00
*/
2015-05-22 21:37:24 +02:00
public function wp_getMediaItem ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$attachment_id = ( int ) $args [ 3 ];
2010-10-27 19:20:46 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-10-27 19:20:46 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-10-27 19:20:46 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'upload_files' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to upload files.' ) );
2017-12-01 00:11:00 +01:00
}
2010-10-27 19:20:46 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getMediaItem' );
2010-10-27 19:20:46 +02:00
2019-07-03 01:42:58 +02:00
$attachment = get_post ( $attachment_id );
if ( ! $attachment ) {
2010-10-27 19:20:46 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid attachment ID.' ) );
2017-12-01 00:11:00 +01:00
}
2010-10-27 19:20:46 +02:00
2012-04-26 22:56:52 +02:00
return $this -> _prepare_media_item ( $attachment );
2010-10-27 19:20:46 +02:00
}
/**
2010-10-28 14:12:59 +02:00
* Retrieves a collection of media library items ( or attachments )
2010-11-17 19:47:34 +01:00
*
2014-11-01 02:44:23 +01:00
* Besides the common blog_id ( unused ), username , and password arguments , it takes a filter
2010-10-28 14:12:59 +02:00
* array as last argument .
2010-11-17 19:47:34 +01:00
*
2010-10-28 14:12:59 +02:00
* Accepted 'filter' keys are 'parent_id' , 'mime_type' , 'offset' , and 'number' .
2010-11-17 19:47:34 +01:00
*
2010-10-28 14:12:59 +02:00
* The defaults are as follows :
* - 'number' - Default is 5. Total number of media items to retrieve .
2015-05-25 08:25:25 +02:00
* - 'offset' - Default is 0. See WP_Query :: query () for more .
2010-10-28 14:12:59 +02:00
* - 'parent_id' - Default is '' . The post where the media item is attached . Empty string shows all media items . 0 shows unattached media items .
* - 'mime_type' - Default is '' . Filter by mime type ( e . g . , 'image/jpeg' , 'application/pdf' )
2010-11-17 19:47:34 +01:00
*
2010-10-27 19:20:46 +02:00
* @ since 3.1 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $struct
* }
2015-05-25 08:25:25 +02:00
* @ return array | IXR_Error Contains a collection of media items . See wp_xmlrpc_server :: wp_getMediaItem () for a description of each item contents
2010-10-27 19:20:46 +02:00
*/
2017-12-01 00:11:00 +01:00
public function wp_getMediaLibrary ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2017-12-01 00:11:00 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$struct = isset ( $args [ 3 ] ) ? $args [ 3 ] : array ();
2010-10-27 19:20:46 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-10-27 19:20:46 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-10-27 19:20:46 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'upload_files' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to upload files.' ) );
2017-12-01 00:11:00 +01:00
}
2010-10-27 19:20:46 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'wp.getMediaLibrary' );
2010-10-27 19:20:46 +02:00
2017-12-01 00:11:00 +01:00
$parent_id = ( isset ( $struct [ 'parent_id' ] ) ) ? absint ( $struct [ 'parent_id' ] ) : '' ;
$mime_type = ( isset ( $struct [ 'mime_type' ] ) ) ? $struct [ 'mime_type' ] : '' ;
$offset = ( isset ( $struct [ 'offset' ] ) ) ? absint ( $struct [ 'offset' ] ) : 0 ;
$number = ( isset ( $struct [ 'number' ] ) ) ? absint ( $struct [ 'number' ] ) : - 1 ;
$attachments = get_posts (
array (
'post_type' => 'attachment' ,
'post_parent' => $parent_id ,
'offset' => $offset ,
'numberposts' => $number ,
'post_mime_type' => $mime_type ,
)
);
2010-10-27 19:20:46 +02:00
$attachments_struct = array ();
2017-12-01 00:11:00 +01:00
foreach ( $attachments as $attachment ) {
2012-04-26 22:56:52 +02:00
$attachments_struct [] = $this -> _prepare_media_item ( $attachment );
2017-12-01 00:11:00 +01:00
}
2010-10-27 19:20:46 +02:00
return $attachments_struct ;
}
2010-12-13 22:21:50 +01:00
/**
2015-07-23 15:19:27 +02:00
* Retrieves a list of post formats used by the site .
*
* @ since 3.1 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2015-07-23 15:19:27 +02:00
* @ return array | IXR_Error List of post formats , otherwise IXR_Error object .
*/
2014-05-19 08:09:13 +02:00
public function wp_getPostFormats ( $args ) {
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2010-11-19 14:57:05 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-11-19 14:57:05 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-12-13 22:21:50 +01:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2018-02-28 04:19:31 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, you are not allowed to access details about this site.' ) );
2017-12-01 00:11:00 +01:00
}
2012-04-23 23:41:50 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2010-11-19 14:57:05 +01:00
do_action ( 'xmlrpc_call' , 'wp.getPostFormats' );
2011-04-18 19:27:29 +02:00
2011-06-11 01:01:45 +02:00
$formats = get_post_format_strings ();
2011-04-18 19:27:29 +02:00
2020-01-29 01:45:18 +01:00
// Find out if they want a list of currently supports formats.
2011-06-11 01:01:45 +02:00
if ( isset ( $args [ 3 ] ) && is_array ( $args [ 3 ] ) ) {
if ( $args [ 3 ][ 'show-supported' ] ) {
if ( current_theme_supports ( 'post-formats' ) ) {
$supported = get_theme_support ( 'post-formats' );
2011-04-18 19:27:29 +02:00
2017-12-01 00:11:00 +01:00
$data = array ();
$data [ 'all' ] = $formats ;
2011-06-11 01:01:45 +02:00
$data [ 'supported' ] = $supported [ 0 ];
2011-04-18 19:27:29 +02:00
2011-06-11 01:01:45 +02:00
$formats = $data ;
}
}
}
2011-04-18 19:27:29 +02:00
return $formats ;
2010-12-13 22:21:50 +01:00
}
2010-10-27 19:20:46 +02:00
2012-03-23 18:53:14 +01:00
/**
* Retrieves a post type
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
*
2015-05-25 08:25:25 +02:00
* @ see get_post_type_object ()
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type string $post_type_name
* @ type array $fields ( optional )
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error Array contains :
2012-03-23 18:53:14 +01:00
* - 'labels'
* - 'description'
* - 'capability_type'
* - 'cap'
* - 'map_meta_cap'
* - 'hierarchical'
* - 'menu_position'
* - 'taxonomies'
* - 'supports'
*/
2014-05-19 08:09:13 +02:00
public function wp_getPostType ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2012-03-23 18:53:14 +01:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$post_type_name = $args [ 3 ];
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 4 ] ) ) {
2012-04-28 20:48:10 +02:00
$fields = $args [ 4 ];
2014-03-26 06:44:16 +01:00
} else {
/**
2016-05-22 20:15:28 +02:00
* Filters the default query fields used by the given XML - RPC method .
2014-03-26 06:44:16 +01:00
*
* @ since 3.4 . 0
*
* @ param array $fields An array of post type query fields for the given method .
* @ param string $method The method name .
*/
2012-05-02 22:29:34 +02:00
$fields = apply_filters ( 'xmlrpc_default_posttype_fields' , array ( 'labels' , 'cap' , 'taxonomies' ), 'wp.getPostType' );
2014-03-26 06:44:16 +01:00
}
2012-03-23 18:53:14 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2012-03-23 18:53:14 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-03-23 18:53:14 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-03-23 18:53:14 +01:00
do_action ( 'xmlrpc_call' , 'wp.getPostType' );
2017-12-01 00:11:00 +01:00
if ( ! post_type_exists ( $post_type_name ) ) {
2016-07-17 18:05:31 +02:00
return new IXR_Error ( 403 , __ ( 'Invalid post type.' ) );
2017-12-01 00:11:00 +01:00
}
2012-03-23 18:53:14 +01:00
$post_type = get_post_type_object ( $post_type_name );
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type -> cap -> edit_posts ) ) {
2016-11-17 16:53:33 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit posts in this post type.' ) );
2017-12-01 00:11:00 +01:00
}
2012-03-23 18:53:14 +01:00
return $this -> _prepare_post_type ( $post_type , $fields );
}
/**
* Retrieves a post types
*
2012-04-28 20:48:10 +02:00
* @ since 3.4 . 0
2012-03-23 18:53:14 +01:00
*
2015-05-25 08:25:25 +02:00
* @ see get_post_types ()
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $filter ( optional )
* @ type array $fields ( optional )
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2012-03-23 18:53:14 +01:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getPostTypes ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 3 ) ) {
2012-05-02 23:13:08 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-04-28 23:25:25 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$filter = isset ( $args [ 3 ] ) ? $args [ 3 ] : array ( 'public' => true );
2012-03-23 18:53:14 +01:00
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 4 ] ) ) {
2012-04-28 20:48:10 +02:00
$fields = $args [ 4 ];
2014-03-26 06:44:16 +01:00
} else {
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-05-02 22:29:34 +02:00
$fields = apply_filters ( 'xmlrpc_default_posttype_fields' , array ( 'labels' , 'cap' , 'taxonomies' ), 'wp.getPostTypes' );
2014-03-26 06:44:16 +01:00
}
2012-03-23 18:53:14 +01:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2012-03-23 18:53:14 +01:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-03-23 18:53:14 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-03-23 18:53:14 +01:00
do_action ( 'xmlrpc_call' , 'wp.getPostTypes' );
$post_types = get_post_types ( $filter , 'objects' );
$struct = array ();
2015-08-25 22:28:22 +02:00
foreach ( $post_types as $post_type ) {
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( $post_type -> cap -> edit_posts ) ) {
2012-03-23 18:53:14 +01:00
continue ;
2017-12-01 00:11:00 +01:00
}
2012-03-23 18:53:14 +01:00
2017-12-01 00:11:00 +01:00
$struct [ $post_type -> name ] = $this -> _prepare_post_type ( $post_type , $fields );
2012-03-23 18:53:14 +01:00
}
return $struct ;
}
2012-09-27 06:17:15 +02:00
/**
* Retrieve revisions for a specific post .
*
* @ since 3.5 . 0
*
* The optional $fields parameter specifies what fields will be included
* in the response array .
*
* @ uses wp_get_post_revisions ()
* @ see wp_getPost () for more on $fields
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $post_id
* @ type array $fields ( optional )
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error contains a collection of posts .
2012-09-27 06:17:15 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_getRevisions ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 4 ) ) {
2012-09-27 06:17:15 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$post_id = ( int ) $args [ 3 ];
2012-09-27 06:17:15 +02:00
2014-03-26 06:44:16 +01:00
if ( isset ( $args [ 4 ] ) ) {
2012-09-27 06:17:15 +02:00
$fields = $args [ 4 ];
2014-03-26 06:44:16 +01:00
} else {
/**
2016-05-22 20:15:28 +02:00
* Filters the default revision query fields used by the given XML - RPC method .
2014-03-26 06:44:16 +01:00
*
* @ since 3.5 . 0
*
* @ param array $field An array of revision query fields .
* @ param string $method The method name .
*/
2012-09-27 06:17:15 +02:00
$fields = apply_filters ( 'xmlrpc_default_revision_fields' , array ( 'post_date' , 'post_date_gmt' ), 'wp.getRevisions' );
2014-03-26 06:44:16 +01:00
}
2012-09-27 06:17:15 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2012-09-27 06:17:15 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-09-27 06:17:15 +02:00
do_action ( 'xmlrpc_call' , 'wp.getRevisions' );
2019-07-03 01:42:58 +02:00
$post = get_post ( $post_id );
if ( ! $post ) {
2015-05-09 23:09:25 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post_id ) ) {
2012-09-27 06:17:15 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit posts.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
// Check if revisions are enabled.
2017-12-01 00:11:00 +01:00
if ( ! wp_revisions_enabled ( $post ) ) {
2012-09-27 06:17:15 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, revisions are disabled.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
$revisions = wp_get_post_revisions ( $post_id );
2017-12-01 00:11:00 +01:00
if ( ! $revisions ) {
2012-09-27 06:17:15 +02:00
return array ();
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
$struct = array ();
foreach ( $revisions as $revision ) {
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'read_post' , $revision -> ID ) ) {
2012-09-27 06:17:15 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2020-01-29 01:45:18 +01:00
// Skip autosaves.
2017-12-01 00:11:00 +01:00
if ( wp_is_post_autosave ( $revision ) ) {
2012-09-27 06:17:15 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
$struct [] = $this -> _prepare_post ( get_object_vars ( $revision ), $fields );
}
return $struct ;
}
/**
* Restore a post revision
*
* @ since 3.5 . 0
*
* @ uses wp_restore_post_revision ()
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $revision_id
* }
2014-11-03 04:04:22 +01:00
* @ return bool | IXR_Error false if there was an error restoring , true if success .
2012-09-27 06:17:15 +02:00
*/
2014-05-19 08:09:13 +02:00
public function wp_restoreRevision ( $args ) {
2017-12-01 00:11:00 +01:00
if ( ! $this -> minimum_args ( $args , 3 ) ) {
2012-09-27 06:17:15 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2013-03-01 17:28:40 +01:00
$this -> escape ( $args );
2012-09-27 06:17:15 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$revision_id = ( int ) $args [ 3 ];
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2012-09-27 06:17:15 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
2012-09-27 06:17:15 +02:00
do_action ( 'xmlrpc_call' , 'wp.restoreRevision' );
2019-07-03 01:42:58 +02:00
$revision = wp_get_post_revision ( $revision_id );
if ( ! $revision ) {
2015-05-09 23:09:25 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2017-12-01 00:11:00 +01:00
if ( wp_is_post_autosave ( $revision ) ) {
2015-05-09 23:09:25 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2019-07-03 01:42:58 +02:00
$post = get_post ( $revision -> post_parent );
if ( ! $post ) {
2015-05-09 23:09:25 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $revision -> post_parent ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
// Check if revisions are disabled.
2017-12-01 00:11:00 +01:00
if ( ! wp_revisions_enabled ( $post ) ) {
2012-09-27 06:17:15 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, revisions are disabled.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-27 06:17:15 +02:00
$post = wp_restore_post_revision ( $revision_id );
return ( bool ) $post ;
}
2020-01-29 01:45:18 +01:00
/*
* Blogger API functions .
* Specs on http :// plant . blogger . com / api and https :// groups . yahoo . com / group / bloggerDev /
2010-09-23 23:22:21 +02:00
*/
/**
* Retrieve blogs that user owns .
*
* Will make more sense once we support multiple blogs .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2017-12-01 00:11:00 +01:00
public function blogger_getUsersBlogs ( $args ) {
2016-09-14 01:17:28 +02:00
if ( ! $this -> minimum_args ( $args , 3 ) ) {
return $this -> error ;
}
if ( is_multisite () ) {
2017-12-01 00:11:00 +01:00
return $this -> _multisite_getUsersBlogs ( $args );
2016-09-14 01:17:28 +02:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2010-09-23 23:22:21 +02:00
$username = $args [ 1 ];
2015-05-22 21:37:24 +02:00
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'blogger.getUsersBlogs' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$is_admin = current_user_can ( 'manage_options' );
2010-09-23 23:22:21 +02:00
$struct = array (
'isAdmin' => $is_admin ,
2017-12-01 00:11:00 +01:00
'url' => get_option ( 'home' ) . '/' ,
2010-09-23 23:22:21 +02:00
'blogid' => '1' ,
2017-12-01 00:11:00 +01:00
'blogName' => get_option ( 'blogname' ),
2012-10-10 23:55:36 +02:00
'xmlrpc' => site_url ( 'xmlrpc.php' , 'rpc' ),
2010-09-23 23:22:21 +02:00
);
2017-12-01 00:11:00 +01:00
return array ( $struct );
2010-09-23 23:22:21 +02:00
}
/**
* Private function for retrieving a users blogs for multisite setups
*
2015-12-16 06:49:26 +01:00
* @ since 3.0 . 0
2014-11-03 04:04:22 +01:00
*
2015-12-16 06:49:26 +01:00
* @ param array $args {
* Method arguments . Note : arguments must be ordered as documented .
*
* @ type string $username Username .
* @ type string $password Password .
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-12-16 06:49:26 +01:00
protected function _multisite_getUsersBlogs ( $args ) {
2016-10-26 00:54:35 +02:00
$current_blog = get_site ();
2012-10-04 14:40:09 +02:00
2010-09-23 23:22:21 +02:00
$domain = $current_blog -> domain ;
2017-12-01 00:11:00 +01:00
$path = $current_blog -> path . 'xmlrpc.php' ;
2010-09-23 23:22:21 +02:00
2012-08-30 15:33:00 +02:00
$rpc = new IXR_Client ( set_url_scheme ( " http:// { $domain } { $path } " ) );
2017-12-01 00:11:00 +01:00
$rpc -> query ( 'wp.getUsersBlogs' , $args [ 1 ], $args [ 2 ] );
2010-09-23 23:22:21 +02:00
$blogs = $rpc -> getResponse ();
2017-12-01 00:11:00 +01:00
if ( isset ( $blogs [ 'faultCode' ] ) ) {
return new IXR_Error ( $blogs [ 'faultCode' ], $blogs [ 'faultString' ] );
}
2010-09-23 23:22:21 +02:00
if ( $_SERVER [ 'HTTP_HOST' ] == $domain && $_SERVER [ 'REQUEST_URI' ] == $path ) {
return $blogs ;
} else {
foreach ( ( array ) $blogs as $blog ) {
2017-12-01 00:11:00 +01:00
if ( strpos ( $blog [ 'url' ], $_SERVER [ 'HTTP_HOST' ] ) ) {
return array ( $blog );
}
2010-09-23 23:22:21 +02:00
}
return array ();
}
}
/**
* Retrieve user ' s data .
*
* Gives your client some info about you , so you don ' t have to .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function blogger_getUserInfo ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2010-09-23 23:22:21 +02:00
$username = $args [ 1 ];
2015-05-22 21:37:24 +02:00
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2016-07-12 13:45:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to access user data on this site.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'blogger.getUserInfo' );
2010-09-23 23:22:21 +02:00
$struct = array (
'nickname' => $user -> nickname ,
'userid' => $user -> ID ,
'url' => $user -> user_url ,
'lastname' => $user -> last_name ,
2017-12-01 00:11:00 +01:00
'firstname' => $user -> first_name ,
2010-09-23 23:22:21 +02:00
);
return $struct ;
}
/**
* Retrieve post .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type int $post_ID
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function blogger_getPost ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$post_ID = ( int ) $args [ 1 ];
2010-09-23 23:22:21 +02:00
$username = $args [ 2 ];
2015-05-22 21:37:24 +02:00
$password = $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$post_data = get_post ( $post_ID , ARRAY_A );
if ( ! $post_data ) {
2012-04-30 02:19:32 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-05-03 18:41:59 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post_ID ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'blogger.getPost' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$categories = implode ( ',' , wp_get_post_categories ( $post_ID ) );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$content = '<title>' . wp_unslash ( $post_data [ 'post_title' ] ) . '</title>' ;
$content .= '<category>' . $categories . '</category>' ;
$content .= wp_unslash ( $post_data [ 'post_content' ] );
2010-09-23 23:22:21 +02:00
$struct = array (
2017-12-01 00:11:00 +01:00
'userid' => $post_data [ 'post_author' ],
2012-04-04 23:32:28 +02:00
'dateCreated' => $this -> _convert_date ( $post_data [ 'post_date' ] ),
2010-09-23 23:22:21 +02:00
'content' => $content ,
2017-12-01 00:11:00 +01:00
'postid' => ( string ) $post_data [ 'ID' ],
2010-09-23 23:22:21 +02:00
);
return $struct ;
}
/**
* Retrieve list of recent posts .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type string $appkey ( unused )
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $numberposts ( optional )
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function blogger_getRecentPosts ( $args ) {
2013-03-01 17:28:40 +01:00
2017-12-01 00:11:00 +01:00
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2020-01-29 01:45:18 +01:00
// $args[0] = appkey - ignored.
2010-09-23 23:22:21 +02:00
$username = $args [ 2 ];
2015-05-22 21:37:24 +02:00
$password = $args [ 3 ];
2017-12-01 00:11:00 +01:00
if ( isset ( $args [ 4 ] ) ) {
2010-11-09 11:16:23 +01:00
$query = array ( 'numberposts' => absint ( $args [ 4 ] ) );
2017-12-01 00:11:00 +01:00
} else {
2010-11-09 11:16:23 +01:00
$query = array ();
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit posts.' ) );
2017-12-01 00:11:00 +01:00
}
2013-03-07 07:52:37 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'blogger.getRecentPosts' );
2010-09-23 23:22:21 +02:00
2010-11-09 11:16:23 +01:00
$posts_list = wp_get_recent_posts ( $query );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $posts_list ) {
$this -> error = new IXR_Error ( 500 , __ ( 'Either there are no posts, or something went wrong.' ) );
2010-09-23 23:22:21 +02:00
return $this -> error ;
}
2014-11-01 20:45:25 +01:00
$recent_posts = array ();
2017-12-01 00:11:00 +01:00
foreach ( $posts_list as $entry ) {
if ( ! current_user_can ( 'edit_post' , $entry [ 'ID' ] ) ) {
2010-09-23 23:22:21 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2012-04-04 23:32:28 +02:00
$post_date = $this -> _convert_date ( $entry [ 'post_date' ] );
2017-12-01 00:11:00 +01:00
$categories = implode ( ',' , wp_get_post_categories ( $entry [ 'ID' ] ) );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$content = '<title>' . wp_unslash ( $entry [ 'post_title' ] ) . '</title>' ;
$content .= '<category>' . $categories . '</category>' ;
$content .= wp_unslash ( $entry [ 'post_content' ] );
2010-09-23 23:22:21 +02:00
2014-11-01 20:45:25 +01:00
$recent_posts [] = array (
2017-12-01 00:11:00 +01:00
'userid' => $entry [ 'post_author' ],
2012-04-04 23:32:28 +02:00
'dateCreated' => $post_date ,
2017-12-01 00:11:00 +01:00
'content' => $content ,
'postid' => ( string ) $entry [ 'ID' ],
2010-09-23 23:22:21 +02:00
);
}
return $recent_posts ;
}
/**
2012-11-29 03:35:39 +01:00
* Deprecated .
2010-09-23 23:22:21 +02:00
*
* @ since 1.5 . 0
2012-11-29 03:35:39 +01:00
* @ deprecated 3.5 . 0
2015-12-16 18:26:28 +01:00
*
* @ param array $args Unused .
2015-12-16 18:38:27 +01:00
* @ return IXR_Error Error object .
2010-09-23 23:22:21 +02:00
*/
2017-12-01 00:11:00 +01:00
public function blogger_getTemplate ( $args ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, this method is not supported.' ) );
2010-09-23 23:22:21 +02:00
}
/**
2012-11-29 03:35:39 +01:00
* Deprecated .
2010-09-23 23:22:21 +02:00
*
* @ since 1.5 . 0
2012-11-29 03:35:39 +01:00
* @ deprecated 3.5 . 0
2015-12-16 18:26:28 +01:00
*
* @ param array $args Unused .
2015-12-16 18:38:27 +01:00
* @ return IXR_Error Error object .
2010-09-23 23:22:21 +02:00
*/
2017-12-01 00:11:00 +01:00
public function blogger_setTemplate ( $args ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 403 , __ ( 'Sorry, this method is not supported.' ) );
2010-09-23 23:22:21 +02:00
}
/**
2015-12-16 18:26:28 +01:00
* Creates new post .
2010-09-23 23:22:21 +02:00
*
* @ since 1.5 . 0
*
2015-12-16 18:26:28 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type string $appkey ( unused )
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type string $content
* @ type string $publish
* }
2014-11-03 04:04:22 +01:00
* @ return int | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function blogger_newPost ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2010-09-23 23:22:21 +02:00
$username = $args [ 2 ];
2015-05-22 21:37:24 +02:00
$password = $args [ 3 ];
$content = $args [ 4 ];
$publish = $args [ 5 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'blogger.newPost' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$cap = ( $publish ) ? 'publish_posts' : 'edit_posts' ;
if ( ! current_user_can ( get_post_type_object ( 'post' ) -> cap -> create_posts ) || ! current_user_can ( $cap ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to post on this site.' ) );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$post_status = ( $publish ) ? 'publish' : 'draft' ;
2010-09-23 23:22:21 +02:00
$post_author = $user -> ID ;
2017-12-01 00:11:00 +01:00
$post_title = xmlrpc_getposttitle ( $content );
$post_category = xmlrpc_getpostcategory ( $content );
$post_content = xmlrpc_removepostdata ( $content );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$post_date = current_time ( 'mysql' );
$post_date_gmt = current_time ( 'mysql' , 1 );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$post_data = compact ( 'post_author' , 'post_date' , 'post_date_gmt' , 'post_content' , 'post_title' , 'post_category' , 'post_status' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$post_ID = wp_insert_post ( $post_data );
if ( is_wp_error ( $post_ID ) ) {
return new IXR_Error ( 500 , $post_ID -> get_error_message () );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $post_ID ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the post could not be created.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$this -> attach_uploads ( $post_ID , $post_content );
2014-03-26 06:44:16 +01:00
/**
* Fires after a new post has been successfully created via the XML - RPC Blogger API .
*
* @ since 3.4 . 0
*
* @ param int $post_ID ID of the new post .
* @ param array $args An array of new post arguments .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_blogger_newPost' , $post_ID , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:16:26 +01:00
2010-09-23 23:22:21 +02:00
return $post_ID ;
}
/**
* Edit a post .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type int $post_ID
* @ type string $username
* @ type string $password
* @ type string $content
2015-09-26 06:01:26 +02:00
* @ type bool $publish
2015-05-22 21:37:24 +02:00
* }
* @ return true | IXR_Error true when done .
2010-09-23 23:22:21 +02:00
*/
2014-05-19 08:09:13 +02:00
public function blogger_editPost ( $args ) {
2013-03-01 17:28:40 +01:00
2017-12-01 00:11:00 +01:00
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$post_ID = ( int ) $args [ 1 ];
$username = $args [ 2 ];
$password = $args [ 3 ];
$content = $args [ 4 ];
2015-09-26 06:01:26 +02:00
$publish = $args [ 5 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2014-05-15 05:25:15 +02:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'blogger.editPost' );
2010-09-23 23:22:21 +02:00
2014-05-15 05:25:15 +02:00
$actual_post = get_post ( $post_ID , ARRAY_A );
2010-09-23 23:22:21 +02:00
2020-02-09 17:55:09 +01:00
if ( ! $actual_post || 'post' !== $actual_post [ 'post_type' ] ) {
2014-05-15 05:25:15 +02:00
return new IXR_Error ( 404 , __ ( 'Sorry, no such post.' ) );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$this -> escape ( $actual_post );
2013-03-01 17:28:40 +01:00
2014-05-15 05:25:15 +02:00
if ( ! current_user_can ( 'edit_post' , $post_ID ) ) {
2017-12-01 00:11:00 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2014-05-15 05:25:15 +02:00
}
2020-02-09 17:55:09 +01:00
if ( 'publish' === $actual_post [ 'post_status' ] && ! current_user_can ( 'publish_posts' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to publish this post.' ) );
2014-05-15 05:25:15 +02:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$postdata = array ();
$postdata [ 'ID' ] = $actual_post [ 'ID' ];
$postdata [ 'post_content' ] = xmlrpc_removepostdata ( $content );
$postdata [ 'post_title' ] = xmlrpc_getposttitle ( $content );
2014-05-15 05:25:15 +02:00
$postdata [ 'post_category' ] = xmlrpc_getpostcategory ( $content );
2017-12-01 00:11:00 +01:00
$postdata [ 'post_status' ] = $actual_post [ 'post_status' ];
$postdata [ 'post_excerpt' ] = $actual_post [ 'post_excerpt' ];
$postdata [ 'post_status' ] = $publish ? 'publish' : 'draft' ;
2010-09-23 23:22:21 +02:00
2014-05-15 05:25:15 +02:00
$result = wp_update_post ( $postdata );
2010-09-23 23:22:21 +02:00
2014-05-15 05:25:15 +02:00
if ( ! $result ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the post could not be updated.' ) );
2014-05-15 05:25:15 +02:00
}
$this -> attach_uploads ( $actual_post [ 'ID' ], $postdata [ 'post_content' ] );
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/**
* Fires after a post has been successfully updated via the XML - RPC Blogger API .
*
* @ since 3.4 . 0
*
* @ param int $post_ID ID of the updated post .
* @ param array $args An array of arguments for the post to edit .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_blogger_editPost' , $post_ID , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:16:26 +01:00
2010-09-23 23:22:21 +02:00
return true ;
}
/**
* Remove a post .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type int $post_ID
* @ type string $username
* @ type string $password
* }
* @ return true | IXR_Error True when post is deleted .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function blogger_deletePost ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$post_ID = ( int ) $args [ 1 ];
$username = $args [ 2 ];
$password = $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'blogger.deletePost' );
2010-09-23 23:22:21 +02:00
2015-10-03 16:09:43 +02:00
$actual_post = get_post ( $post_ID , ARRAY_A );
2010-09-23 23:22:21 +02:00
2020-02-09 17:55:09 +01:00
if ( ! $actual_post || 'post' !== $actual_post [ 'post_type' ] ) {
2015-10-03 16:09:43 +02:00
return new IXR_Error ( 404 , __ ( 'Sorry, no such post.' ) );
}
2010-09-23 23:22:21 +02:00
2015-10-03 16:09:43 +02:00
if ( ! current_user_can ( 'delete_post' , $post_ID ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to delete this post.' ) );
2015-10-03 16:09:43 +02:00
}
2010-09-23 23:22:21 +02:00
2015-10-03 16:09:43 +02:00
$result = wp_delete_post ( $post_ID );
2010-09-23 23:22:21 +02:00
2015-10-03 16:09:43 +02:00
if ( ! $result ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the post could not be deleted.' ) );
2015-10-03 16:09:43 +02:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/**
* Fires after a post has been successfully deleted via the XML - RPC Blogger API .
*
* @ since 3.4 . 0
*
* @ param int $post_ID ID of the deleted post .
* @ param array $args An array of arguments to delete the post .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_blogger_deletePost' , $post_ID , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:16:26 +01:00
2010-09-23 23:22:21 +02:00
return true ;
}
2020-01-29 01:45:18 +01:00
/*
* MetaWeblog API functions .
* Specs on wherever Dave Winer wants them to be .
2010-09-23 23:22:21 +02:00
*/
/**
* Create a new post .
2011-06-11 01:01:45 +02:00
*
2011-04-18 09:23:47 +02:00
* The 'content_struct' argument must contain :
* - title
* - description
* - mt_excerpt
* - mt_text_more
* - mt_keywords
* - mt_tb_ping_urls
* - categories
2011-06-11 01:01:45 +02:00
*
2011-04-18 09:23:47 +02:00
* Also , it can optionally contain :
* - wp_slug
* - wp_password
* - wp_page_parent_id
* - wp_page_order
* - wp_author_id
* - post_status | page_status - can be 'draft' , 'private' , 'publish' , or 'pending'
* - mt_allow_comments - can be 'open' or 'closed'
* - mt_allow_pings - can be 'open' or 'closed'
* - date_created_gmt
* - dateCreated
2012-04-13 22:23:31 +02:00
* - wp_post_thumbnail
2010-09-23 23:22:21 +02:00
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $content_struct
* @ type int $publish
* }
2014-11-03 04:04:22 +01:00
* @ return int | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2017-12-01 00:11:00 +01:00
public function mw_newPost ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
$content_struct = $args [ 3 ];
2015-05-22 21:37:24 +02:00
$publish = isset ( $args [ 4 ] ) ? $args [ 4 ] : 0 ;
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'metaWeblog.newPost' );
2010-12-13 22:21:50 +01:00
2010-09-23 23:22:21 +02:00
$page_template = '' ;
2017-12-01 00:11:00 +01:00
if ( ! empty ( $content_struct [ 'post_type' ] ) ) {
2020-02-09 17:55:09 +01:00
if ( 'page' === $content_struct [ 'post_type' ] ) {
2017-12-01 00:11:00 +01:00
if ( $publish ) {
$cap = 'publish_pages' ;
2020-02-09 17:55:09 +01:00
} elseif ( isset ( $content_struct [ 'page_status' ] ) && 'publish' === $content_struct [ 'page_status' ] ) {
2017-12-01 00:11:00 +01:00
$cap = 'publish_pages' ;
} else {
2010-12-08 16:31:17 +01:00
$cap = 'edit_pages' ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$error_message = __ ( 'Sorry, you are not allowed to publish pages on this site.' );
2017-12-01 00:11:00 +01:00
$post_type = 'page' ;
if ( ! empty ( $content_struct [ 'wp_page_template' ] ) ) {
2010-09-23 23:22:21 +02:00
$page_template = $content_struct [ 'wp_page_template' ];
2017-12-01 00:11:00 +01:00
}
2020-02-09 17:55:09 +01:00
} elseif ( 'post' === $content_struct [ 'post_type' ] ) {
2017-12-01 00:11:00 +01:00
if ( $publish ) {
$cap = 'publish_posts' ;
2020-02-09 17:55:09 +01:00
} elseif ( isset ( $content_struct [ 'post_status' ] ) && 'publish' === $content_struct [ 'post_status' ] ) {
2017-12-01 00:11:00 +01:00
$cap = 'publish_posts' ;
} else {
2010-12-08 16:31:17 +01:00
$cap = 'edit_posts' ;
2017-12-01 00:11:00 +01:00
}
2010-12-08 16:31:17 +01:00
$error_message = __ ( 'Sorry, you are not allowed to publish posts on this site.' );
2017-12-01 00:11:00 +01:00
$post_type = 'post' ;
2010-09-23 23:22:21 +02:00
} else {
2020-01-29 01:45:18 +01:00
// No other 'post_type' values are allowed here.
2016-07-17 18:05:31 +02:00
return new IXR_Error ( 401 , __ ( 'Invalid post type.' ) );
2010-09-23 23:22:21 +02:00
}
2010-12-08 16:31:17 +01:00
} else {
2017-12-01 00:11:00 +01:00
if ( $publish ) {
$cap = 'publish_posts' ;
2020-02-09 17:55:09 +01:00
} elseif ( isset ( $content_struct [ 'post_status' ] ) && 'publish' === $content_struct [ 'post_status' ] ) {
2017-12-01 00:11:00 +01:00
$cap = 'publish_posts' ;
} else {
2010-12-08 16:31:17 +01:00
$cap = 'edit_posts' ;
2017-12-01 00:11:00 +01:00
}
2010-12-08 16:31:17 +01:00
$error_message = __ ( 'Sorry, you are not allowed to publish posts on this site.' );
2017-12-01 00:11:00 +01:00
$post_type = 'post' ;
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( get_post_type_object ( $post_type ) -> cap -> create_posts ) ) {
2012-11-28 23:28:20 +01:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to publish posts on this site.' ) );
2017-12-01 00:11:00 +01:00
}
if ( ! current_user_can ( $cap ) ) {
2010-09-23 23:22:21 +02:00
return new IXR_Error ( 401 , $error_message );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Check for a valid post format if one was given.
2010-12-13 22:21:50 +01:00
if ( isset ( $content_struct [ 'wp_post_format' ] ) ) {
$content_struct [ 'wp_post_format' ] = sanitize_key ( $content_struct [ 'wp_post_format' ] );
2017-12-01 00:11:00 +01:00
if ( ! array_key_exists ( $content_struct [ 'wp_post_format' ], get_post_format_strings () ) ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post format.' ) );
2010-11-19 14:57:05 +01:00
}
}
2020-01-29 01:45:18 +01:00
// Let WordPress generate the 'post_name' (slug) unless
2010-09-23 23:22:21 +02:00
// one has been provided.
2017-12-01 00:11:00 +01:00
$post_name = '' ;
if ( isset ( $content_struct [ 'wp_slug' ] ) ) {
2011-05-06 21:51:47 +02:00
$post_name = $content_struct [ 'wp_slug' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
// Only use a password if one was given.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_password' ] ) ) {
2011-05-06 21:51:47 +02:00
$post_password = $content_struct [ 'wp_password' ];
2018-12-14 06:13:52 +01:00
} else {
$post_password = '' ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Only set a post parent if one was given.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_page_parent_id' ] ) ) {
2011-05-06 21:51:47 +02:00
$post_parent = $content_struct [ 'wp_page_parent_id' ];
2018-12-14 06:13:52 +01:00
} else {
$post_parent = 0 ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Only set the 'menu_order' if it was given.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_page_order' ] ) ) {
2011-05-06 21:51:47 +02:00
$menu_order = $content_struct [ 'wp_page_order' ];
2018-12-14 06:13:52 +01:00
} else {
$menu_order = 0 ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$post_author = $user -> ID ;
// If an author id was provided then use it instead.
2012-09-15 21:57:05 +02:00
if ( isset ( $content_struct [ 'wp_author_id' ] ) && ( $user -> ID != $content_struct [ 'wp_author_id' ] ) ) {
2010-09-23 23:22:21 +02:00
switch ( $post_type ) {
2017-12-01 00:11:00 +01:00
case 'post' :
if ( ! current_user_can ( 'edit_others_posts' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to create posts as this user.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
break ;
2017-12-01 00:11:00 +01:00
case 'page' :
if ( ! current_user_can ( 'edit_others_pages' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to create pages as this user.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
break ;
default :
2016-07-17 18:05:31 +02:00
return new IXR_Error ( 401 , __ ( 'Invalid post type.' ) );
2010-09-23 23:22:21 +02:00
}
2012-04-04 22:11:21 +02:00
$author = get_userdata ( $content_struct [ 'wp_author_id' ] );
2017-12-01 00:11:00 +01:00
if ( ! $author ) {
2012-04-04 22:11:21 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid author ID.' ) );
2017-12-01 00:11:00 +01:00
}
2011-05-06 21:51:47 +02:00
$post_author = $content_struct [ 'wp_author_id' ];
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
$post_title = isset ( $content_struct [ 'title' ] ) ? $content_struct [ 'title' ] : null ;
2010-12-08 23:00:40 +01:00
$post_content = isset ( $content_struct [ 'description' ] ) ? $content_struct [ 'description' ] : null ;
2010-09-23 23:22:21 +02:00
$post_status = $publish ? 'publish' : 'draft' ;
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ " { $post_type } _status " ] ) ) {
switch ( $content_struct [ " { $post_type } _status " ] ) {
2010-09-23 23:22:21 +02:00
case 'draft' :
2011-04-18 19:30:58 +02:00
case 'pending' :
2010-09-23 23:22:21 +02:00
case 'private' :
case 'publish' :
2017-12-01 00:11:00 +01:00
$post_status = $content_struct [ " { $post_type } _status " ];
2010-09-23 23:22:21 +02:00
break ;
default :
$post_status = $publish ? 'publish' : 'draft' ;
break ;
}
}
2017-12-01 00:11:00 +01:00
$post_excerpt = isset ( $content_struct [ 'mt_excerpt' ] ) ? $content_struct [ 'mt_excerpt' ] : null ;
$post_more = isset ( $content_struct [ 'mt_text_more' ] ) ? $content_struct [ 'mt_text_more' ] : null ;
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$tags_input = isset ( $content_struct [ 'mt_keywords' ] ) ? $content_struct [ 'mt_keywords' ] : null ;
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'mt_allow_comments' ] ) ) {
if ( ! is_numeric ( $content_struct [ 'mt_allow_comments' ] ) ) {
2011-05-06 21:51:47 +02:00
switch ( $content_struct [ 'mt_allow_comments' ] ) {
case 'closed' :
$comment_status = 'closed' ;
2010-09-23 23:22:21 +02:00
break ;
2011-05-06 21:51:47 +02:00
case 'open' :
$comment_status = 'open' ;
2010-09-23 23:22:21 +02:00
break ;
default :
2015-07-03 00:32:25 +02:00
$comment_status = get_default_comment_status ( $post_type );
2010-09-23 23:22:21 +02:00
break ;
}
} else {
2011-05-06 21:51:47 +02:00
switch ( ( int ) $content_struct [ 'mt_allow_comments' ] ) {
2010-09-23 23:22:21 +02:00
case 0 :
case 2 :
2011-05-06 21:51:47 +02:00
$comment_status = 'closed' ;
2010-09-23 23:22:21 +02:00
break ;
case 1 :
2011-05-06 21:51:47 +02:00
$comment_status = 'open' ;
2010-09-23 23:22:21 +02:00
break ;
default :
2015-07-03 00:32:25 +02:00
$comment_status = get_default_comment_status ( $post_type );
2010-09-23 23:22:21 +02:00
break ;
}
}
} else {
2015-07-03 00:32:25 +02:00
$comment_status = get_default_comment_status ( $post_type );
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'mt_allow_pings' ] ) ) {
if ( ! is_numeric ( $content_struct [ 'mt_allow_pings' ] ) ) {
2010-09-23 23:22:21 +02:00
switch ( $content_struct [ 'mt_allow_pings' ] ) {
2011-05-06 21:51:47 +02:00
case 'closed' :
$ping_status = 'closed' ;
2010-09-23 23:22:21 +02:00
break ;
2011-05-06 21:51:47 +02:00
case 'open' :
$ping_status = 'open' ;
2010-09-23 23:22:21 +02:00
break ;
default :
2015-07-03 00:32:25 +02:00
$ping_status = get_default_comment_status ( $post_type , 'pingback' );
2010-09-23 23:22:21 +02:00
break ;
}
} else {
2011-05-06 21:51:47 +02:00
switch ( ( int ) $content_struct [ 'mt_allow_pings' ] ) {
2010-09-23 23:22:21 +02:00
case 0 :
2011-05-06 21:51:47 +02:00
$ping_status = 'closed' ;
2010-09-23 23:22:21 +02:00
break ;
case 1 :
2011-05-06 21:51:47 +02:00
$ping_status = 'open' ;
2010-09-23 23:22:21 +02:00
break ;
default :
2015-07-03 00:32:25 +02:00
$ping_status = get_default_comment_status ( $post_type , 'pingback' );
2010-09-23 23:22:21 +02:00
break ;
}
}
} else {
2015-07-03 00:32:25 +02:00
$ping_status = get_default_comment_status ( $post_type , 'pingback' );
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
if ( $post_more ) {
2011-05-06 21:51:47 +02:00
$post_content = $post_content . '<!--more-->' . $post_more ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2010-12-08 23:00:40 +01:00
$to_ping = null ;
if ( isset ( $content_struct [ 'mt_tb_ping_urls' ] ) ) {
$to_ping = $content_struct [ 'mt_tb_ping_urls' ];
2017-12-01 00:11:00 +01:00
if ( is_array ( $to_ping ) ) {
$to_ping = implode ( ' ' , $to_ping );
}
2010-12-08 23:00:40 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Do some timestamp voodoo.
2017-12-01 00:11:00 +01:00
if ( ! empty ( $content_struct [ 'date_created_gmt' ] ) ) {
2020-01-29 01:45:18 +01:00
// We know this is supposed to be GMT, so we're going to slap that Z on there by force.
2012-05-01 03:11:18 +02:00
$dateCreated = rtrim ( $content_struct [ 'date_created_gmt' ] -> getIso (), 'Z' ) . 'Z' ;
2017-12-01 00:11:00 +01:00
} elseif ( ! empty ( $content_struct [ 'dateCreated' ] ) ) {
2010-09-23 23:22:21 +02:00
$dateCreated = $content_struct [ 'dateCreated' ] -> getIso ();
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! empty ( $dateCreated ) ) {
2019-12-09 20:56:05 +01:00
$post_date = iso8601_to_datetime ( $dateCreated );
$post_date_gmt = iso8601_to_datetime ( $dateCreated , 'gmt' );
2010-09-23 23:22:21 +02:00
} else {
2017-12-01 00:11:00 +01:00
$post_date = '' ;
2015-09-26 05:38:25 +02:00
$post_date_gmt = '' ;
2010-09-23 23:22:21 +02:00
}
$post_category = array ();
2010-12-08 23:00:40 +01:00
if ( isset ( $content_struct [ 'categories' ] ) ) {
$catnames = $content_struct [ 'categories' ];
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( is_array ( $catnames ) ) {
foreach ( $catnames as $cat ) {
$post_category [] = get_cat_ID ( $cat );
2010-12-08 23:00:40 +01:00
}
2010-09-23 23:22:21 +02:00
}
}
2017-12-01 00:11:00 +01:00
$postdata = compact ( 'post_author' , 'post_date' , 'post_date_gmt' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' , 'comment_status' , 'ping_status' , 'to_ping' , 'post_type' , 'post_name' , 'post_password' , 'post_parent' , 'menu_order' , 'tags_input' , 'page_template' );
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$post_ID = get_default_post_to_edit ( $post_type , true ) -> ID ;
$postdata [ 'ID' ] = $post_ID ;
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Only posts can be sticky.
2020-02-09 17:55:09 +01:00
if ( 'post' === $post_type && isset ( $content_struct [ 'sticky' ] ) ) {
2017-12-01 00:11:00 +01:00
$data = $postdata ;
2015-07-19 20:09:25 +02:00
$data [ 'sticky' ] = $content_struct [ 'sticky' ];
2017-12-01 00:11:00 +01:00
$error = $this -> _toggle_sticky ( $data );
2015-07-19 20:09:25 +02:00
if ( $error ) {
return $error ;
}
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'custom_fields' ] ) ) {
$this -> set_custom_fields ( $post_ID , $content_struct [ 'custom_fields' ] );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_post_thumbnail' ] ) ) {
if ( set_post_thumbnail ( $post_ID , $content_struct [ 'wp_post_thumbnail' ] ) === false ) {
2012-03-23 16:35:44 +01:00
return new IXR_Error ( 404 , __ ( 'Invalid attachment ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-03-23 16:35:44 +01:00
2012-04-13 22:23:31 +02:00
unset ( $content_struct [ 'wp_post_thumbnail' ] );
2012-03-23 16:35:44 +01:00
}
2020-01-29 01:45:18 +01:00
// Handle enclosures.
2017-12-01 00:11:00 +01:00
$thisEnclosure = isset ( $content_struct [ 'enclosure' ] ) ? $content_struct [ 'enclosure' ] : null ;
$this -> add_enclosure_if_new ( $post_ID , $thisEnclosure );
2010-09-23 23:22:21 +02:00
$this -> attach_uploads ( $post_ID , $post_content );
2010-12-13 22:21:50 +01:00
2010-11-19 14:57:05 +01:00
// Handle post formats if assigned, value is validated earlier
2020-01-29 01:45:18 +01:00
// in this function.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_post_format' ] ) ) {
2012-06-26 23:07:12 +02:00
set_post_format ( $post_ID , $content_struct [ 'wp_post_format' ] );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2011-10-10 23:27:05 +02:00
$post_ID = wp_insert_post ( $postdata , true );
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $post_ID ) ) {
return new IXR_Error ( 500 , $post_ID -> get_error_message () );
}
2011-10-10 23:27:05 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $post_ID ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the post could not be created.' ) );
2017-12-01 00:11:00 +01:00
}
2011-10-10 23:27:05 +02:00
2014-03-26 06:44:16 +01:00
/**
* Fires after a new post has been successfully created via the XML - RPC MovableType API .
*
* @ since 3.4 . 0
*
* @ param int $post_ID ID of the new post .
* @ param array $args An array of arguments to create the new post .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_mw_newPost' , $post_ID , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:16:26 +01:00
2017-12-01 00:11:00 +01:00
return strval ( $post_ID );
2010-09-23 23:22:21 +02:00
}
2014-12-01 02:34:24 +01:00
/**
2015-12-16 18:32:28 +01:00
* 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 .
2014-12-01 02:34:24 +01:00
*/
2014-05-19 08:09:13 +02:00
public function add_enclosure_if_new ( $post_ID , $enclosure ) {
2010-09-23 23:22:21 +02:00
if ( is_array ( $enclosure ) && isset ( $enclosure [ 'url' ] ) && isset ( $enclosure [ 'length' ] ) && isset ( $enclosure [ 'type' ] ) ) {
2019-07-03 01:42:58 +02:00
$encstring = $enclosure [ 'url' ] . " \n " . $enclosure [ 'length' ] . " \n " . $enclosure [ 'type' ] . " \n " ;
$found = false ;
$enclosures = get_post_meta ( $post_ID , 'enclosure' );
if ( $enclosures ) {
2013-07-10 05:34:35 +02:00
foreach ( $enclosures as $enc ) {
// This method used to omit the trailing new line. #23219
if ( rtrim ( $enc , " \n " ) == rtrim ( $encstring , " \n " ) ) {
$found = true ;
break ;
2010-09-23 23:22:21 +02:00
}
}
}
2017-12-01 00:11:00 +01:00
if ( ! $found ) {
2013-03-01 17:28:40 +01:00
add_post_meta ( $post_ID , 'enclosure' , $encstring );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
}
}
/**
* Attach upload to a post .
*
* @ since 2.1 . 0
*
2016-10-10 08:38:31 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
*
2010-09-23 23:22:21 +02:00
* @ param int $post_ID Post ID .
* @ param string $post_content Post Content for attachment .
*/
2014-05-19 08:09:13 +02:00
public function attach_uploads ( $post_ID , $post_content ) {
2016-10-10 08:38:31 +02:00
global $wpdb ;
2020-01-29 01:45:18 +01:00
// Find any unattached files.
2016-10-10 08:38:31 +02:00
$attachments = $wpdb -> get_results ( " SELECT ID, guid FROM { $wpdb -> posts } WHERE post_parent = '0' AND post_type = 'attachment' " );
2010-09-23 23:22:21 +02:00
if ( is_array ( $attachments ) ) {
foreach ( $attachments as $file ) {
2017-12-01 00:11:00 +01:00
if ( ! empty ( $file -> guid ) && strpos ( $post_content , $file -> guid ) !== false ) {
$wpdb -> update ( $wpdb -> posts , array ( 'post_parent' => $post_ID ), array ( 'ID' => $file -> ID ) );
}
2010-09-23 23:22:21 +02:00
}
}
}
/**
* Edit a post .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $content_struct
* @ type int $publish
* }
2014-11-03 04:04:22 +01:00
* @ return bool | IXR_Error True on success .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mw_editPost ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2012-05-01 23:03:50 +02:00
$post_ID = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
$content_struct = $args [ 3 ];
2012-05-01 23:03:50 +02:00
$publish = isset ( $args [ 4 ] ) ? $args [ 4 ] : 0 ;
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'metaWeblog.editPost' );
2010-09-23 23:22:21 +02:00
2012-08-28 21:08:28 +02:00
$postdata = get_post ( $post_ID , ARRAY_A );
2010-09-23 23:22:21 +02:00
2015-05-25 08:25:25 +02:00
/*
* If there is no post data for the give post id , stop now and return an error .
* Otherwise a new post will be created ( which was the old behavior ) .
*/
2017-12-01 00:11:00 +01:00
if ( ! $postdata || empty ( $postdata [ 'ID' ] ) ) {
2012-02-08 16:40:26 +01:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-02-08 16:40:26 +01:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post_ID ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2012-02-13 22:01:55 +01:00
// Use wp.editPost to edit post types other than post and page.
2017-12-01 00:11:00 +01:00
if ( ! in_array ( $postdata [ 'post_type' ], array ( 'post' , 'page' ) ) ) {
2016-07-17 18:05:31 +02:00
return new IXR_Error ( 401 , __ ( 'Invalid post type.' ) );
2017-12-01 00:11:00 +01:00
}
2012-02-13 22:01:55 +01:00
// Thwart attempt to change the post type.
2017-12-01 00:11:00 +01:00
if ( ! empty ( $content_struct [ 'post_type' ] ) && ( $content_struct [ 'post_type' ] != $postdata [ 'post_type' ] ) ) {
2012-02-13 22:01:55 +01:00
return new IXR_Error ( 401 , __ ( 'The post type may not be changed.' ) );
2017-12-01 00:11:00 +01:00
}
2012-02-13 22:01:55 +01:00
2020-01-29 01:45:18 +01:00
// Check for a valid post format if one was given.
2010-12-13 22:21:50 +01:00
if ( isset ( $content_struct [ 'wp_post_format' ] ) ) {
$content_struct [ 'wp_post_format' ] = sanitize_key ( $content_struct [ 'wp_post_format' ] );
2017-12-01 00:11:00 +01:00
if ( ! array_key_exists ( $content_struct [ 'wp_post_format' ], get_post_format_strings () ) ) {
2016-09-02 05:57:28 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post format.' ) );
2010-11-19 14:57:05 +01:00
}
}
2017-12-01 00:11:00 +01:00
$this -> escape ( $postdata );
2014-05-16 17:19:14 +02:00
2018-12-14 06:13:52 +01:00
$ID = $postdata [ 'ID' ];
$post_content = $postdata [ 'post_content' ];
$post_title = $postdata [ 'post_title' ];
$post_excerpt = $postdata [ 'post_excerpt' ];
$post_password = $postdata [ 'post_password' ];
$post_parent = $postdata [ 'post_parent' ];
$post_type = $postdata [ 'post_type' ];
$menu_order = $postdata [ 'menu_order' ];
$ping_status = $postdata [ 'ping_status' ];
$comment_status = $postdata [ 'comment_status' ];
2010-09-23 23:22:21 +02:00
// Let WordPress manage slug if none was provided.
2011-04-18 18:32:26 +02:00
$post_name = $postdata [ 'post_name' ];
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_slug' ] ) ) {
2011-05-06 21:51:47 +02:00
$post_name = $content_struct [ 'wp_slug' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
// Only use a password if one was given.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_password' ] ) ) {
2011-05-06 21:51:47 +02:00
$post_password = $content_struct [ 'wp_password' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
// Only set a post parent if one was given.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_page_parent_id' ] ) ) {
2011-05-06 21:51:47 +02:00
$post_parent = $content_struct [ 'wp_page_parent_id' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Only set the 'menu_order' if it was given.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_page_order' ] ) ) {
2011-05-06 21:51:47 +02:00
$menu_order = $content_struct [ 'wp_page_order' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-05-16 17:19:14 +02:00
$page_template = null ;
2017-12-01 00:11:00 +01:00
if ( ! empty ( $content_struct [ 'wp_page_template' ] ) && 'page' == $post_type ) {
2012-02-27 20:46:52 +01:00
$page_template = $content_struct [ 'wp_page_template' ];
2017-12-01 00:11:00 +01:00
}
2012-02-13 22:01:55 +01:00
2011-05-06 21:51:47 +02:00
$post_author = $postdata [ 'post_author' ];
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// If an author id was provided then use it instead.
2015-04-02 17:49:30 +02:00
if ( isset ( $content_struct [ 'wp_author_id' ] ) ) {
// Check permissions if attempting to switch author to or from another user.
if ( $user -> ID != $content_struct [ 'wp_author_id' ] || $user -> ID != $post_author ) {
switch ( $post_type ) {
case 'post' :
if ( ! current_user_can ( 'edit_others_posts' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to change the post author as this user.' ) );
2015-04-02 17:49:30 +02:00
}
break ;
case 'page' :
if ( ! current_user_can ( 'edit_others_pages' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to change the page author as this user.' ) );
2015-04-02 17:49:30 +02:00
}
break ;
default :
2016-07-17 18:05:31 +02:00
return new IXR_Error ( 401 , __ ( 'Invalid post type.' ) );
2015-04-02 17:49:30 +02:00
}
$post_author = $content_struct [ 'wp_author_id' ];
2010-09-23 23:22:21 +02:00
}
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'mt_allow_comments' ] ) ) {
if ( ! is_numeric ( $content_struct [ 'mt_allow_comments' ] ) ) {
2011-05-06 21:51:47 +02:00
switch ( $content_struct [ 'mt_allow_comments' ] ) {
case 'closed' :
$comment_status = 'closed' ;
2010-09-23 23:22:21 +02:00
break ;
2011-05-06 21:51:47 +02:00
case 'open' :
$comment_status = 'open' ;
2010-09-23 23:22:21 +02:00
break ;
default :
2015-07-03 00:32:25 +02:00
$comment_status = get_default_comment_status ( $post_type );
2010-09-23 23:22:21 +02:00
break ;
}
} else {
2011-05-06 21:51:47 +02:00
switch ( ( int ) $content_struct [ 'mt_allow_comments' ] ) {
2010-09-23 23:22:21 +02:00
case 0 :
case 2 :
2011-05-06 21:51:47 +02:00
$comment_status = 'closed' ;
2010-09-23 23:22:21 +02:00
break ;
case 1 :
2011-05-06 21:51:47 +02:00
$comment_status = 'open' ;
2010-09-23 23:22:21 +02:00
break ;
default :
2015-07-03 00:32:25 +02:00
$comment_status = get_default_comment_status ( $post_type );
2010-09-23 23:22:21 +02:00
break ;
}
}
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'mt_allow_pings' ] ) ) {
if ( ! is_numeric ( $content_struct [ 'mt_allow_pings' ] ) ) {
2011-05-06 21:51:47 +02:00
switch ( $content_struct [ 'mt_allow_pings' ] ) {
case 'closed' :
$ping_status = 'closed' ;
2010-09-23 23:22:21 +02:00
break ;
2011-05-06 21:51:47 +02:00
case 'open' :
$ping_status = 'open' ;
2010-09-23 23:22:21 +02:00
break ;
default :
2015-07-03 00:32:25 +02:00
$ping_status = get_default_comment_status ( $post_type , 'pingback' );
2010-09-23 23:22:21 +02:00
break ;
}
} else {
2017-12-01 00:11:00 +01:00
switch ( ( int ) $content_struct [ 'mt_allow_pings' ] ) {
2010-09-23 23:22:21 +02:00
case 0 :
2011-05-06 21:51:47 +02:00
$ping_status = 'closed' ;
2010-09-23 23:22:21 +02:00
break ;
case 1 :
2011-05-06 21:51:47 +02:00
$ping_status = 'open' ;
2010-09-23 23:22:21 +02:00
break ;
default :
2015-07-03 00:32:25 +02:00
$ping_status = get_default_comment_status ( $post_type , 'pingback' );
2010-09-23 23:22:21 +02:00
break ;
}
}
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'title' ] ) ) {
$post_title = $content_struct [ 'title' ];
}
2012-03-29 13:59:51 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'description' ] ) ) {
2012-03-29 13:59:51 +02:00
$post_content = $content_struct [ 'description' ];
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$post_category = array ();
2010-12-08 23:00:40 +01:00
if ( isset ( $content_struct [ 'categories' ] ) ) {
$catnames = $content_struct [ 'categories' ];
2017-12-01 00:11:00 +01:00
if ( is_array ( $catnames ) ) {
foreach ( $catnames as $cat ) {
$post_category [] = get_cat_ID ( $cat );
2010-12-08 23:00:40 +01:00
}
2010-09-23 23:22:21 +02:00
}
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'mt_excerpt' ] ) ) {
$post_excerpt = $content_struct [ 'mt_excerpt' ];
}
2012-03-29 13:59:51 +02:00
2012-05-01 23:03:50 +02:00
$post_more = isset ( $content_struct [ 'mt_text_more' ] ) ? $content_struct [ 'mt_text_more' ] : null ;
2010-09-23 23:22:21 +02:00
$post_status = $publish ? 'publish' : 'draft' ;
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ " { $post_type } _status " ] ) ) {
switch ( $content_struct [ " { $post_type } _status " ] ) {
2010-09-23 23:22:21 +02:00
case 'draft' :
2011-04-18 19:30:58 +02:00
case 'pending' :
2010-09-23 23:22:21 +02:00
case 'private' :
case 'publish' :
2017-12-01 00:11:00 +01:00
$post_status = $content_struct [ " { $post_type } _status " ];
2010-09-23 23:22:21 +02:00
break ;
default :
$post_status = $publish ? 'publish' : 'draft' ;
break ;
}
}
2010-12-08 23:00:40 +01:00
$tags_input = isset ( $content_struct [ 'mt_keywords' ] ) ? $content_struct [ 'mt_keywords' ] : null ;
2010-09-23 23:22:21 +02:00
2020-02-09 17:55:09 +01:00
if ( 'publish' === $post_status || 'private' === $post_status ) {
2015-09-15 00:38:23 +02:00
if ( 'page' == $post_type && ! current_user_can ( 'publish_pages' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to publish this page.' ) );
2015-01-08 08:05:25 +01:00
} elseif ( ! current_user_can ( 'publish_posts' ) ) {
2016-06-29 17:16:29 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to publish this post.' ) );
2015-01-08 08:05:25 +01:00
}
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
if ( $post_more ) {
$post_content = $post_content . '<!--more-->' . $post_more ;
}
2010-09-23 23:22:21 +02:00
2010-12-08 23:00:40 +01:00
$to_ping = null ;
if ( isset ( $content_struct [ 'mt_tb_ping_urls' ] ) ) {
$to_ping = $content_struct [ 'mt_tb_ping_urls' ];
2017-12-01 00:11:00 +01:00
if ( is_array ( $to_ping ) ) {
$to_ping = implode ( ' ' , $to_ping );
}
2010-12-08 23:00:40 +01:00
}
2010-09-23 23:22:21 +02:00
2015-05-25 08:25:25 +02:00
// Do some timestamp voodoo.
2017-12-01 00:11:00 +01:00
if ( ! empty ( $content_struct [ 'date_created_gmt' ] ) ) {
2015-05-25 08:25:25 +02:00
// We know this is supposed to be GMT, so we're going to slap that Z on there by force.
2012-05-01 03:11:18 +02:00
$dateCreated = rtrim ( $content_struct [ 'date_created_gmt' ] -> getIso (), 'Z' ) . 'Z' ;
2017-12-01 00:11:00 +01:00
} elseif ( ! empty ( $content_struct [ 'dateCreated' ] ) ) {
2010-09-23 23:22:21 +02:00
$dateCreated = $content_struct [ 'dateCreated' ] -> getIso ();
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2016-03-22 16:10:28 +01:00
// Default to not flagging the post date to be edited unless it's intentional.
$edit_date = false ;
2017-12-01 00:11:00 +01:00
if ( ! empty ( $dateCreated ) ) {
2019-12-09 20:56:05 +01:00
$post_date = iso8601_to_datetime ( $dateCreated );
$post_date_gmt = iso8601_to_datetime ( $dateCreated , 'gmt' );
2016-03-22 16:10:28 +01:00
// Flag the post date to be edited.
$edit_date = true ;
2010-09-23 23:22:21 +02:00
} else {
$post_date = $postdata [ 'post_date' ];
$post_date_gmt = $postdata [ 'post_date_gmt' ];
}
2015-05-25 08:25:25 +02:00
// We've got all the data -- post it.
2017-12-01 00:11:00 +01:00
$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' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$result = wp_update_post ( $newpost , true );
if ( is_wp_error ( $result ) ) {
return new IXR_Error ( 500 , $result -> get_error_message () );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $result ) {
2019-12-05 14:48:03 +01:00
return new IXR_Error ( 500 , __ ( 'Sorry, the post could not be updated.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Only posts can be sticky.
2020-02-09 17:55:09 +01:00
if ( 'post' === $post_type && isset ( $content_struct [ 'sticky' ] ) ) {
2017-12-01 00:11:00 +01:00
$data = $newpost ;
$data [ 'sticky' ] = $content_struct [ 'sticky' ];
2015-08-13 17:28:27 +02:00
$data [ 'post_type' ] = 'post' ;
2017-12-01 00:11:00 +01:00
$error = $this -> _toggle_sticky ( $data , true );
2015-07-19 20:09:25 +02:00
if ( $error ) {
return $error ;
}
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'custom_fields' ] ) ) {
$this -> set_custom_fields ( $post_ID , $content_struct [ 'custom_fields' ] );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_post_thumbnail' ] ) ) {
2015-05-25 08:25:25 +02:00
// Empty value deletes, non-empty value adds/updates.
2012-04-13 22:23:31 +02:00
if ( empty ( $content_struct [ 'wp_post_thumbnail' ] ) ) {
2012-03-23 16:35:44 +01:00
delete_post_thumbnail ( $post_ID );
2012-03-29 13:59:51 +02:00
} else {
2017-12-01 00:11:00 +01:00
if ( set_post_thumbnail ( $post_ID , $content_struct [ 'wp_post_thumbnail' ] ) === false ) {
2012-03-23 16:35:44 +01:00
return new IXR_Error ( 404 , __ ( 'Invalid attachment ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-03-23 16:35:44 +01:00
}
2012-04-13 22:23:31 +02:00
unset ( $content_struct [ 'wp_post_thumbnail' ] );
2012-03-23 16:35:44 +01:00
}
2015-05-25 08:25:25 +02:00
// Handle enclosures.
2017-12-01 00:11:00 +01:00
$thisEnclosure = isset ( $content_struct [ 'enclosure' ] ) ? $content_struct [ 'enclosure' ] : null ;
$this -> add_enclosure_if_new ( $post_ID , $thisEnclosure );
2010-09-23 23:22:21 +02:00
$this -> attach_uploads ( $ID , $post_content );
2010-12-13 22:21:50 +01:00
2015-05-25 08:25:25 +02:00
// Handle post formats if assigned, validation is handled earlier in this function.
2017-12-01 00:11:00 +01:00
if ( isset ( $content_struct [ 'wp_post_format' ] ) ) {
2012-06-26 23:07:12 +02:00
set_post_format ( $post_ID , $content_struct [ 'wp_post_format' ] );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/**
* Fires after a post has been successfully updated via the XML - RPC MovableType API .
*
* @ since 3.4 . 0
*
* @ param int $post_ID ID of the updated post .
* @ param array $args An array of arguments to update the post .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_mw_editPost' , $post_ID , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:16:26 +01:00
2010-09-23 23:22:21 +02:00
return true ;
}
/**
* Retrieve post .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type int $post_ID
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mw_getPost ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$post_ID = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$postdata = get_post ( $post_ID , ARRAY_A );
if ( ! $postdata ) {
2012-04-30 02:19:32 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-04-30 02:19:32 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post_ID ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'metaWeblog.getPost' );
2010-09-23 23:22:21 +02:00
2020-02-09 17:55:09 +01:00
if ( '' != $postdata [ 'post_date' ] ) {
2017-12-01 00:11:00 +01:00
$post_date = $this -> _convert_date ( $postdata [ 'post_date' ] );
$post_date_gmt = $this -> _convert_date_gmt ( $postdata [ 'post_date_gmt' ], $postdata [ 'post_date' ] );
$post_modified = $this -> _convert_date ( $postdata [ 'post_modified' ] );
2012-04-04 23:32:28 +02:00
$post_modified_gmt = $this -> _convert_date_gmt ( $postdata [ 'post_modified_gmt' ], $postdata [ 'post_modified' ] );
2010-09-23 23:22:21 +02:00
$categories = array ();
2017-12-01 00:11:00 +01:00
$catids = wp_get_post_categories ( $post_ID );
foreach ( $catids as $catid ) {
$categories [] = get_cat_name ( $catid );
}
2010-09-23 23:22:21 +02:00
$tagnames = array ();
2017-12-01 00:11:00 +01:00
$tags = wp_get_post_tags ( $post_ID );
if ( ! empty ( $tags ) ) {
foreach ( $tags as $tag ) {
2010-09-23 23:22:21 +02:00
$tagnames [] = $tag -> name ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$tagnames = implode ( ', ' , $tagnames );
} else {
$tagnames = '' ;
}
2017-12-01 00:11:00 +01:00
$post = get_extended ( $postdata [ 'post_content' ] );
$link = get_permalink ( $postdata [ 'ID' ] );
2010-09-23 23:22:21 +02:00
// Get the author info.
2017-12-01 00:11:00 +01:00
$author = get_userdata ( $postdata [ 'post_author' ] );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$allow_comments = ( 'open' == $postdata [ 'comment_status' ] ) ? 1 : 0 ;
$allow_pings = ( 'open' == $postdata [ 'ping_status' ] ) ? 1 : 0 ;
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Consider future posts as published.
2020-02-09 17:55:09 +01:00
if ( 'future' === $postdata [ 'post_status' ] ) {
2010-09-23 23:22:21 +02:00
$postdata [ 'post_status' ] = 'publish' ;
2017-12-01 00:11:00 +01:00
}
2010-12-13 22:21:50 +01:00
2020-01-29 01:45:18 +01:00
// Get post format.
2010-11-19 14:57:05 +01:00
$post_format = get_post_format ( $post_ID );
2017-12-01 00:11:00 +01:00
if ( empty ( $post_format ) ) {
2010-12-02 05:38:42 +01:00
$post_format = 'standard' ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$sticky = false ;
2017-12-01 00:11:00 +01:00
if ( is_sticky ( $post_ID ) ) {
2010-09-23 23:22:21 +02:00
$sticky = true ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$enclosure = array ();
2017-12-01 00:11:00 +01:00
foreach ( ( array ) get_post_custom ( $post_ID ) as $key => $val ) {
2020-02-09 17:55:09 +01:00
if ( 'enclosure' === $key ) {
2010-09-23 23:22:21 +02:00
foreach ( ( array ) $val as $enc ) {
2017-12-01 00:11:00 +01:00
$encdata = explode ( " \n " , $enc );
$enclosure [ 'url' ] = trim ( htmlspecialchars ( $encdata [ 0 ] ) );
$enclosure [ 'length' ] = ( int ) trim ( $encdata [ 1 ] );
$enclosure [ 'type' ] = trim ( $encdata [ 2 ] );
2010-09-23 23:22:21 +02:00
break 2 ;
}
}
}
$resp = array (
2017-12-01 00:11:00 +01:00
'dateCreated' => $post_date ,
'userid' => $postdata [ 'post_author' ],
'postid' => $postdata [ 'ID' ],
'description' => $post [ 'main' ],
'title' => $postdata [ 'post_title' ],
'link' => $link ,
'permaLink' => $link ,
2020-01-29 01:45:18 +01:00
// Commented out because no other tool seems to use this.
// 'content' => $entry['post_content'],
2017-12-01 00:11:00 +01:00
'categories' => $categories ,
'mt_excerpt' => $postdata [ 'post_excerpt' ],
'mt_text_more' => $post [ 'extended' ],
'wp_more_text' => $post [ 'more_text' ],
'mt_allow_comments' => $allow_comments ,
'mt_allow_pings' => $allow_pings ,
'mt_keywords' => $tagnames ,
'wp_slug' => $postdata [ 'post_name' ],
'wp_password' => $postdata [ 'post_password' ],
'wp_author_id' => ( string ) $author -> ID ,
2012-04-04 23:32:28 +02:00
'wp_author_display_name' => $author -> display_name ,
2017-12-01 00:11:00 +01:00
'date_created_gmt' => $post_date_gmt ,
'post_status' => $postdata [ 'post_status' ],
'custom_fields' => $this -> get_custom_fields ( $post_ID ),
'wp_post_format' => $post_format ,
'sticky' => $sticky ,
'date_modified' => $post_modified ,
'date_modified_gmt' => $post_modified_gmt ,
2010-09-23 23:22:21 +02:00
);
2017-12-01 00:11:00 +01:00
if ( ! empty ( $enclosure ) ) {
$resp [ 'enclosure' ] = $enclosure ;
}
2010-09-23 23:22:21 +02:00
2012-04-26 22:56:52 +02:00
$resp [ 'wp_post_thumbnail' ] = get_post_thumbnail_id ( $postdata [ 'ID' ] );
2012-03-23 16:35:44 +01:00
2010-09-23 23:22:21 +02:00
return $resp ;
} else {
2017-12-01 00:11:00 +01:00
return new IXR_Error ( 404 , __ ( 'Sorry, no such post.' ) );
2010-09-23 23:22:21 +02:00
}
}
/**
* Retrieve list of recent posts .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $numberposts
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mw_getRecentPosts ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2017-12-01 00:11:00 +01:00
if ( isset ( $args [ 3 ] ) ) {
2010-11-09 11:16:23 +01:00
$query = array ( 'numberposts' => absint ( $args [ 3 ] ) );
2017-12-01 00:11:00 +01:00
} else {
2010-11-09 11:16:23 +01:00
$query = array ();
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit posts.' ) );
2017-12-01 00:11:00 +01:00
}
2013-03-07 07:52:37 +01:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'metaWeblog.getRecentPosts' );
2010-09-23 23:22:21 +02:00
2010-11-09 11:16:23 +01:00
$posts_list = wp_get_recent_posts ( $query );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $posts_list ) {
2012-03-02 19:06:30 +01:00
return array ();
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-11-01 20:45:25 +01:00
$recent_posts = array ();
2017-12-01 00:11:00 +01:00
foreach ( $posts_list as $entry ) {
if ( ! current_user_can ( 'edit_post' , $entry [ 'ID' ] ) ) {
2010-09-23 23:22:21 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$post_date = $this -> _convert_date ( $entry [ 'post_date' ] );
$post_date_gmt = $this -> _convert_date_gmt ( $entry [ 'post_date_gmt' ], $entry [ 'post_date' ] );
$post_modified = $this -> _convert_date ( $entry [ 'post_modified' ] );
2012-04-04 23:32:28 +02:00
$post_modified_gmt = $this -> _convert_date_gmt ( $entry [ 'post_modified_gmt' ], $entry [ 'post_modified' ] );
2010-09-23 23:22:21 +02:00
$categories = array ();
2017-12-01 00:11:00 +01:00
$catids = wp_get_post_categories ( $entry [ 'ID' ] );
foreach ( $catids as $catid ) {
$categories [] = get_cat_name ( $catid );
}
2010-09-23 23:22:21 +02:00
$tagnames = array ();
2017-12-01 00:11:00 +01:00
$tags = wp_get_post_tags ( $entry [ 'ID' ] );
if ( ! empty ( $tags ) ) {
2010-09-23 23:22:21 +02:00
foreach ( $tags as $tag ) {
$tagnames [] = $tag -> name ;
}
$tagnames = implode ( ', ' , $tagnames );
} else {
$tagnames = '' ;
}
2017-12-01 00:11:00 +01:00
$post = get_extended ( $entry [ 'post_content' ] );
$link = get_permalink ( $entry [ 'ID' ] );
2010-09-23 23:22:21 +02:00
// Get the post author info.
2017-12-01 00:11:00 +01:00
$author = get_userdata ( $entry [ 'post_author' ] );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$allow_comments = ( 'open' == $entry [ 'comment_status' ] ) ? 1 : 0 ;
$allow_pings = ( 'open' == $entry [ 'ping_status' ] ) ? 1 : 0 ;
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Consider future posts as published.
2020-02-09 17:55:09 +01:00
if ( 'future' === $entry [ 'post_status' ] ) {
2010-09-23 23:22:21 +02:00
$entry [ 'post_status' ] = 'publish' ;
2017-12-01 00:11:00 +01:00
}
2010-12-13 22:21:50 +01:00
2020-01-29 01:45:18 +01:00
// Get post format.
2010-11-19 14:57:05 +01:00
$post_format = get_post_format ( $entry [ 'ID' ] );
2017-12-01 00:11:00 +01:00
if ( empty ( $post_format ) ) {
2010-12-02 05:38:42 +01:00
$post_format = 'standard' ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-11-01 20:45:25 +01:00
$recent_posts [] = array (
2017-12-01 00:11:00 +01:00
'dateCreated' => $post_date ,
'userid' => $entry [ 'post_author' ],
'postid' => ( string ) $entry [ 'ID' ],
'description' => $post [ 'main' ],
'title' => $entry [ 'post_title' ],
'link' => $link ,
'permaLink' => $link ,
2020-01-29 01:45:18 +01:00
// Commented out because no other tool seems to use this.
2010-09-23 23:22:21 +02:00
// 'content' => $entry['post_content'],
2017-12-01 00:11:00 +01:00
'categories' => $categories ,
'mt_excerpt' => $entry [ 'post_excerpt' ],
'mt_text_more' => $post [ 'extended' ],
'wp_more_text' => $post [ 'more_text' ],
'mt_allow_comments' => $allow_comments ,
'mt_allow_pings' => $allow_pings ,
'mt_keywords' => $tagnames ,
'wp_slug' => $entry [ 'post_name' ],
'wp_password' => $entry [ 'post_password' ],
'wp_author_id' => ( string ) $author -> ID ,
2010-09-23 23:22:21 +02:00
'wp_author_display_name' => $author -> display_name ,
2017-12-01 00:11:00 +01:00
'date_created_gmt' => $post_date_gmt ,
'post_status' => $entry [ 'post_status' ],
'custom_fields' => $this -> get_custom_fields ( $entry [ 'ID' ] ),
'wp_post_format' => $post_format ,
'date_modified' => $post_modified ,
'date_modified_gmt' => $post_modified_gmt ,
2020-02-09 17:55:09 +01:00
'sticky' => ( 'post' === $entry [ 'post_type' ] && is_sticky ( $entry [ 'ID' ] ) ),
2017-12-01 00:11:00 +01:00
'wp_post_thumbnail' => get_post_thumbnail_id ( $entry [ 'ID' ] ),
2010-09-23 23:22:21 +02:00
);
}
return $recent_posts ;
}
/**
* Retrieve the list of categories on a given blog .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mw_getCategories ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2010-09-23 23:22:21 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'metaWeblog.getCategories' );
2010-09-23 23:22:21 +02:00
$categories_struct = array ();
2019-07-03 01:42:58 +02:00
$cats = get_categories ( array ( 'get' => 'all' ) );
if ( $cats ) {
2010-09-23 23:22:21 +02:00
foreach ( $cats as $cat ) {
2017-12-01 00:11:00 +01:00
$struct = array ();
$struct [ 'categoryId' ] = $cat -> term_id ;
$struct [ 'parentId' ] = $cat -> parent ;
$struct [ 'description' ] = $cat -> name ;
2010-09-23 23:22:21 +02:00
$struct [ 'categoryDescription' ] = $cat -> description ;
2017-12-01 00:11:00 +01:00
$struct [ 'categoryName' ] = $cat -> name ;
$struct [ 'htmlUrl' ] = esc_html ( get_category_link ( $cat -> term_id ) );
$struct [ 'rssUrl' ] = esc_html ( get_category_feed_link ( $cat -> term_id , 'rss2' ) );
2010-09-23 23:22:21 +02:00
$categories_struct [] = $struct ;
}
}
return $categories_struct ;
}
/**
* Uploads a file , following your settings .
*
* Adapted from a patch by Johann Richard .
*
* @ link http :// mycvs . org / archives / 2004 / 06 / 30 / file - upload - to - wordpress - in - ecto /
*
* @ since 1.5 . 0
*
2016-10-10 08:38:31 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type array $data
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mw_newMediaObject ( $args ) {
2016-10-10 08:38:31 +02:00
global $wpdb ;
2015-05-22 21:37:24 +02:00
$username = $this -> escape ( $args [ 1 ] );
$password = $this -> escape ( $args [ 2 ] );
$data = $args [ 3 ];
2010-09-23 23:22:21 +02:00
$name = sanitize_file_name ( $data [ 'name' ] );
$type = $data [ 'type' ];
$bits = $data [ 'bits' ];
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'metaWeblog.newMediaObject' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'upload_files' ) ) {
2016-06-29 17:16:29 +02:00
$this -> error = new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to upload files.' ) );
2010-09-23 23:22:21 +02:00
return $this -> error ;
}
2015-09-26 21:49:25 +02:00
if ( is_multisite () && upload_is_user_over_quota ( false ) ) {
2019-04-01 14:24:51 +02:00
$this -> error = new IXR_Error (
401 ,
sprintf (
2019-09-03 02:41:05 +02:00
/* translators: %s: Allowed space allocation. */
2019-04-01 14:24:51 +02:00
__ ( 'Sorry, you have used your space allocation of %s. Please delete some files to upload more files.' ),
size_format ( get_space_allowed () * MB_IN_BYTES )
)
);
2015-09-26 21:49:25 +02:00
return $this -> error ;
}
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters whether to preempt the XML - RPC media upload .
2014-03-26 06:44:16 +01:00
*
* Passing a truthy value will effectively short - circuit the media upload ,
* returning that value as a 500 error instead .
*
* @ since 2.1 . 0
*
* @ param bool $error Whether to pre - empt the media upload . Default false .
*/
2019-07-03 01:42:58 +02:00
$upload_err = apply_filters ( 'pre_upload_error' , false );
if ( $upload_err ) {
2014-03-26 06:44:16 +01:00
return new IXR_Error ( 500 , $upload_err );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$upload = wp_upload_bits ( $name , null , $bits );
if ( ! empty ( $upload [ 'error' ] ) ) {
2019-09-03 02:41:05 +02:00
/* translators: 1: File name, 2: Error message. */
2016-09-02 06:13:28 +02:00
$errorString = sprintf ( __ ( 'Could not write file %1$s (%2$s).' ), $name , $upload [ 'error' ] );
return new IXR_Error ( 500 , $errorString );
2010-09-23 23:22:21 +02:00
}
2020-01-29 01:45:18 +01:00
// Construct the attachment array.
2010-09-23 23:22:21 +02:00
$post_id = 0 ;
2012-09-18 21:06:27 +02:00
if ( ! empty ( $data [ 'post_id' ] ) ) {
$post_id = ( int ) $data [ 'post_id' ];
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post_id ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2017-12-01 00:11:00 +01:00
}
2012-09-18 21:06:27 +02:00
}
2010-09-23 23:22:21 +02:00
$attachment = array (
2017-12-01 00:11:00 +01:00
'post_title' => $name ,
'post_content' => '' ,
'post_type' => 'attachment' ,
'post_parent' => $post_id ,
2010-09-23 23:22:21 +02:00
'post_mime_type' => $type ,
2017-12-01 00:11:00 +01:00
'guid' => $upload [ 'url' ],
2010-09-23 23:22:21 +02:00
);
2020-01-29 01:45:18 +01:00
// Save the data.
2017-12-01 00:11:00 +01:00
$id = wp_insert_attachment ( $attachment , $upload [ 'file' ], $post_id );
2010-09-23 23:22:21 +02:00
wp_update_attachment_metadata ( $id , wp_generate_attachment_metadata ( $id , $upload [ 'file' ] ) );
2014-03-26 06:44:16 +01:00
/**
* Fires after a new attachment has been added via the XML - RPC MovableType API .
*
* @ since 3.4 . 0
*
* @ param int $id ID of the new attachment .
* @ param array $args An array of arguments to add the attachment .
*/
2019-07-05 03:45:56 +02:00
do_action ( 'xmlrpc_call_success_mw_newMediaObject' , $id , $args ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
2012-03-08 14:12:06 +01:00
2015-09-26 07:15:25 +02:00
$struct = $this -> _prepare_media_item ( get_post ( $id ) );
2020-01-29 01:45:18 +01:00
// Deprecated values.
2015-09-26 07:15:25 +02:00
$struct [ 'id' ] = $struct [ 'attachment_id' ];
$struct [ 'file' ] = $struct [ 'title' ];
$struct [ 'url' ] = $struct [ 'link' ];
2014-03-24 03:45:15 +01:00
2015-09-17 06:46:25 +02:00
return $struct ;
2010-09-23 23:22:21 +02:00
}
2020-01-29 01:45:18 +01:00
/*
* MovableType API functions .
* Specs on http :// www . movabletype . org / docs / mtmanual_programmatic . html
2010-09-23 23:22:21 +02:00
*/
/**
* Retrieve the post titles of recent posts .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* @ type int $numberposts
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mt_getRecentPostTitles ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2017-12-01 00:11:00 +01:00
if ( isset ( $args [ 3 ] ) ) {
2010-11-09 11:16:23 +01:00
$query = array ( 'numberposts' => absint ( $args [ 3 ] ) );
2017-12-01 00:11:00 +01:00
} else {
2010-11-09 11:16:23 +01:00
$query = array ();
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'mt.getRecentPostTitles' );
2010-09-23 23:22:21 +02:00
2010-11-09 11:16:23 +01:00
$posts_list = wp_get_recent_posts ( $query );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $posts_list ) {
$this -> error = new IXR_Error ( 500 , __ ( 'Either there are no posts, or something went wrong.' ) );
2010-09-23 23:22:21 +02:00
return $this -> error ;
}
2014-11-03 04:04:22 +01:00
$recent_posts = array ();
2012-04-08 11:40:04 +02:00
2017-12-01 00:11:00 +01:00
foreach ( $posts_list as $entry ) {
if ( ! current_user_can ( 'edit_post' , $entry [ 'ID' ] ) ) {
2010-09-23 23:22:21 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$post_date = $this -> _convert_date ( $entry [ 'post_date' ] );
2012-04-04 23:32:28 +02:00
$post_date_gmt = $this -> _convert_date_gmt ( $entry [ 'post_date_gmt' ], $entry [ 'post_date' ] );
2010-09-23 23:22:21 +02:00
2014-11-03 04:04:22 +01:00
$recent_posts [] = array (
2017-12-01 00:11:00 +01:00
'dateCreated' => $post_date ,
'userid' => $entry [ 'post_author' ],
'postid' => ( string ) $entry [ 'ID' ],
'title' => $entry [ 'post_title' ],
'post_status' => $entry [ 'post_status' ],
'date_created_gmt' => $post_date_gmt ,
2010-09-23 23:22:21 +02:00
);
}
return $recent_posts ;
}
/**
* Retrieve list of all categories on blog .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $blog_id ( unused )
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mt_getCategoryList ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_posts' ) ) {
2010-09-23 23:22:21 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'mt.getCategoryList' );
2010-09-23 23:22:21 +02:00
$categories_struct = array ();
2019-07-03 01:42:58 +02:00
$cats = get_categories (
2017-12-01 00:11:00 +01:00
array (
'hide_empty' => 0 ,
'hierarchical' => 0 ,
)
2019-07-03 01:42:58 +02:00
);
if ( $cats ) {
2010-09-23 23:22:21 +02:00
foreach ( $cats as $cat ) {
2017-12-01 00:11:00 +01:00
$struct = array ();
$struct [ 'categoryId' ] = $cat -> term_id ;
2010-09-23 23:22:21 +02:00
$struct [ 'categoryName' ] = $cat -> name ;
$categories_struct [] = $struct ;
}
}
return $categories_struct ;
}
/**
* Retrieve post categories .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $post_ID
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mt_getPostCategories ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$post_ID = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! get_post ( $post_ID ) ) {
2012-04-30 02:19:32 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-04-30 02:19:32 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post_ID ) ) {
2016-07-07 13:33:33 +02:00
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'mt.getPostCategories' );
2010-09-23 23:22:21 +02:00
$categories = array ();
2017-12-01 00:11:00 +01:00
$catids = wp_get_post_categories ( intval ( $post_ID ) );
2020-01-29 01:45:18 +01:00
// First listed category will be the primary category.
2010-09-23 23:22:21 +02:00
$isPrimary = true ;
foreach ( $catids as $catid ) {
$categories [] = array (
2017-12-01 00:11:00 +01:00
'categoryName' => get_cat_name ( $catid ),
'categoryId' => ( string ) $catid ,
'isPrimary' => $isPrimary ,
2010-09-23 23:22:21 +02:00
);
2017-12-01 00:11:00 +01:00
$isPrimary = false ;
2010-09-23 23:22:21 +02:00
}
return $categories ;
}
/**
* Sets categories for a post .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $post_ID
* @ type string $username
* @ type string $password
* @ type array $categories
* }
* @ return true | IXR_Error True on success .
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mt_setPostCategories ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$post_ID = ( int ) $args [ 0 ];
$username = $args [ 1 ];
2010-09-23 23:22:21 +02:00
$password = $args [ 2 ];
2015-05-22 21:37:24 +02:00
$categories = $args [ 3 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'mt.setPostCategories' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! get_post ( $post_ID ) ) {
2012-04-30 02:19:32 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-04-30 02:19:32 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'edit_post' , $post_ID ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to edit this post.' ) );
}
2010-09-23 23:22:21 +02:00
2012-11-16 23:14:57 +01:00
$catids = array ();
2010-09-23 23:22:21 +02:00
foreach ( $categories as $cat ) {
$catids [] = $cat [ 'categoryId' ];
}
2017-12-01 00:11:00 +01:00
wp_set_post_categories ( $post_ID , $catids );
2010-09-23 23:22:21 +02:00
return true ;
}
/**
* Retrieve an array of methods supported by this server .
*
* @ since 1.5 . 0
*
* @ return array
*/
2015-05-22 21:37:24 +02:00
public function mt_supportedMethods () {
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'mt.supportedMethods' );
2010-09-23 23:22:21 +02:00
2015-05-22 21:37:24 +02:00
return array_keys ( $this -> methods );
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve an empty array because we don ' t support per - post text filters .
*
* @ since 1.5 . 0
*/
2015-05-22 21:37:24 +02:00
public function mt_supportedTextFilters () {
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'mt.supportedTextFilters' );
/**
2016-05-22 20:15:28 +02:00
* Filters the MoveableType text filters list for XML - RPC .
2014-03-26 06:44:16 +01:00
*
* @ since 2.2 . 0
*
* @ param array $filters An array of text filters .
*/
return apply_filters ( 'xmlrpc_text_filters' , array () );
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve trackbacks sent to a given post .
*
* @ since 1.5 . 0
*
2016-10-10 08:38:31 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
*
2015-05-22 21:37:24 +02:00
* @ param int $post_ID
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mt_getTrackbackPings ( $post_ID ) {
2016-10-10 08:38:31 +02:00
global $wpdb ;
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'mt.getTrackbackPings' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$actual_post = get_post ( $post_ID , ARRAY_A );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $actual_post ) {
return new IXR_Error ( 404 , __ ( 'Sorry, no such post.' ) );
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$comments = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d " , $post_ID ) );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $comments ) {
2010-09-23 23:22:21 +02:00
return array ();
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$trackback_pings = array ();
foreach ( $comments as $comment ) {
if ( 'trackback' == $comment -> comment_type ) {
2017-12-01 00:11:00 +01:00
$content = $comment -> comment_content ;
$title = substr ( $content , 8 , ( strpos ( $content , '</strong>' ) - 8 ) );
2010-09-23 23:22:21 +02:00
$trackback_pings [] = array (
'pingTitle' => $title ,
'pingURL' => $comment -> comment_author_url ,
2017-12-01 00:11:00 +01:00
'pingIP' => $comment -> comment_author_IP ,
2010-09-23 23:22:21 +02:00
);
}
}
return $trackback_pings ;
}
/**
* Sets a post 's publish status to ' publish ' .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type int $post_ID
* @ type string $username
* @ type string $password
* }
2014-11-03 04:04:22 +01:00
* @ return int | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function mt_publishPost ( $args ) {
$this -> escape ( $args );
2013-03-01 17:28:40 +01:00
2015-05-22 21:37:24 +02:00
$post_ID = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
2010-09-23 23:22:21 +02:00
2019-07-03 01:42:58 +02:00
$user = $this -> login ( $username , $password );
if ( ! $user ) {
2010-09-23 23:22:21 +02:00
return $this -> error ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'mt.publishPost' );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$postdata = get_post ( $post_ID , ARRAY_A );
if ( ! $postdata ) {
2012-04-30 02:19:32 +02:00
return new IXR_Error ( 404 , __ ( 'Invalid post ID.' ) );
2017-12-01 00:11:00 +01:00
}
2012-04-30 02:19:32 +02:00
2017-12-01 00:11:00 +01:00
if ( ! current_user_can ( 'publish_posts' ) || ! current_user_can ( 'edit_post' , $post_ID ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to publish this post.' ) );
}
2010-09-23 23:22:21 +02:00
$postdata [ 'post_status' ] = 'publish' ;
2020-01-29 01:45:18 +01:00
// Retain old categories.
$postdata [ 'post_category' ] = wp_get_post_categories ( $post_ID );
2017-12-01 00:11:00 +01:00
$this -> escape ( $postdata );
2010-09-23 23:22:21 +02:00
2015-05-22 21:37:24 +02:00
return wp_update_post ( $postdata );
2010-09-23 23:22:21 +02:00
}
2020-01-29 01:45:18 +01:00
/*
* Pingback functions .
* Specs on www . hixie . ch / specs / pingback / pingback
2010-09-23 23:22:21 +02:00
*/
/**
* Retrieves a pingback and registers it .
*
* @ since 1.5 . 0
*
2020-01-29 01:45:18 +01:00
* @ param array $args {
2015-05-25 08:25:25 +02:00
* Method arguments . Note : arguments must be ordered as documented .
2015-05-22 21:37:24 +02:00
*
* @ type string $pagelinkedfrom
* @ type string $pagelinkedto
* }
2014-11-03 04:04:22 +01:00
* @ return string | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function pingback_ping ( $args ) {
2016-10-11 03:43:31 +02:00
global $wpdb ;
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'pingback.ping' );
2010-09-23 23:22:21 +02:00
2015-05-22 21:37:24 +02:00
$this -> escape ( $args );
2010-09-23 23:22:21 +02:00
2015-05-22 21:37:24 +02:00
$pagelinkedfrom = str_replace ( '&' , '&' , $args [ 0 ] );
2017-12-01 00:11:00 +01:00
$pagelinkedto = str_replace ( '&' , '&' , $args [ 1 ] );
$pagelinkedto = str_replace ( '&' , '&' , $pagelinkedto );
2010-09-23 23:22:21 +02:00
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters the pingback source URI .
2014-03-26 06:44:16 +01:00
*
* @ since 3.6 . 0
*
* @ param string $pagelinkedfrom URI of the page linked from .
* @ param string $pagelinkedto URI of the page linked to .
*/
2013-01-22 23:30:08 +01:00
$pagelinkedfrom = apply_filters ( 'pingback_ping_source_uri' , $pagelinkedfrom , $pagelinkedto );
2014-03-26 06:44:16 +01:00
2017-12-01 00:11:00 +01:00
if ( ! $pagelinkedfrom ) {
2013-01-22 23:30:08 +01:00
return $this -> pingback_error ( 0 , __ ( 'A valid URL was not provided.' ) );
2017-12-01 00:11:00 +01:00
}
2013-01-22 23:30:08 +01:00
2020-01-29 01:45:18 +01:00
// Check if the page linked to is on our site.
2017-12-01 00:11:00 +01:00
$pos1 = strpos ( $pagelinkedto , str_replace ( array ( 'http://www.' , 'http://' , 'https://www.' , 'https://' ), '' , get_option ( 'home' ) ) );
if ( ! $pos1 ) {
2013-01-22 23:30:08 +01:00
return $this -> pingback_error ( 0 , __ ( 'Is there no link to us?' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
/*
* Let ' s find which post is linked to .
* FIXME : Does url_to_postid () cover all these cases already ?
* If so , then let ' s use it and drop the old code .
*/
2017-12-01 00:11:00 +01:00
$urltest = parse_url ( $pagelinkedto );
2019-07-03 01:42:58 +02:00
$post_ID = url_to_postid ( $pagelinkedto );
if ( $post_ID ) {
2014-11-01 02:50:21 +01:00
// $way
2017-12-01 00:11:00 +01:00
} elseif ( isset ( $urltest [ 'path' ] ) && preg_match ( '#p/[0-9]{1,}#' , $urltest [ 'path' ], $match ) ) {
2020-01-29 01:45:18 +01:00
// The path defines the post_ID (archives/p/XXXX).
2017-12-01 00:11:00 +01:00
$blah = explode ( '/' , $match [ 0 ] );
2010-09-23 23:22:21 +02:00
$post_ID = ( int ) $blah [ 1 ];
2017-12-01 00:11:00 +01:00
} elseif ( isset ( $urltest [ 'query' ] ) && preg_match ( '#p=[0-9]{1,}#' , $urltest [ 'query' ], $match ) ) {
2020-01-29 01:45:18 +01:00
// The query string defines the post_ID (?p=XXXX).
2017-12-01 00:11:00 +01:00
$blah = explode ( '=' , $match [ 0 ] );
2010-09-23 23:22:21 +02:00
$post_ID = ( int ) $blah [ 1 ];
2017-12-01 00:11:00 +01:00
} elseif ( isset ( $urltest [ 'fragment' ] ) ) {
2020-01-29 01:45:18 +01:00
// An #anchor is there, it's either...
2017-12-01 00:11:00 +01:00
if ( intval ( $urltest [ 'fragment' ] ) ) {
2020-01-29 01:45:18 +01:00
// ...an integer #XXXX (simplest case),
2010-09-23 23:22:21 +02:00
$post_ID = ( int ) $urltest [ 'fragment' ];
2017-12-01 00:11:00 +01:00
} elseif ( preg_match ( '/post-[0-9]+/' , $urltest [ 'fragment' ] ) ) {
2020-01-29 01:45:18 +01:00
// ...a post ID in the form 'post-###',
2017-12-01 00:11:00 +01:00
$post_ID = preg_replace ( '/[^0-9]+/' , '' , $urltest [ 'fragment' ] );
} elseif ( is_string ( $urltest [ 'fragment' ] ) ) {
2020-01-29 01:45:18 +01:00
// ...or a string #title, a little more complicated.
2019-07-03 01:42:58 +02:00
$title = preg_replace ( '/[^a-z0-9]/i' , '.' , $urltest [ 'fragment' ] );
$sql = $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s " , $title );
$post_ID = $wpdb -> get_var ( $sql );
if ( ! $post_ID ) {
2020-01-29 01:45:18 +01:00
// Returning unknown error '0' is better than die()'ing.
2017-12-01 00:11:00 +01:00
return $this -> pingback_error ( 0 , '' );
2010-09-23 23:22:21 +02:00
}
}
} else {
2020-01-29 01:45:18 +01:00
// TODO: Attempt to extract a post ID from the given URL.
2017-12-01 00:11:00 +01:00
return $this -> pingback_error ( 33 , __ ( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) );
2010-09-23 23:22:21 +02:00
}
$post_ID = ( int ) $post_ID ;
2017-12-01 00:11:00 +01:00
$post = get_post ( $post_ID );
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
if ( ! $post ) { // Post not found.
2017-12-01 00:11:00 +01:00
return $this -> pingback_error ( 33 , __ ( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) );
}
2010-09-23 23:22:21 +02:00
2020-02-09 17:55:09 +01:00
if ( url_to_postid ( $pagelinkedfrom ) == $post_ID ) {
2013-01-22 23:30:08 +01:00
return $this -> pingback_error ( 0 , __ ( 'The source URL and the target URL cannot both point to the same resource.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Check if pings are on.
2017-12-01 00:11:00 +01:00
if ( ! pings_open ( $post ) ) {
return $this -> pingback_error ( 33 , __ ( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) );
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Let's check that the remote site didn't already pingback this entry.
2017-12-01 00:11:00 +01:00
if ( $wpdb -> get_results ( $wpdb -> prepare ( " SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s " , $post_ID , $pagelinkedfrom ) ) ) {
2013-01-22 23:30:08 +01:00
return $this -> pingback_error ( 48 , __ ( 'The pingback has already been registered.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// Very stupid, but gives time to the 'from' server to publish!
2017-12-01 00:11:00 +01:00
sleep ( 1 );
2010-09-23 23:22:21 +02:00
2014-03-31 22:43:18 +02:00
$remote_ip = preg_replace ( '/[^0-9a-fA-F:., ]/' , '' , $_SERVER [ 'REMOTE_ADDR' ] );
2014-04-12 02:01:15 +02:00
/** This filter is documented in wp-includes/class-http.php */
2019-11-19 12:07:03 +01:00
$user_agent = apply_filters ( 'http_headers_useragent' , 'WordPress/' . get_bloginfo ( 'version' ) . '; ' . get_bloginfo ( 'url' ), $pagelinkedfrom );
2014-03-31 22:43:18 +02:00
2020-01-29 01:45:18 +01:00
// Let's check the remote site.
2013-07-29 20:00:06 +02:00
$http_api_args = array (
2017-12-01 00:11:00 +01:00
'timeout' => 10 ,
'redirection' => 0 ,
2013-07-29 20:00:06 +02:00
'limit_response_size' => 153600 , // 150 KB
2017-12-01 00:11:00 +01:00
'user-agent' => " $user_agent ; verifying pingback from $remote_ip " ,
'headers' => array (
2014-03-31 22:43:18 +02:00
'X-Pingback-Forwarded-For' => $remote_ip ,
),
2013-07-29 20:00:06 +02:00
);
2016-02-24 01:55:26 +01:00
2019-07-03 01:42:58 +02:00
$request = wp_safe_remote_get ( $pagelinkedfrom , $http_api_args );
$remote_source = wp_remote_retrieve_body ( $request );
$remote_source_original = $remote_source ;
2013-06-21 08:07:47 +02:00
2016-02-24 01:55:26 +01:00
if ( ! $remote_source ) {
2014-03-26 06:44:16 +01:00
return $this -> pingback_error ( 16 , __ ( 'The source URL does not exist.' ) );
2016-02-24 01:55:26 +01:00
}
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters the pingback remote source .
2014-03-26 06:44:16 +01:00
*
* @ since 2.5 . 0
*
2016-02-24 01:55:26 +01:00
* @ param string $remote_source Response source for the page linked from .
* @ param string $pagelinkedto URL of the page linked to .
2014-03-26 06:44:16 +01:00
*/
2016-02-24 01:55:26 +01:00
$remote_source = apply_filters ( 'pre_remote_source' , $remote_source , $pagelinkedto );
2010-09-23 23:22:21 +02:00
// Work around bug in strip_tags():
2016-02-24 01:55:26 +01:00
$remote_source = str_replace ( '<!DOC' , '<DOC' , $remote_source );
$remote_source = preg_replace ( '/[\r\n\t ]+/' , ' ' , $remote_source ); // normalize spaces
2017-12-01 00:11:00 +01:00
$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 );
2010-09-23 23:22:21 +02:00
2016-02-24 01:55:26 +01:00
preg_match ( '|<title>([^<]*?)</title>|is' , $remote_source , $matchtitle );
2016-09-18 16:26:29 +02:00
$title = isset ( $matchtitle [ 1 ] ) ? $matchtitle [ 1 ] : '' ;
if ( empty ( $title ) ) {
return $this -> pingback_error ( 32 , __ ( 'We cannot find a title on that page.' ) );
}
2010-09-23 23:22:21 +02:00
2019-08-17 15:59:55 +02:00
// Remove all script and style tags including their content.
$remote_source = preg_replace ( '@<(script|style)[^>]*?>.*?</\\1>@si' , '' , $remote_source );
// Just keep the tag we need.
$remote_source = strip_tags ( $remote_source , '<a>' );
2010-09-23 23:22:21 +02:00
2016-02-24 01:55:26 +01:00
$p = explode ( " \n \n " , $remote_source );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$preg_target = preg_quote ( $pagelinkedto , '|' );
2010-09-23 23:22:21 +02:00
foreach ( $p as $para ) {
2020-01-29 01:45:18 +01:00
if ( strpos ( $para , $pagelinkedto ) !== false ) { // It exists, but is it a link?
2017-12-01 00:11:00 +01:00
preg_match ( '|<a[^>]+?' . $preg_target . '[^>]*>([^>]+?)</a>|' , $para , $context );
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// If the URL isn't in a link context, keep looking.
2017-12-01 00:11:00 +01:00
if ( empty ( $context ) ) {
2010-09-23 23:22:21 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2020-01-29 01:45:18 +01:00
// We're going to use this fake tag to mark the context in a bit.
// The marker is needed in case the link text appears more than once in the paragraph.
2017-12-01 00:11:00 +01:00
$excerpt = preg_replace ( '|\</?wpcontext\>|' , '' , $para );
2010-09-23 23:22:21 +02:00
// prevent really long link text
2017-12-01 00:11:00 +01:00
if ( strlen ( $context [ 1 ] ) > 100 ) {
$context [ 1 ] = substr ( $context [ 1 ], 0 , 100 ) . '…' ;
}
2020-01-29 01:45:18 +01:00
$marker = '<wpcontext>' . $context [ 1 ] . '</wpcontext>' ; // Set up our marker.
$excerpt = str_replace ( $context [ 0 ], $marker , $excerpt ); // Swap out the link for our marker.
$excerpt = strip_tags ( $excerpt , '<wpcontext>' ); // Strip all tags but our context marker.
2017-12-01 00:11:00 +01:00
$excerpt = trim ( $excerpt );
$preg_marker = preg_quote ( $marker , '|' );
$excerpt = preg_replace ( " |.*? \ s(. { 0,100} $preg_marker . { 0,100}) \ s.*|s " , '$1' , $excerpt );
2020-01-29 01:45:18 +01:00
$excerpt = strip_tags ( $excerpt ); // YES, again, to remove the marker wrapper.
2010-09-23 23:22:21 +02:00
break ;
}
}
2020-01-29 01:45:18 +01:00
if ( empty ( $context ) ) { // Link to target not found.
2013-01-22 23:30:08 +01:00
return $this -> pingback_error ( 17 , __ ( 'The source URL does not contain a link to the target URL, and so cannot be used as a source.' ) );
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$pagelinkedfrom = str_replace ( '&' , '&' , $pagelinkedfrom );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$context = '[…] ' . esc_html ( $excerpt ) . ' […]' ;
2013-07-16 16:38:54 +02:00
$pagelinkedfrom = $this -> escape ( $pagelinkedfrom );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$comment_post_ID = ( int ) $post_ID ;
$comment_author = $title ;
2010-12-11 08:17:50 +01:00
$comment_author_email = '' ;
2017-12-01 00:11:00 +01:00
$this -> escape ( $comment_author );
2010-09-23 23:22:21 +02:00
$comment_author_url = $pagelinkedfrom ;
2017-12-01 00:11:00 +01:00
$comment_content = $context ;
$this -> escape ( $comment_content );
2010-09-23 23:22:21 +02:00
$comment_type = 'pingback' ;
2016-02-24 01:55:26 +01:00
$commentdata = compact (
2018-08-17 03:51:36 +02:00
'comment_post_ID' ,
'comment_author' ,
'comment_author_url' ,
'comment_author_email' ,
'comment_content' ,
'comment_type' ,
'remote_source' ,
'remote_source_original'
2016-02-24 01:55:26 +01:00
);
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$comment_ID = wp_new_comment ( $commentdata );
2014-03-26 06:44:16 +01:00
2017-10-24 00:12:51 +02:00
if ( is_wp_error ( $comment_ID ) ) {
return $this -> pingback_error ( 0 , $comment_ID -> get_error_message () );
}
2014-03-26 06:44:16 +01:00
/**
* Fires after a post pingback has been sent .
*
* @ since 0.71
*
* @ param int $comment_ID Comment ID .
*/
do_action ( 'pingback_post' , $comment_ID );
2010-09-23 23:22:21 +02:00
2019-09-03 02:41:05 +02:00
/* translators: 1: URL of the page linked from, 2: URL of the page linked to. */
2016-09-02 06:13:28 +02:00
return sprintf ( __ ( 'Pingback from %1$s to %2$s registered. Keep the web talking! :-)' ), $pagelinkedfrom , $pagelinkedto );
2010-09-23 23:22:21 +02:00
}
/**
* Retrieve array of URLs that pingbacked the given URL .
*
* Specs on http :// www . aquarionics . com / misc / archives / blogite / 0198. html
*
* @ since 1.5 . 0
*
2016-10-10 08:38:31 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
*
2015-05-22 21:37:24 +02:00
* @ param string $url
2014-11-03 04:04:22 +01:00
* @ return array | IXR_Error
2010-09-23 23:22:21 +02:00
*/
2015-05-22 21:37:24 +02:00
public function pingback_extensions_getPingbacks ( $url ) {
2016-10-10 08:38:31 +02:00
global $wpdb ;
2014-03-26 06:44:16 +01:00
/** This action is documented in wp-includes/class-wp-xmlrpc-server.php */
do_action ( 'xmlrpc_call' , 'pingback.extensions.getPingbacks' );
2010-09-23 23:22:21 +02:00
2015-05-22 21:37:24 +02:00
$url = $this -> escape ( $url );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
$post_ID = url_to_postid ( $url );
if ( ! $post_ID ) {
2020-01-29 01:45:18 +01:00
// We aren't sure that the resource is available and/or pingback enabled.
2017-12-01 00:11:00 +01:00
return $this -> pingback_error ( 33 , __ ( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) );
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
$actual_post = get_post ( $post_ID , ARRAY_A );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $actual_post ) {
2020-01-29 01:45:18 +01:00
// No such post = resource not found.
2017-12-01 00:11:00 +01:00
return $this -> pingback_error ( 32 , __ ( 'The specified target URL does not exist.' ) );
2010-09-23 23:22:21 +02:00
}
2017-12-01 00:11:00 +01:00
$comments = $wpdb -> get_results ( $wpdb -> prepare ( " SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d " , $post_ID ) );
2010-09-23 23:22:21 +02:00
2017-12-01 00:11:00 +01:00
if ( ! $comments ) {
2010-09-23 23:22:21 +02:00
return array ();
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
$pingbacks = array ();
foreach ( $comments as $comment ) {
2017-12-01 00:11:00 +01:00
if ( 'pingback' == $comment -> comment_type ) {
2010-09-23 23:22:21 +02:00
$pingbacks [] = $comment -> comment_author_url ;
2017-12-01 00:11:00 +01:00
}
2010-09-23 23:22:21 +02:00
}
return $pingbacks ;
}
2013-01-22 23:30:08 +01:00
2014-12-01 02:34:24 +01:00
/**
2015-12-16 18:38:27 +01:00
* 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 .
2014-12-01 02:34:24 +01:00
*/
2013-01-22 23:30:08 +01:00
protected function pingback_error ( $code , $message ) {
2014-03-26 06:44:16 +01:00
/**
2016-05-22 20:15:28 +02:00
* Filters the XML - RPC pingback error return .
2014-03-26 06:44:16 +01:00
*
* @ since 3.5 . 1
*
* @ param IXR_Error $error An IXR_Error object containing the error code and message .
*/
2013-01-22 23:30:08 +01:00
return apply_filters ( 'xmlrpc_pingback_error' , new IXR_Error ( $code , $message ) );
}
2010-09-23 23:22:21 +02:00
}