2004-05-23 00:02:53 -04:00
< ? php
2008-05-25 11:50:15 -04:00
/**
* XML - RPC protocol support for WordPress
*
* @ license GPL v2 <./ license . txt >
* @ package WordPress
*/
/**
* Whether this is a XMLRPC Request
*
* @ var bool
*/
2006-01-13 14:19:09 -05:00
define ( 'XMLRPC_REQUEST' , true );
// Some browser-embedded clients send cookies. We don't want them.
$_COOKIE = array ();
2007-09-03 19:32:58 -04:00
// A bug in PHP < 5.2.2 makes $HTTP_RAW_POST_DATA not set by default,
2007-05-10 23:21:06 -04:00
// but we can do it ourself.
if ( ! isset ( $HTTP_RAW_POST_DATA ) ) {
$HTTP_RAW_POST_DATA = file_get_contents ( 'php://input' );
}
2008-05-25 11:50:15 -04:00
// fix for mozBlog and other cases where '<?xml' isn't on the very first line
2006-01-30 16:19:44 -05:00
if ( isset ( $HTTP_RAW_POST_DATA ) )
$HTTP_RAW_POST_DATA = trim ( $HTTP_RAW_POST_DATA );
2004-05-23 00:02:53 -04:00
2008-05-25 11:50:15 -04:00
/** Include the bootstrap for setting up WordPress environment */
2008-05-21 01:59:27 -04:00
include ( './wp-load.php' );
2005-11-07 04:47:51 -05:00
2007-09-03 19:32:58 -04:00
if ( isset ( $_GET [ 'rsd' ] ) ) { // http://archipelago.phrasewise.com/rsd
2007-06-02 01:21:18 -04:00
header ( 'Content-Type: text/xml; charset=' . get_option ( 'blog_charset' ), true );
2005-11-07 04:47:51 -05:00
?>
2006-08-30 17:46:31 -04:00
< ? php echo '<?xml version="1.0" encoding="' . get_option ( 'blog_charset' ) . '"?' . '>' ; ?>
2005-11-07 04:47:51 -05:00
< rsd version = " 1.0 " xmlns = " http://archipelago.phrasewise.com/rsd " >
< service >
< engineName > WordPress </ engineName >
< engineLink > http :// wordpress . org /</ engineLink >
< homePageLink >< ? php bloginfo_rss ( 'url' ) ?> </homePageLink>
< apis >
2007-06-07 10:10:53 -04:00
< api name = " WordPress " blogID = " 1 " preferred = " true " apiLink = " <?php bloginfo_rss('wpurl') ?>/xmlrpc.php " />
< api name = " Movable Type " blogID = " 1 " preferred = " false " apiLink = " <?php bloginfo_rss('wpurl') ?>/xmlrpc.php " />
2007-05-24 13:09:39 -04:00
< api name = " MetaWeblog " blogID = " 1 " preferred = " false " apiLink = " <?php bloginfo_rss('wpurl') ?>/xmlrpc.php " />
< api name = " Blogger " blogID = " 1 " preferred = " false " apiLink = " <?php bloginfo_rss('wpurl') ?>/xmlrpc.php " />
2008-02-05 01:47:27 -05:00
< api name = " Atom " blogID = " " preferred = " false " apiLink = " <?php echo apply_filters('atom_service_url', (get_bloginfo('url'). " / wp - app . php / service " ))?> " />
2005-11-07 04:47:51 -05:00
</ apis >
</ service >
</ rsd >
< ? php
exit ;
}
2007-05-25 03:16:21 -04:00
include_once ( ABSPATH . 'wp-admin/includes/admin.php' );
2004-09-17 16:53:18 -04:00
include_once ( ABSPATH . WPINC . '/class-IXR.php' );
2004-05-23 00:02:53 -04:00
// Turn off all warnings and errors.
2004-09-17 16:53:18 -04:00
// error_reporting(0);
2004-05-23 00:02:53 -04:00
2008-05-25 11:50:15 -04:00
/**
* Posts submitted via the xmlrpc interface get that title
* @ name post_default_title
* @ var string
*/
$post_default_title = " " ;
/**
* Whether to enable XMLRPC Logging .
*
* @ name xmlrpc_logging
* @ var int | bool
*/
2004-09-14 13:20:22 -04:00
$xmlrpc_logging = 0 ;
2004-05-23 00:02:53 -04:00
2008-05-25 11:50:15 -04:00
/**
* logIO () - Writes logging info to a file .
*
* @ uses $xmlrpc_logging
* @ package WordPress
* @ subpackage Logging
*
* @ param string $io Whether input or output
* @ param string $msg Information describing logging reason .
* @ return bool Always return true
*/
2004-05-23 00:02:53 -04:00
function logIO ( $io , $msg ) {
global $xmlrpc_logging ;
if ( $xmlrpc_logging ) {
2004-09-17 16:53:18 -04:00
$fp = fopen ( " ../xmlrpc.log " , " a+ " );
2004-05-23 00:02:53 -04:00
$date = gmdate ( " Y-m-d H:i:s " );
$iot = ( $io == " I " ) ? " Input: " : " Output: " ;
fwrite ( $fp , " \n \n " . $date . $iot . $msg );
fclose ( $fp );
}
return true ;
}
2006-10-04 01:23:10 -04:00
if ( isset ( $HTTP_RAW_POST_DATA ) )
2008-05-25 11:50:15 -04:00
logIO ( " I " , $HTTP_RAW_POST_DATA );
/**
* @ internal
* Left undocumented to work on later . If you want to finish , then please do so .
*
* @ package WordPress
* @ subpackage Publishing
*/
2004-09-17 16:53:18 -04:00
class wp_xmlrpc_server extends IXR_Server {
function wp_xmlrpc_server () {
$this -> methods = array (
2007-01-23 20:16:08 -05:00
// WordPress API
'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' ,
'wp.getCategories' => 'this:mw_getCategories' , // Alias
'wp.newCategory' => 'this:wp_newCategory' ,
2007-12-19 15:33:27 -05:00
'wp.deleteCategory' => 'this:wp_deleteCategory' ,
2007-01-23 20:16:08 -05:00
'wp.suggestCategories' => 'this:wp_suggestCategories' ,
2007-02-21 20:42:21 -05:00
'wp.uploadFile' => 'this:mw_newMediaObject' , // Alias
2008-01-01 13:40:39 -05:00
'wp.getCommentCount' => 'this:wp_getCommentCount' ,
2008-01-10 16:46:25 -05:00
'wp.getPostStatusList' => 'this:wp_getPostStatusList' ,
'wp.getPageStatusList' => 'this:wp_getPageStatusList' ,
2008-05-06 12:49:42 -04:00
'wp.getPageTemplates' => 'this:wp_getPageTemplates' ,
2007-01-23 20:16:08 -05:00
2006-11-19 02:56:05 -05:00
// Blogger API
'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs' ,
'blogger.getUserInfo' => 'this:blogger_getUserInfo' ,
'blogger.getPost' => 'this:blogger_getPost' ,
'blogger.getRecentPosts' => 'this:blogger_getRecentPosts' ,
'blogger.getTemplate' => 'this:blogger_getTemplate' ,
'blogger.setTemplate' => 'this:blogger_setTemplate' ,
'blogger.newPost' => 'this:blogger_newPost' ,
'blogger.editPost' => 'this:blogger_editPost' ,
'blogger.deletePost' => 'this:blogger_deletePost' ,
// MetaWeblog API (with MT extensions to structs)
'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' ,
// MetaWeblog API aliases for Blogger API
// see http://www.xmlrpc.com/stories/storyReader$2460
'metaWeblog.deletePost' => 'this:blogger_deletePost' ,
'metaWeblog.getTemplate' => 'this:blogger_getTemplate' ,
'metaWeblog.setTemplate' => 'this:blogger_setTemplate' ,
'metaWeblog.getUsersBlogs' => 'this:blogger_getUsersBlogs' ,
// MovableType API
'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' ,
// PingBack
'pingback.ping' => 'this:pingback_ping' ,
'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks' ,
'demo.sayHello' => 'this:sayHello' ,
'demo.addTwoNumbers' => 'this:addTwoNumbers'
2004-09-17 16:53:18 -04:00
);
2005-01-06 18:28:51 -05:00
$this -> methods = apply_filters ( 'xmlrpc_methods' , $this -> methods );
2004-09-17 16:53:18 -04:00
$this -> IXR_Server ( $this -> methods );
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:53:18 -04:00
function sayHello ( $args ) {
return 'Hello!' ;
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:53:18 -04:00
function addTwoNumbers ( $args ) {
$number1 = $args [ 0 ];
$number2 = $args [ 1 ];
return $number1 + $number2 ;
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:53:18 -04:00
function login_pass_ok ( $user_login , $user_pass ) {
2006-11-19 02:56:05 -05:00
if ( ! user_pass_ok ( $user_login , $user_pass )) {
2007-04-01 11:59:50 -04:00
$this -> error = new IXR_Error ( 403 , __ ( 'Bad login/pass combination.' ));
2006-11-19 02:56:05 -05:00
return false ;
}
return true ;
2004-09-17 16:53:18 -04:00
}
2004-05-23 00:02:53 -04:00
2005-06-28 18:16:27 -04:00
function escape ( & $array ) {
global $wpdb ;
2004-05-23 00:02:53 -04:00
2007-03-03 11:56:46 -05:00
if ( ! is_array ( $array )) {
2007-02-12 14:20:31 -05:00
return ( $wpdb -> escape ( $array ));
}
else {
foreach ( ( array ) $array as $k => $v ) {
if ( is_array ( $v )) {
$this -> escape ( $array [ $k ]);
} else if ( is_object ( $v )) {
//skip
} else {
$array [ $k ] = $wpdb -> escape ( $v );
}
2005-06-28 18:16:27 -04:00
}
}
}
2004-05-23 00:02:53 -04:00
2008-02-05 01:47:27 -05:00
function get_custom_fields ( $post_id ) {
$post_id = ( int ) $post_id ;
$custom_fields = array ();
foreach ( ( array ) has_meta ( $post_id ) as $meta ) {
// Don't expose protected fields.
if ( strpos ( $meta [ 'meta_key' ], '_wp_' ) === 0 ) {
continue ;
}
$custom_fields [] = array (
" id " => $meta [ 'meta_id' ],
" key " => $meta [ 'meta_key' ],
" value " => $meta [ 'meta_value' ]
);
}
return $custom_fields ;
}
function set_custom_fields ( $post_id , $fields ) {
$post_id = ( int ) $post_id ;
foreach ( ( array ) $fields as $meta ) {
if ( isset ( $meta [ 'id' ]) ) {
$meta [ 'id' ] = ( int ) $meta [ 'id' ];
if ( isset ( $meta [ 'key' ]) ) {
update_meta ( $meta [ 'id' ], $meta [ 'key' ], $meta [ 'value' ]);
}
else {
delete_meta ( $meta [ 'id' ]);
}
}
else {
$_POST [ 'metakeyinput' ] = $meta [ 'key' ];
$_POST [ 'metavalue' ] = $meta [ 'value' ];
add_meta ( $post_id );
}
}
}
2007-12-19 16:07:38 -05:00
2007-01-23 20:16:08 -05:00
/**
* WordPress XML - RPC API
* wp_getPage
*/
function wp_getPage ( $args ) {
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_id = ( int ) $args [ 0 ];
$page_id = ( int ) $args [ 1 ];
2007-01-23 20:16:08 -05:00
$username = $args [ 2 ];
$password = $args [ 3 ];
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $username );
if ( ! current_user_can ( 'edit_page' , $page_id ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you can not edit this page.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.getPage' );
2007-12-22 20:35:44 -05:00
2007-01-23 20:16:08 -05:00
// Lookup page info.
$page = get_page ( $page_id );
// If we found the page then format the data.
if ( $page -> ID && ( $page -> post_type == " page " )) {
// Get all of the page content and link.
$full_page = get_extended ( $page -> post_content );
$link = post_permalink ( $page -> ID );
2007-01-26 15:05:53 -05:00
// Get info the page parent if there is one.
$parent_title = " " ;
if ( ! empty ( $page -> post_parent )) {
$parent = get_page ( $page -> post_parent );
$parent_title = $parent -> post_title ;
}
2007-01-23 20:16:08 -05:00
// Determine comment and ping settings.
$allow_comments = ( " open " == $page -> comment_status ) ? 1 : 0 ;
$allow_pings = ( " open " == $page -> ping_status ) ? 1 : 0 ;
// Format page date.
2007-08-16 23:18:58 -04:00
$page_date = mysql2date ( " Ymd \T H:i:s " , $page -> post_date );
$page_date_gmt = mysql2date ( " Ymd \T H:i:s " , $page -> post_date_gmt );
2007-01-23 20:16:08 -05:00
// Pull the categories info together.
$categories = array ();
foreach ( wp_get_post_categories ( $page -> ID ) as $cat_id ) {
$categories [] = get_cat_name ( $cat_id );
}
2007-01-26 15:05:53 -05:00
// Get the author info.
$author = get_userdata ( $page -> post_author );
2007-01-23 20:16:08 -05:00
2008-05-06 12:49:42 -04:00
$page_template = get_post_meta ( $page -> ID , '_wp_page_template' , true );
if ( empty ( $page_template ) )
$page_template = 'default' ;
2007-01-23 20:16:08 -05:00
$page_struct = array (
2007-01-26 15:05:53 -05:00
" dateCreated " => new IXR_Date ( $page_date ),
" userid " => $page -> post_author ,
" 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 ,
2007-01-31 19:34:33 -05:00
" wp_author " => $author -> display_name ,
2007-01-26 15:05:53 -05:00
" wp_page_parent_id " => $page -> post_parent ,
" wp_page_parent_title " => $parent_title ,
" wp_page_order " => $page -> menu_order ,
2007-02-02 02:43:59 -05:00
" wp_author_id " => $author -> ID ,
2007-08-16 23:18:58 -04:00
" wp_author_display_name " => $author -> display_name ,
2007-12-19 16:07:38 -05:00
" date_created_gmt " => new IXR_Date ( $page_date_gmt ),
2008-05-06 12:49:42 -04:00
" custom_fields " => $this -> get_custom_fields ( $page_id ),
" wp_page_template " => $page_template
2007-01-23 20:16:08 -05:00
);
return ( $page_struct );
}
// If the page doesn't exist indicate that.
else {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 404 , __ ( " Sorry, no such page. " )));
2007-01-23 20:16:08 -05:00
}
}
/**
* WordPress XML - RPC API
* wp_getPages
*/
function wp_getPages ( $args ) {
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_id = ( int ) $args [ 0 ];
2007-01-23 20:16:08 -05:00
$username = $args [ 1 ];
$password = $args [ 2 ];
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $username );
if ( ! current_user_can ( 'edit_pages' ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you can not edit pages.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.getPages' );
2007-12-22 20:35:44 -05:00
2007-01-23 20:16:08 -05:00
// Lookup info on pages.
$pages = get_pages ();
$num_pages = count ( $pages );
// If we have pages, put together their info.
if ( $num_pages >= 1 ) {
$pages_struct = array ();
for ( $i = 0 ; $i < $num_pages ; $i ++ ) {
$page = wp_xmlrpc_server :: wp_getPage ( array (
$blog_id , $pages [ $i ] -> ID , $username , $password
));
$pages_struct [] = $page ;
}
return ( $pages_struct );
}
// If no pages were found return an error.
else {
2007-03-24 23:53:33 -04:00
return ( array ());
2007-01-23 20:16:08 -05:00
}
}
/**
* WordPress XML - RPC API
* wp_newPage
*/
function wp_newPage ( $args ) {
2007-02-12 14:20:31 -05:00
// Items not escaped here will be escaped in newPost.
$username = $this -> escape ( $args [ 1 ]);
$password = $this -> escape ( $args [ 2 ]);
2007-01-23 20:16:08 -05:00
$page = $args [ 3 ];
$publish = $args [ 4 ];
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.newPage' );
2007-12-22 20:35:44 -05:00
2007-01-23 20:16:08 -05:00
// Set the user context and check if they are allowed
// to add new pages.
$user = set_current_user ( 0 , $username );
if ( ! current_user_can ( " publish_pages " )) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 401 , __ ( " Sorry, you can not add new pages. " )));
2007-01-23 20:16:08 -05:00
}
// Mark this as content for a page.
$args [ 3 ][ " post_type " ] = " page " ;
// Let mw_newPost do all of the heavy lifting.
return ( $this -> mw_newPost ( $args ));
}
/**
* WordPress XML - RPC API
* wp_deletePage
*/
function wp_deletePage ( $args ) {
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_id = ( int ) $args [ 0 ];
2007-01-23 20:16:08 -05:00
$username = $args [ 1 ];
$password = $args [ 2 ];
2007-03-22 20:59:21 -04:00
$page_id = ( int ) $args [ 3 ];
2007-01-23 20:16:08 -05:00
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.deletePage' );
2007-12-22 20:35:44 -05:00
2007-01-23 20:16:08 -05:00
// Get the current page based on the page_id and
// make sure it is a page and not a post.
$actual_page = wp_get_single_post ( $page_id , ARRAY_A );
if (
! $actual_page
|| ( $actual_page [ " post_type " ] != " page " )
) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 404 , __ ( " Sorry, no such page. " )));
2007-01-23 20:16:08 -05:00
}
// Set the user context and make sure they can delete pages.
set_current_user ( 0 , $username );
if ( ! current_user_can ( " delete_page " , $page_id )) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 401 , __ ( " Sorry, you do not have the right to delete this page. " )));
2007-01-23 20:16:08 -05:00
}
// Attempt to delete the page.
$result = wp_delete_post ( $page_id );
if ( ! $result ) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 500 , __ ( " Failed to delete the page. " )));
2007-01-23 20:16:08 -05:00
}
return ( true );
}
/**
* WordPress XML - RPC API
* wp_editPage
*/
function wp_editPage ( $args ) {
2007-02-12 14:20:31 -05:00
// Items not escaped here will be escaped in editPost.
2007-03-22 20:59:21 -04:00
$blog_id = ( int ) $args [ 0 ];
2007-04-03 03:11:13 -04:00
$page_id = ( int ) $this -> escape ( $args [ 1 ]);
2007-02-12 14:20:31 -05:00
$username = $this -> escape ( $args [ 2 ]);
$password = $this -> escape ( $args [ 3 ]);
2007-01-23 20:16:08 -05:00
$content = $args [ 4 ];
$publish = $args [ 5 ];
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.editPage' );
2007-12-22 20:35:44 -05:00
2007-01-23 20:16:08 -05:00
// Get the page data and make sure it is a page.
$actual_page = wp_get_single_post ( $page_id , ARRAY_A );
if (
! $actual_page
|| ( $actual_page [ " post_type " ] != " page " )
) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 404 , __ ( " Sorry, no such page. " )));
2007-01-23 20:16:08 -05:00
}
// Set the user context and make sure they are allowed to edit pages.
set_current_user ( 0 , $username );
if ( ! current_user_can ( " edit_page " , $page_id )) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 401 , __ ( " Sorry, you do not have the right to edit this page. " )));
2007-01-23 20:16:08 -05:00
}
// Mark this as content for a page.
$content [ " post_type " ] = " page " ;
// Arrange args in the way mw_editPost understands.
$args = array (
$page_id ,
$username ,
$password ,
$content ,
$publish
);
// Let mw_editPost do all of the heavy lifting.
return ( $this -> mw_editPost ( $args ));
}
/**
* WordPress XML - RPC API
* wp_getPageList
*/
function wp_getPageList ( $args ) {
global $wpdb ;
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_id = ( int ) $args [ 0 ];
2007-01-23 20:16:08 -05:00
$username = $args [ 1 ];
$password = $args [ 2 ];
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $username );
if ( ! current_user_can ( 'edit_pages' ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you can not edit pages.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.getPageList' );
2007-12-22 20:35:44 -05:00
2007-01-23 20:16:08 -05:00
// Get list of pages ids and titles
$page_list = $wpdb -> get_results ( "
SELECT ID page_id ,
2007-01-26 15:05:53 -05:00
post_title page_title ,
2007-02-21 20:42:21 -05:00
post_parent page_parent_id ,
2007-08-16 23:18:58 -04:00
post_date_gmt ,
post_date
2007-01-23 20:16:08 -05:00
FROM { $wpdb -> posts }
WHERE post_type = 'page'
ORDER BY ID
" );
2007-02-21 20:42:21 -05:00
// The date needs to be formated properly.
$num_pages = count ( $page_list );
for ( $i = 0 ; $i < $num_pages ; $i ++ ) {
2007-08-16 23:18:58 -04:00
$post_date = mysql2date ( " Ymd \T H:i:s " , $page_list [ $i ] -> post_date );
$post_date_gmt = mysql2date ( " Ymd \T H:i:s " , $page_list [ $i ] -> post_date_gmt );
2007-02-21 20:42:21 -05:00
$page_list [ $i ] -> dateCreated = new IXR_Date ( $post_date );
2007-08-16 23:18:58 -04:00
$page_list [ $i ] -> date_created_gmt = new IXR_Date ( $post_date_gmt );
2007-02-21 20:42:21 -05:00
2007-04-21 23:07:34 -04:00
unset ( $page_list [ $i ] -> post_date_gmt );
2007-08-16 23:18:58 -04:00
unset ( $page_list [ $i ] -> post_date );
2007-02-21 20:42:21 -05:00
}
2007-01-23 20:16:08 -05:00
return ( $page_list );
}
/**
* WordPress XML - RPC API
* wp_getAuthors
*/
function wp_getAuthors ( $args ) {
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_id = ( int ) $args [ 0 ];
2007-01-23 20:16:08 -05:00
$username = $args [ 1 ];
$password = $args [ 2 ];
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-26 14:54:35 -05:00
set_current_user ( 0 , $username );
if ( ! current_user_can ( " edit_posts " )) {
return ( new IXR_Error ( 401 , __ ( " Sorry, you can not edit posts on this blog. " )));
}
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.getAuthors' );
2007-12-22 20:35:44 -05:00
2007-12-26 14:54:35 -05:00
$authors = array ();
foreach ( ( array ) get_users_of_blog () as $row ) {
$authors [] = array (
" user_id " => $row -> user_id ,
" user_login " => $row -> user_login ,
" display_name " => $row -> display_name
);
}
return ( $authors );
2007-01-23 20:16:08 -05:00
}
/**
* WordPress XML - RPC API
* wp_newCategory
*/
function wp_newCategory ( $args ) {
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_id = ( int ) $args [ 0 ];
2007-01-23 20:16:08 -05:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$category = $args [ 3 ];
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.newCategory' );
2007-12-22 20:35:44 -05:00
2007-01-23 20:16:08 -05:00
// Set the user context and make sure they are
// allowed to add a category.
set_current_user ( 0 , $username );
2007-12-19 15:33:27 -05:00
if ( ! current_user_can ( " manage_categories " )) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 401 , __ ( " Sorry, you do not have the right to add a category. " )));
2007-01-23 20:16:08 -05:00
}
// If no slug was provided make it empty so that
// WordPress will generate one.
if ( empty ( $category [ " slug " ])) {
$category [ " slug " ] = " " ;
}
// If no parent_id was provided make it empty
// so that it will be a top level page (no parent).
2007-02-22 10:30:47 -05:00
if ( ! isset ( $category [ " parent_id " ]) )
2007-01-23 20:16:08 -05:00
$category [ " parent_id " ] = " " ;
// If no description was provided make it empty.
if ( empty ( $category [ " description " ])) {
$category [ " description " ] = " " ;
}
2007-06-13 22:25:30 -04:00
2007-01-23 20:16:08 -05:00
$new_category = array (
" cat_name " => $category [ " name " ],
" category_nicename " => $category [ " slug " ],
" category_parent " => $category [ " parent_id " ],
" category_description " => $category [ " description " ]
);
2007-03-22 22:05:29 -04:00
$cat_id = wp_insert_category ( $new_category );
2007-01-23 20:16:08 -05:00
if ( ! $cat_id ) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 500 , __ ( " Sorry, the new category failed. " )));
2007-01-23 20:16:08 -05:00
}
return ( $cat_id );
}
2007-12-19 15:33:27 -05:00
/**
* WordPress XML - RPC API
* wp_deleteCategory
*/
function wp_deleteCategory ( $args ) {
$this -> escape ( $args );
$blog_id = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
$category_id = ( int ) $args [ 3 ];
if ( ! $this -> login_pass_ok ( $username , $password ) ) {
return $this -> error ;
}
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.deleteCategory' );
2007-12-22 20:35:44 -05:00
2007-12-19 15:33:27 -05:00
set_current_user ( 0 , $username );
if ( ! current_user_can ( " manage_categories " ) ) {
2008-02-25 14:13:21 -05:00
return new IXR_Error ( 401 , __ ( " Sorry, you do not have the right to delete a category. " ) );
2007-12-19 15:33:27 -05:00
}
return wp_delete_category ( $category_id );
}
2007-01-23 20:16:08 -05:00
/**
* WordPress XML - RPC API
* wp_suggestCategories
*/
function wp_suggestCategories ( $args ) {
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_id = ( int ) $args [ 0 ];
2007-01-23 20:16:08 -05:00
$username = $args [ 1 ];
$password = $args [ 2 ];
$category = $args [ 3 ];
2007-05-28 01:12:56 -04:00
$max_results = ( int ) $args [ 4 ];
2007-01-23 20:16:08 -05:00
if ( ! $this -> login_pass_ok ( $username , $password )) {
return ( $this -> error );
}
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $username );
2008-02-05 01:47:27 -05:00
if ( ! current_user_can ( 'edit_posts' ) )
2008-01-18 02:52:15 -05:00
return new IXR_Error ( 401 , __ ( 'Sorry, you must be able to edit posts to this blog in order to view categories.' ) );
2007-12-27 17:14:27 -05:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'wp.suggestCategories' );
2007-12-22 20:35:44 -05:00
2007-12-19 15:30:44 -05:00
$category_suggestions = array ();
2007-07-16 22:02:52 -04:00
$args = array ( 'get' => 'all' , 'number' => $max_results , 'name__like' => $category );
2007-12-19 15:30:44 -05:00
foreach ( ( array ) get_categories ( $args ) as $cat ) {
$category_suggestions [] = array (
" category_id " => $cat -> cat_ID ,
" category_name " => $cat -> cat_name
);
}
2007-01-23 20:16:08 -05:00
return ( $category_suggestions );
}
2008-01-01 13:40:39 -05:00
function wp_getCommentCount ( $args ) {
2008-02-05 01:47:27 -05:00
$this -> escape ( $args );
2008-01-01 13:40:39 -05:00
2008-02-05 01:47:27 -05:00
$blog_id = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
$post_id = ( int ) $args [ 3 ];
2008-01-01 13:40:39 -05:00
2008-02-05 01:47:27 -05:00
if ( ! $this -> login_pass_ok ( $username , $password ) ) {
return new IXR_Error ( 403 , __ ( 'Bad login/pass combination.' ) );
}
2008-01-01 13:40:39 -05:00
2008-02-05 01:47:27 -05:00
set_current_user ( 0 , $username );
if ( ! current_user_can ( 'edit_posts' ) ) {
2008-02-25 13:34:45 -05:00
return new IXR_Error ( 403 , __ ( 'You are not allowed access to details about comments.' ) );
2008-02-05 01:47:27 -05:00
}
2008-01-01 13:40:39 -05:00
2008-01-18 02:52:15 -05:00
do_action ( 'xmlrpc_call' , 'wp.getCommentCount' );
2008-05-09 12:02:44 -04:00
$count = wp_count_comments ( $post_id );
return array (
" approved " => $count -> approved ,
" awaiting_moderation " => $count -> moderated ,
" spam " => $count -> spam ,
" total_comments " => $count -> total_comments
);
2008-01-01 13:40:39 -05:00
}
2007-01-23 20:16:08 -05:00
2008-01-10 16:46:25 -05:00
function wp_getPostStatusList ( $args ) {
$this -> escape ( $args );
$blog_id = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
if ( ! $this -> login_pass_ok ( $username , $password ) ) {
return new IXR_Error ( 403 , __ ( 'Bad login/pass combination.' ) );
}
set_current_user ( 0 , $username );
if ( ! current_user_can ( 'edit_posts' ) ) {
return new IXR_Error ( 403 , __ ( 'You are not allowed access to details about this blog.' ) );
}
2008-01-18 02:52:15 -05:00
do_action ( 'xmlrpc_call' , 'wp.getPostStatusList' );
2008-01-10 16:46:25 -05:00
return get_post_statuses ( );
}
function wp_getPageStatusList ( $args ) {
$this -> escape ( $args );
$blog_id = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
if ( ! $this -> login_pass_ok ( $username , $password ) ) {
return new IXR_Error ( 403 , __ ( 'Bad login/pass combination.' ) );
}
set_current_user ( 0 , $username );
if ( ! current_user_can ( 'edit_posts' ) ) {
2008-01-22 12:13:43 -05:00
return new IXR_Error ( 403 , __ ( 'You are not allowed access to details about this blog.' ) );
2008-01-10 16:46:25 -05:00
}
2008-01-18 02:52:15 -05:00
do_action ( 'xmlrpc_call' , 'wp.getPageStatusList' );
2008-01-10 16:46:25 -05:00
return get_page_statuses ( );
}
2008-05-06 12:49:42 -04:00
function wp_getPageTemplates ( $args ) {
$this -> escape ( $args );
$blog_id = ( int ) $args [ 0 ];
$username = $args [ 1 ];
$password = $args [ 2 ];
if ( ! $this -> login_pass_ok ( $username , $password ) ) {
return new IXR_Error ( 403 , __ ( 'Bad login/pass combination.' ) );
}
set_current_user ( 0 , $username );
if ( ! current_user_can ( 'edit_pages' ) ) {
return new IXR_Error ( 403 , __ ( 'You are not allowed access to details about this blog.' ) );
}
$templates = get_page_templates ( );
$templates [ 'Default' ] = 'default' ;
return $templates ;
}
2008-01-10 16:46:25 -05:00
2004-09-17 16:53:18 -04:00
/* Blogger API functions
* specs on http :// plant . blogger . com / api and http :// groups . yahoo . com / group / bloggerDev /
*/
2004-05-23 00:02:53 -04:00
2004-09-17 16:53:18 -04:00
/* blogger.getUsersBlogs will make more sense once we support multiple blogs */
function blogger_getUsersBlogs ( $args ) {
2004-05-23 00:02:53 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-26 19:39:28 -04:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-05-23 00:02:53 -04:00
2007-03-26 19:39:28 -04:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 00:02:53 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.getUsersBlogs' );
2007-12-22 20:35:44 -05:00
2007-03-26 19:39:28 -04:00
set_current_user ( 0 , $user_login );
2008-05-08 20:45:17 -04:00
$is_admin = current_user_can ( 'manage_options' );
2004-05-23 00:02:53 -04:00
2007-03-26 19:39:28 -04:00
$struct = array (
'isAdmin' => $is_admin ,
'url' => get_option ( 'home' ) . '/' ,
'blogid' => '1' ,
'blogName' => get_option ( 'blogname' )
);
2006-01-13 17:08:00 -05:00
2007-03-26 19:39:28 -04:00
return array ( $struct );
2004-05-23 00:02:53 -04:00
}
2004-09-17 16:53:18 -04:00
/* blogger.getUsersInfo gives your client some info about you, so you don't have to */
function blogger_getUserInfo ( $args ) {
2004-05-23 00:02:53 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2006-11-19 02:56:05 -05:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-08-25 11:24:09 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-08-25 11:24:09 -04:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
2008-02-05 01:47:27 -05:00
if ( ! current_user_can ( 'edit_posts' ) )
2007-12-27 17:14:27 -05:00
return new IXR_Error ( 401 , __ ( 'Sorry, you do not have access to user data on this blog.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.getUserInfo' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$user_data = get_userdatabylogin ( $user_login );
2004-09-17 16:48:43 -04:00
2006-11-19 02:56:05 -05:00
$struct = array (
'nickname' => $user_data -> nickname ,
'userid' => $user_data -> ID ,
'url' => $user_data -> user_url ,
'lastname' => $user_data -> last_name ,
'firstname' => $user_data -> first_name
);
2004-09-17 16:48:43 -04:00
2006-11-19 02:56:05 -05:00
return $struct ;
2004-09-17 16:48:43 -04:00
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:53:18 -04:00
/* blogger.getPost ...gets a post */
function blogger_getPost ( $args ) {
2004-05-23 00:02:53 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$post_ID = ( int ) $args [ 1 ];
2006-11-19 02:56:05 -05:00
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
2004-05-23 00:02:53 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 00:02:53 -04:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
2008-02-05 01:47:27 -05:00
if ( ! current_user_can ( 'edit_post' , $post_ID ) )
2007-12-27 17:14:27 -05:00
return new IXR_Error ( 401 , __ ( 'Sorry, you can not edit this post.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.getPost' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$post_data = wp_get_single_post ( $post_ID , ARRAY_A );
2004-05-23 00:02:53 -04:00
2006-11-19 02:56:05 -05:00
$categories = implode ( ',' , wp_get_post_categories ( $post_ID ));
2004-05-23 00:02:53 -04:00
2006-11-19 02:56:05 -05:00
$content = '<title>' . stripslashes ( $post_data [ 'post_title' ]) . '</title>' ;
$content .= '<category>' . $categories . '</category>' ;
$content .= stripslashes ( $post_data [ 'post_content' ]);
2004-05-23 00:02:53 -04:00
2006-11-19 02:56:05 -05:00
$struct = array (
'userid' => $post_data [ 'post_author' ],
'dateCreated' => new IXR_Date ( mysql2date ( 'Ymd\TH:i:s' , $post_data [ 'post_date' ])),
'content' => $content ,
'postid' => $post_data [ 'ID' ]
);
2004-05-23 00:02:53 -04:00
2006-11-19 02:56:05 -05:00
return $struct ;
2004-05-23 00:02:53 -04:00
}
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
/* blogger.getRecentPosts ...gets recent posts */
function blogger_getRecentPosts ( $args ) {
2004-05-23 11:46:43 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_ID = ( int ) $args [ 1 ]; /* though we don't use it yet */
2006-11-19 02:56:05 -05:00
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$num_posts = $args [ 4 ];
2004-05-23 11:46:43 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 11:46:43 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.getRecentPosts' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$posts_list = wp_get_recent_posts ( $num_posts );
2004-05-23 11:46:43 -04:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
2006-11-19 02:56:05 -05:00
if ( ! $posts_list ) {
2007-04-01 11:59:50 -04:00
$this -> error = new IXR_Error ( 500 , __ ( 'Either there are no posts, or something went wrong.' ));
2006-11-19 02:56:05 -05:00
return $this -> error ;
}
2004-05-23 11:46:43 -04:00
2006-11-19 02:56:05 -05:00
foreach ( $posts_list as $entry ) {
2007-12-27 17:14:27 -05:00
if ( ! current_user_can ( 'edit_post' , $entry [ 'ID' ] ) )
continue ;
2004-05-23 11:46:43 -04:00
2006-11-19 02:56:05 -05:00
$post_date = mysql2date ( 'Ymd\TH:i:s' , $entry [ 'post_date' ]);
$categories = implode ( ',' , wp_get_post_categories ( $entry [ 'ID' ]));
2004-08-25 11:24:09 -04:00
2006-11-19 02:56:05 -05:00
$content = '<title>' . stripslashes ( $entry [ 'post_title' ]) . '</title>' ;
$content .= '<category>' . $categories . '</category>' ;
$content .= stripslashes ( $entry [ 'post_content' ]);
2004-05-23 11:46:43 -04:00
2006-11-19 02:56:05 -05:00
$struct [] = array (
'userid' => $entry [ 'post_author' ],
'dateCreated' => new IXR_Date ( $post_date ),
'content' => $content ,
'postid' => $entry [ 'ID' ],
);
2004-05-23 11:46:43 -04:00
2006-11-19 02:56:05 -05:00
}
$recent_posts = array ();
for ( $j = 0 ; $j < count ( $struct ); $j ++ ) {
array_push ( $recent_posts , $struct [ $j ]);
}
2004-09-17 16:48:43 -04:00
2006-11-19 02:56:05 -05:00
return $recent_posts ;
2004-05-23 11:46:43 -04:00
}
2004-09-17 16:53:18 -04:00
/* blogger.getTemplate returns your blog_filename */
function blogger_getTemplate ( $args ) {
2004-05-23 11:46:43 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_ID = ( int ) $args [ 1 ];
2004-09-17 16:53:18 -04:00
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$template = $args [ 4 ]; /* could be 'main' or 'archiveIndex', but we don't use it */
2004-05-23 11:46:43 -04:00
2004-09-17 16:53:18 -04:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 11:46:43 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.getTemplate' );
2007-12-22 20:35:44 -05:00
2006-01-13 14:19:09 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_themes' ) ) {
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 401 , __ ( 'Sorry, this user can not edit the template.' ));
2004-09-17 16:53:18 -04:00
}
2004-05-23 11:46:43 -04:00
2007-07-30 12:32:12 -04:00
/* warning: here we make the assumption that the blog's URL is on the same server */
2006-08-30 17:46:31 -04:00
$filename = get_option ( 'home' ) . '/' ;
2005-11-10 20:21:28 -05:00
$filename = preg_replace ( '#https?://.+?/#' , $_SERVER [ 'DOCUMENT_ROOT' ] . '/' , $filename );
2004-08-25 11:24:09 -04:00
2004-09-17 16:53:18 -04:00
$f = fopen ( $filename , 'r' );
$content = fread ( $f , filesize ( $filename ));
fclose ( $f );
2004-05-23 11:46:43 -04:00
2004-09-17 16:53:18 -04:00
/* so it is actually editable with a windows/mac client */
2007-09-03 19:32:58 -04:00
// FIXME: (or delete me) do we really want to cater to bad clients at the expense of good ones by BEEPing up their line breaks? commented. $content = str_replace("\n", "\r\n", $content);
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
return $content ;
}
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
/* blogger.setTemplate updates the content of blog_filename */
function blogger_setTemplate ( $args ) {
2004-09-17 16:48:43 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-12-22 20:35:44 -05:00
$blog_ID = ( int ) $args [ 1 ];
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$content = $args [ 4 ];
$template = $args [ 5 ]; /* could be 'main' or 'archiveIndex', but we don't use it */
2004-05-23 11:46:43 -04:00
2007-12-22 20:35:44 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 12:42:23 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.setTemplate' );
2004-05-23 12:42:23 -04:00
2007-12-22 20:35:44 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_themes' ) ) {
return new IXR_Error ( 401 , __ ( 'Sorry, this user can not edit the template.' ));
}
2004-05-23 12:42:23 -04:00
2007-12-22 20:35:44 -05:00
/* warning: here we make the assumption that the blog's URL is on the same server */
$filename = get_option ( 'home' ) . '/' ;
$filename = preg_replace ( '#https?://.+?/#' , $_SERVER [ 'DOCUMENT_ROOT' ] . '/' , $filename );
if ( $f = fopen ( $filename , 'w+' )) {
fwrite ( $f , $content );
fclose ( $f );
} else {
return new IXR_Error ( 500 , __ ( 'Either the file is not writable, or something wrong happened. The file has not been updated.' ));
}
2004-05-23 12:42:23 -04:00
2007-12-22 20:35:44 -05:00
return true ;
2004-09-17 16:53:18 -04:00
}
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
/* blogger.newPost ...creates a new post */
function blogger_newPost ( $args ) {
2004-09-17 16:48:43 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-12-06 14:49:33 -05:00
$blog_ID = ( int ) $args [ 1 ]; /* though we don't use it yet */
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$content = $args [ 4 ];
$publish = $args [ 5 ];
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2007-12-22 20:35:44 -05:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.newPost' );
2007-12-22 20:35:44 -05:00
2007-12-06 14:49:33 -05:00
$cap = ( $publish ) ? 'publish_posts' : 'edit_posts' ;
$user = set_current_user ( 0 , $user_login );
if ( ! current_user_can ( $cap ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you are not allowed to post on this blog.' ));
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_status = ( $publish ) ? 'publish' : 'draft' ;
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_author = $user -> ID ;
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_title = xmlrpc_getposttitle ( $content );
$post_category = xmlrpc_getpostcategory ( $content );
$post_content = xmlrpc_removepostdata ( $content );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_date = current_time ( 'mysql' );
$post_date_gmt = current_time ( 'mysql' , 1 );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_data = compact ( 'blog_ID' , 'post_author' , 'post_date' , 'post_date_gmt' , 'post_content' , 'post_title' , 'post_category' , 'post_status' );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_ID = wp_insert_post ( $post_data );
if ( is_wp_error ( $post_ID ) )
return new IXR_Error ( 500 , $post_ID -> get_error_message ());
if ( ! $post_ID )
return new IXR_Error ( 500 , __ ( 'Sorry, your entry could not be posted. Something wrong happened.' ));
$this -> attach_uploads ( $post_ID , $post_content );
logIO ( 'O' , " Posted ! ID: $post_ID " );
return $post_ID ;
2004-05-23 12:42:23 -04:00
}
2004-08-25 11:24:09 -04:00
2004-09-17 16:53:18 -04:00
/* blogger.editPost ...edits a post */
function blogger_editPost ( $args ) {
2004-08-25 11:24:09 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_ID = ( int ) $args [ 1 ];
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$content = $args [ 4 ];
$publish = $args [ 5 ];
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2007-12-22 20:35:44 -05:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.editPost' );
2007-12-22 20:35:44 -05:00
2007-12-06 14:49:33 -05:00
$actual_post = wp_get_single_post ( $post_ID , ARRAY_A );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $actual_post ) {
return new IXR_Error ( 404 , __ ( 'Sorry, no such post.' ));
}
2008-02-05 01:47:27 -05:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $actual_post );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_post' , $post_ID ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you do not have the right to edit this post.' ));
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
extract ( $actual_post , EXTR_SKIP );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ( 'publish' == $post_status ) && ! current_user_can ( 'publish_posts' ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you do not have the right to publish this post.' ));
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_title = xmlrpc_getposttitle ( $content );
$post_category = xmlrpc_getpostcategory ( $content );
$post_content = xmlrpc_removepostdata ( $content );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$postdata = compact ( 'ID' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$result = wp_update_post ( $postdata );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $result ) {
return new IXR_Error ( 500 , __ ( 'For some strange yet very annoying reason, this post could not be edited.' ));
}
$this -> attach_uploads ( $ID , $post_content );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
return true ;
2004-08-25 11:24:09 -04:00
}
2004-09-17 16:53:18 -04:00
/* blogger.deletePost ...deletes a post */
function blogger_deletePost ( $args ) {
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_ID = ( int ) $args [ 1 ];
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$publish = $args [ 4 ];
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2007-12-22 20:35:44 -05:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'blogger.deletePost' );
2007-12-22 20:35:44 -05:00
2007-12-06 14:49:33 -05:00
$actual_post = wp_get_single_post ( $post_ID , ARRAY_A );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $actual_post ) {
return new IXR_Error ( 404 , __ ( 'Sorry, no such post.' ));
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_post' , $post_ID ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you do not have the right to delete this post.' ));
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$result = wp_delete_post ( $post_ID );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $result ) {
return new IXR_Error ( 500 , __ ( 'For some strange yet very annoying reason, this post could not be deleted.' ));
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
return true ;
2004-09-17 16:48:43 -04:00
}
2004-08-25 12:28:20 -04:00
2004-09-17 16:53:18 -04:00
/* MetaWeblog API functions
* specs on wherever Dave Winer wants them to be
*/
2004-09-14 13:20:22 -04:00
2004-09-17 16:53:18 -04:00
/* metaweblog.newPost creates a post */
function mw_newPost ( $args ) {
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-12-06 14:49:33 -05:00
$blog_ID = ( int ) $args [ 0 ]; // we will support this in the near future
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
$content_struct = $args [ 3 ];
$publish = $args [ 4 ];
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2008-02-04 13:35:05 -05:00
$user = set_current_user ( 0 , $user_login );
2007-12-22 20:35:44 -05:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'metaWeblog.newPost' );
2007-12-22 20:35:44 -05:00
2008-02-04 13:35:05 -05:00
$cap = ( $publish ) ? 'publish_posts' : 'edit_posts' ;
$error_message = __ ( 'Sorry, you are not allowed to publish posts on this blog.' );
$post_type = 'post' ;
2008-05-06 12:49:42 -04:00
$page_template = '' ;
2008-02-04 13:35:05 -05:00
if ( ! empty ( $content_struct [ 'post_type' ] ) ) {
if ( $content_struct [ 'post_type' ] == 'page' ) {
$cap = ( $publish ) ? 'publish_pages' : 'edit_pages' ;
$error_message = __ ( 'Sorry, you are not allowed to publish pages on this blog.' );
$post_type = 'page' ;
2008-05-06 12:49:42 -04:00
if ( ! empty ( $content_struct [ 'wp_page_template' ] ) )
$page_template = $content_struct [ 'wp_page_template' ];
2008-02-04 13:35:05 -05:00
}
2008-02-13 12:54:08 -05:00
elseif ( $content_struct [ 'post_type' ] == 'post' ) {
2008-02-04 13:35:05 -05:00
// This is the default, no changes needed
}
else {
// No other post_type values are allowed here
return new IXR_Error ( 401 , __ ( 'Invalid post type.' ) );
}
}
2004-08-25 12:28:20 -04:00
2008-02-04 13:35:05 -05:00
if ( ! current_user_can ( $cap ) ) {
return new IXR_Error ( 401 , $error_message );
2007-01-23 20:16:08 -05:00
}
// Let WordPress generate the post_name (slug) unless
// one has been provided.
$post_name = " " ;
2007-04-17 18:00:00 -04:00
if ( isset ( $content_struct [ " wp_slug " ])) {
2007-01-23 20:16:08 -05:00
$post_name = $content_struct [ " wp_slug " ];
}
// Only use a password if one was given.
2007-04-17 18:00:00 -04:00
if ( isset ( $content_struct [ " wp_password " ])) {
2007-01-23 20:16:08 -05:00
$post_password = $content_struct [ " wp_password " ];
}
// Only set a post parent if one was provided.
2007-02-21 20:42:21 -05:00
if ( isset ( $content_struct [ " wp_page_parent_id " ])) {
2007-01-23 20:16:08 -05:00
$post_parent = $content_struct [ " wp_page_parent_id " ];
}
// Only set the menu_order if it was provided.
2007-04-17 18:00:00 -04:00
if ( isset ( $content_struct [ " wp_page_order " ])) {
2007-01-23 20:16:08 -05:00
$menu_order = $content_struct [ " wp_page_order " ];
}
2007-12-06 14:49:33 -05:00
$post_author = $user -> ID ;
2004-08-25 12:28:20 -04:00
2007-01-31 19:34:33 -05:00
// If an author id was provided then use it instead.
2007-04-17 18:00:00 -04:00
if (
isset ( $content_struct [ " wp_author_id " ])
&& ( $user -> ID != $content_struct [ " wp_author_id " ])
) {
2007-02-02 02:43:59 -05:00
switch ( $post_type ) {
case " post " :
if ( ! current_user_can ( " edit_others_posts " )) {
2007-05-25 11:33:47 -04:00
return ( new IXR_Error ( 401 , __ ( " You are not allowed to post as this user " )));
2007-02-02 02:43:59 -05:00
}
break ;
case " page " :
if ( ! current_user_can ( " edit_others_pages " )) {
2007-05-25 11:33:47 -04:00
return ( new IXR_Error ( 401 , __ ( " You are not allowed to create pages as this user " )));
2007-02-02 02:43:59 -05:00
}
break ;
default :
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 401 , __ ( " Invalid post type. " )));
2007-02-02 02:43:59 -05:00
break ;
}
2007-01-31 19:34:33 -05:00
$post_author = $content_struct [ " wp_author_id " ];
}
2007-12-06 14:49:33 -05:00
$post_title = $content_struct [ 'title' ];
$post_content = apply_filters ( 'content_save_pre' , $content_struct [ 'description' ] );
2008-01-10 16:46:25 -05:00
2007-12-06 14:49:33 -05:00
$post_status = $publish ? 'publish' : 'draft' ;
2008-01-10 17:37:15 -05:00
if ( isset ( $content_struct [ " { $post_type } _status " ] ) ) {
switch ( $content_struct [ " { $post_type } _status " ] ) {
2008-01-10 16:46:25 -05:00
case 'draft' :
case 'private' :
case 'publish' :
2008-01-10 17:37:15 -05:00
$post_status = $content_struct [ " { $post_type } _status " ];
2008-01-10 16:46:25 -05:00
break ;
case 'pending' :
// Pending is only valid for posts, not pages.
if ( $post_type === 'post' ) {
2008-01-10 17:37:15 -05:00
$post_status = $content_struct [ " { $post_type } _status " ];
2008-01-10 16:46:25 -05:00
}
break ;
default :
$post_status = $publish ? 'publish' : 'draft' ;
break ;
}
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_excerpt = $content_struct [ 'mt_excerpt' ];
$post_more = $content_struct [ 'mt_text_more' ];
2004-08-25 12:28:20 -04:00
2007-08-29 19:01:48 -04:00
$tags_input = $content_struct [ 'mt_keywords' ];
2007-04-17 18:00:00 -04:00
if ( isset ( $content_struct [ " mt_allow_comments " ])) {
2007-06-19 15:12:24 -04:00
if ( ! is_numeric ( $content_struct [ " mt_allow_comments " ])) {
switch ( $content_struct [ " mt_allow_comments " ]) {
case " closed " :
$comment_status = " closed " ;
break ;
case " open " :
$comment_status = " open " ;
break ;
default :
$comment_status = get_option ( " default_comment_status " );
break ;
}
2007-04-17 18:00:00 -04:00
}
2007-06-19 15:12:24 -04:00
else {
switch (( int ) $content_struct [ " mt_allow_comments " ]) {
case 0 :
2007-11-28 15:52:55 -05:00
case 2 :
2007-06-19 15:12:24 -04:00
$comment_status = " closed " ;
break ;
case 1 :
$comment_status = " open " ;
break ;
default :
$comment_status = get_option ( " default_comment_status " );
break ;
}
}
}
else {
$comment_status = get_option ( " default_comment_status " );
2007-04-17 18:00:00 -04:00
}
2004-08-25 12:28:20 -04:00
2007-04-17 18:00:00 -04:00
if ( isset ( $content_struct [ " mt_allow_pings " ])) {
2007-06-19 15:12:24 -04:00
if ( ! is_numeric ( $content_struct [ " mt_allow_pings " ])) {
2007-08-17 19:32:49 -04:00
switch ( $content_struct [ 'mt_allow_pings' ]) {
2007-06-19 15:12:24 -04:00
case " closed " :
$ping_status = " closed " ;
2007-09-03 19:32:58 -04:00
break ;
2007-06-19 15:12:24 -04:00
case " open " :
$ping_status = " open " ;
break ;
default :
$ping_status = get_option ( " default_ping_status " );
break ;
}
}
else {
switch (( int ) $content_struct [ " mt_allow_pings " ]) {
case 0 :
$ping_status = " closed " ;
break ;
case 1 :
$ping_status = " open " ;
break ;
default :
$ping_status = get_option ( " default_ping_status " );
break ;
}
2007-04-17 18:00:00 -04:00
}
}
2007-06-19 15:12:24 -04:00
else {
$ping_status = get_option ( " default_ping_status " );
}
2004-08-25 12:28:20 -04:00
2007-12-06 14:49:33 -05:00
if ( $post_more ) {
2008-04-03 16:56:48 -04:00
$post_content = $post_content . " <!--more--> " . $post_more ;
2007-12-06 14:49:33 -05:00
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$to_ping = $content_struct [ 'mt_tb_ping_urls' ];
if ( is_array ( $to_ping ) )
$to_ping = implode ( ' ' , $to_ping );
2005-06-18 23:30:46 -04:00
2007-08-16 23:18:58 -04:00
// Do some timestamp voodoo
2008-01-30 15:33:14 -05:00
if ( ! empty ( $content_struct [ 'date_created_gmt' ] ) )
$dateCreated = str_replace ( 'Z' , '' , $content_struct [ 'date_created_gmt' ] -> getIso () ) . 'Z' ; // We know this is supposed to be GMT, so we're going to slap that Z on there by force
elseif ( ! empty ( $content_struct [ 'dateCreated' ]) )
$dateCreated = $content_struct [ 'dateCreated' ] -> getIso ();
if ( ! empty ( $dateCreated ) ) {
2007-08-16 23:18:58 -04:00
$post_date = get_date_from_gmt ( iso8601_to_datetime ( $dateCreated ));
$post_date_gmt = iso8601_to_datetime ( $dateCreated , GMT );
} else {
$post_date = current_time ( 'mysql' );
$post_date_gmt = current_time ( 'mysql' , 1 );
}
2004-09-17 16:53:18 -04:00
2007-12-06 14:49:33 -05:00
$catnames = $content_struct [ 'categories' ];
2008-01-29 17:54:18 -05:00
logIO ( 'O' , 'Post cats: ' . var_export ( $catnames , true ));
2007-12-06 14:49:33 -05:00
$post_category = array ();
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( is_array ( $catnames )) {
foreach ( $catnames as $cat ) {
$post_category [] = get_cat_ID ( $cat );
}
}
2004-09-17 16:48:43 -04:00
2007-12-06 14:49:33 -05:00
// We've got all the data -- post it:
2008-05-06 12:49:42 -04: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' );
2008-02-05 01:47:27 -05:00
2008-05-06 12:49:42 -04:00
$post_ID = wp_insert_post ( $postdata , true );
2007-12-06 14:49:33 -05:00
if ( is_wp_error ( $post_ID ) )
return new IXR_Error ( 500 , $post_ID -> get_error_message ());
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $post_ID ) {
return new IXR_Error ( 500 , __ ( 'Sorry, your entry could not be posted. Something wrong happened.' ));
}
2007-12-19 16:07:38 -05:00
2008-02-05 01:47:27 -05:00
if ( isset ( $content_struct [ 'custom_fields' ]) ) {
$this -> set_custom_fields ( $post_ID , $content_struct [ 'custom_fields' ]);
}
2008-04-28 12:15:23 -04:00
// Handle enclosures
$enclosure = $content_struct [ 'enclosure' ];
if ( is_array ( $enclosure ) && isset ( $enclosure [ 'url' ] ) && isset ( $enclosure [ 'length' ] ) && isset ( $enclosure [ 'type' ] ) ) {
add_post_meta ( $post_ID , 'enclosure' , $enclosure [ 'url' ] . " \n " . $enclosure [ 'length' ] . " \n " . $enclosure [ 'type' ] );
}
2007-12-06 14:49:33 -05:00
$this -> attach_uploads ( $post_ID , $post_content );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
logIO ( 'O' , " Posted ! ID: $post_ID " );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
return strval ( $post_ID );
2004-08-25 12:28:20 -04:00
}
2004-09-17 16:48:43 -04:00
2006-11-30 23:34:59 -05:00
function attach_uploads ( $post_ID , $post_content ) {
global $wpdb ;
// find any unattached files
$attachments = $wpdb -> get_results ( " SELECT ID, guid FROM { $wpdb -> posts } WHERE post_parent = '-1' AND post_type = 'attachment' " );
if ( is_array ( $attachments ) ) {
foreach ( $attachments as $file ) {
if ( strpos ( $post_content , $file -> guid ) !== false ) {
2008-04-14 12:13:25 -04:00
$wpdb -> query ( $wpdb -> prepare ( " UPDATE { $wpdb -> posts } SET post_parent = %d WHERE ID = %d " , $post_ID , $file -> ID ) );
2006-11-30 23:34:59 -05:00
}
}
}
}
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
/* metaweblog.editPost ...edits a post */
function mw_editPost ( $args ) {
2004-08-25 12:28:20 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-12-06 14:49:33 -05:00
$post_ID = ( int ) $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
$content_struct = $args [ 3 ];
$publish = $args [ 4 ];
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
2007-12-22 20:35:44 -05:00
return $this -> error ;
2007-12-06 14:49:33 -05:00
}
2008-02-04 13:35:05 -05:00
$user = set_current_user ( 0 , $user_login );
2004-08-25 12:28:20 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'metaWeblog.editPost' );
2007-12-22 20:35:44 -05:00
2008-02-04 13:35:05 -05:00
$cap = ( $publish ) ? 'publish_posts' : 'edit_posts' ;
$error_message = __ ( 'Sorry, you are not allowed to publish posts on this blog.' );
$post_type = 'post' ;
2008-05-06 12:49:42 -04:00
$page_template = '' ;
2008-02-04 13:35:05 -05:00
if ( ! empty ( $content_struct [ 'post_type' ] ) ) {
if ( $content_struct [ 'post_type' ] == 'page' ) {
$cap = ( $publish ) ? 'publish_pages' : 'edit_pages' ;
$error_message = __ ( 'Sorry, you are not allowed to publish pages on this blog.' );
$post_type = 'page' ;
2008-05-06 12:49:42 -04:00
if ( ! empty ( $content_struct [ 'wp_page_template' ] ) )
$page_template = $content_struct [ 'wp_page_template' ];
2008-02-04 13:35:05 -05:00
}
2008-02-13 12:54:08 -05:00
elseif ( $content_struct [ 'post_type' ] == 'post' ) {
2008-02-04 13:35:05 -05:00
// This is the default, no changes needed
}
else {
// No other post_type values are allowed here
return new IXR_Error ( 401 , __ ( 'Invalid post type.' ) );
2008-02-02 12:55:40 -05:00
}
2007-01-23 20:16:08 -05:00
}
2008-02-04 13:35:05 -05:00
if ( ! current_user_can ( $cap ) ) {
return new IXR_Error ( 401 , $error_message );
}
2007-03-21 18:15:20 -04:00
2007-12-06 14:49:33 -05:00
$postdata = wp_get_single_post ( $post_ID , ARRAY_A );
2007-03-24 23:53:33 -04:00
// If there is no post data for the give post id, stop
// now and return an error. Other wise a new post will be
// created (which was the old behavior).
if ( empty ( $postdata [ " ID " ])) {
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 404 , __ ( " Invalid post id. " )));
2007-03-24 23:53:33 -04:00
}
2007-03-21 18:15:20 -04:00
$this -> escape ( $postdata );
2007-06-17 20:18:18 -04:00
extract ( $postdata , EXTR_SKIP );
2007-03-21 18:15:20 -04:00
2007-01-23 20:16:08 -05:00
// Let WordPress manage slug if none was provided.
$post_name = " " ;
2007-04-17 18:00:00 -04:00
if ( isset ( $content_struct [ " wp_slug " ])) {
2007-01-23 20:16:08 -05:00
$post_name = $content_struct [ " wp_slug " ];
}
// Only use a password if one was given.
2007-04-17 18:00:00 -04:00
if ( isset ( $content_struct [ " wp_password " ])) {
2007-01-23 20:16:08 -05:00
$post_password = $content_struct [ " wp_password " ];
}
// Only set a post parent if one was given.
2007-03-03 11:56:46 -05:00
if ( isset ( $content_struct [ " wp_page_parent_id " ])) {
2007-01-23 20:16:08 -05:00
$post_parent = $content_struct [ " wp_page_parent_id " ];
}
2007-01-29 22:09:58 -05:00
// Only set the menu_order if it was given.
2007-04-17 18:00:00 -04:00
if ( isset ( $content_struct [ " wp_page_order " ])) {
2007-01-23 20:16:08 -05:00
$menu_order = $content_struct [ " wp_page_order " ];
}
2007-05-22 15:53:16 -04:00
$post_author = $postdata [ " post_author " ];
2007-04-17 18:00:00 -04:00
2007-01-29 22:09:58 -05:00
// Only set the post_author if one is set.
2007-04-17 18:00:00 -04:00
if (
isset ( $content_struct [ " wp_author_id " ])
&& ( $user -> ID != $content_struct [ " wp_author_id " ])
) {
2007-02-02 02:43:59 -05:00
switch ( $post_type ) {
case " post " :
if ( ! current_user_can ( " edit_others_posts " )) {
2007-05-25 11:33:47 -04:00
return ( new IXR_Error ( 401 , __ ( " You are not allowed to change the post author as this user. " )));
2007-02-02 02:43:59 -05:00
}
break ;
case " page " :
if ( ! current_user_can ( " edit_others_pages " )) {
2007-05-25 11:33:47 -04:00
return ( new IXR_Error ( 401 , __ ( " You are not allowed to change the page author as this user. " )));
2007-02-02 02:43:59 -05:00
}
break ;
default :
2007-04-01 11:59:50 -04:00
return ( new IXR_Error ( 401 , __ ( " Invalid post type. " )));
2007-02-02 02:43:59 -05:00
break ;
}
2007-01-31 19:34:33 -05:00
$post_author = $content_struct [ " wp_author_id " ];
}
2007-06-19 15:12:24 -04:00
if ( isset ( $content_struct [ " mt_allow_comments " ])) {
if ( ! is_numeric ( $content_struct [ " mt_allow_comments " ])) {
switch ( $content_struct [ " mt_allow_comments " ]) {
case " closed " :
$comment_status = " closed " ;
break ;
case " open " :
$comment_status = " open " ;
break ;
default :
$comment_status = get_option ( " default_comment_status " );
break ;
}
}
else {
switch (( int ) $content_struct [ " mt_allow_comments " ]) {
case 0 :
2007-11-28 15:52:55 -05:00
case 2 :
2007-06-19 15:12:24 -04:00
$comment_status = " closed " ;
break ;
case 1 :
$comment_status = " open " ;
break ;
default :
$comment_status = get_option ( " default_comment_status " );
break ;
}
}
}
if ( isset ( $content_struct [ " mt_allow_pings " ])) {
if ( ! is_numeric ( $content_struct [ " mt_allow_pings " ])) {
2007-08-17 19:32:49 -04:00
switch ( $content_struct [ " mt_allow_pings " ]) {
2007-06-19 15:12:24 -04:00
case " closed " :
$ping_status = " closed " ;
2007-09-03 19:32:58 -04:00
break ;
2007-06-19 15:12:24 -04:00
case " open " :
$ping_status = " open " ;
break ;
default :
$ping_status = get_option ( " default_ping_status " );
break ;
}
}
else {
switch (( int ) $content_struct [ " mt_allow_pings " ]) {
case 0 :
$ping_status = " closed " ;
break ;
case 1 :
$ping_status = " open " ;
break ;
default :
$ping_status = get_option ( " default_ping_status " );
break ;
}
}
}
2007-12-06 14:49:33 -05:00
$post_title = $content_struct [ 'title' ];
$post_content = apply_filters ( 'content_save_pre' , $content_struct [ 'description' ] );
$catnames = $content_struct [ 'categories' ];
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_category = array ();
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( is_array ( $catnames )) {
foreach ( $catnames as $cat ) {
$post_category [] = get_cat_ID ( $cat );
}
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_excerpt = $content_struct [ 'mt_excerpt' ];
$post_more = $content_struct [ 'mt_text_more' ];
2008-01-10 16:46:25 -05:00
2007-12-06 14:49:33 -05:00
$post_status = $publish ? 'publish' : 'draft' ;
2008-01-10 17:37:15 -05:00
if ( isset ( $content_struct [ " { $post_type } _status " ] ) ) {
switch ( $content_struct [ " { $post_type } _status " ] ) {
2008-01-10 16:46:25 -05:00
case 'draft' :
case 'private' :
case 'publish' :
2008-01-10 17:37:15 -05:00
$post_status = $content_struct [ " { $post_type } _status " ];
2008-01-10 16:46:25 -05:00
break ;
case 'pending' :
// Pending is only valid for posts, not pages.
if ( $post_type === 'post' ) {
2008-01-10 17:37:15 -05:00
$post_status = $content_struct [ " { $post_type } _status " ];
2008-01-10 16:46:25 -05:00
}
break ;
default :
$post_status = $publish ? 'publish' : 'draft' ;
break ;
}
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$tags_input = $content_struct [ 'mt_keywords' ];
2004-09-17 16:53:18 -04:00
2007-12-06 14:49:33 -05:00
if ( ( 'publish' == $post_status ) ) {
if ( ( 'page' == $post_type ) && ! current_user_can ( 'publish_pages' ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you do not have the right to publish this page.' ));
else if ( ! current_user_can ( 'publish_posts' ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you do not have the right to publish this post.' ));
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( $post_more ) {
2008-04-03 16:56:48 -04:00
$post_content = $post_content . " <!--more--> " . $post_more ;
2007-12-06 14:49:33 -05:00
}
2004-09-17 16:53:18 -04:00
2007-12-06 14:49:33 -05:00
$to_ping = $content_struct [ 'mt_tb_ping_urls' ];
if ( is_array ( $to_ping ) )
$to_ping = implode ( ' ' , $to_ping );
2008-01-30 15:33:14 -05:00
2007-12-06 14:49:33 -05:00
// Do some timestamp voodoo
2008-01-30 15:33:14 -05:00
if ( ! empty ( $content_struct [ 'date_created_gmt' ] ) )
$dateCreated = str_replace ( 'Z' , '' , $content_struct [ 'date_created_gmt' ] -> getIso () ) . 'Z' ; // We know this is supposed to be GMT, so we're going to slap that Z on there by force
elseif ( ! empty ( $content_struct [ 'dateCreated' ]) )
$dateCreated = $content_struct [ 'dateCreated' ] -> getIso ();
if ( ! empty ( $dateCreated ) ) {
$post_date = get_date_from_gmt ( iso8601_to_datetime ( $dateCreated ));
$post_date_gmt = iso8601_to_datetime ( $dateCreated , GMT );
2007-12-06 14:49:33 -05:00
} else {
$post_date = $postdata [ 'post_date' ];
$post_date_gmt = $postdata [ 'post_date_gmt' ];
}
2004-09-17 16:53:18 -04:00
2007-12-06 14:49:33 -05:00
// We've got all the data -- post it:
2008-05-06 12:49:42 -04:00
$newpost = compact ( 'ID' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' , 'comment_status' , 'ping_status' , 'post_date' , 'post_date_gmt' , 'to_ping' , 'post_name' , 'post_password' , 'post_parent' , 'menu_order' , 'post_author' , 'tags_input' , 'page_template' );
$result = wp_update_post ( $newpost , true );
if ( is_wp_error ( $result ) )
return new IXR_Error ( 500 , $result -> get_error_message ());
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $result ) {
return new IXR_Error ( 500 , __ ( 'Sorry, your entry could not be edited. Something wrong happened.' ));
}
2007-12-19 16:07:38 -05:00
2008-02-05 01:47:27 -05:00
if ( isset ( $content_struct [ 'custom_fields' ]) ) {
$this -> set_custom_fields ( $post_ID , $content_struct [ 'custom_fields' ]);
}
2007-12-19 16:07:38 -05:00
2008-04-28 12:15:23 -04:00
// Handle enclosures
$enclosure = $content_struct [ 'enclosure' ];
if ( is_array ( $enclosure ) && isset ( $enclosure [ 'url' ] ) && isset ( $enclosure [ 'length' ] ) && isset ( $enclosure [ 'type' ] ) ) {
add_post_meta ( $post_ID , 'enclosure' , $enclosure [ 'url' ] . " \n " . $enclosure [ 'length' ] . " \n " . $enclosure [ 'type' ] );
}
2007-12-06 14:49:33 -05:00
$this -> attach_uploads ( $ID , $post_content );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
logIO ( 'O' , " (MW) Edited ! ID: $post_ID " );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
return true ;
2004-08-26 11:42:43 -04:00
}
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
/* metaweblog.getPost ...returns a post */
function mw_getPost ( $args ) {
2004-09-17 16:48:43 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post_ID = ( int ) $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2007-12-22 20:35:44 -05:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_post' , $post_ID ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you can not edit this post.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'metaWeblog.getPost' );
2007-12-22 20:35:44 -05:00
2007-12-06 14:49:33 -05:00
$postdata = wp_get_single_post ( $post_ID , ARRAY_A );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
if ( $postdata [ 'post_date' ] != '' ) {
$post_date = mysql2date ( 'Ymd\TH:i:s' , $postdata [ 'post_date' ]);
$post_date_gmt = mysql2date ( 'Ymd\TH:i:s' , $postdata [ 'post_date_gmt' ]);
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$categories = array ();
$catids = wp_get_post_categories ( $post_ID );
foreach ( $catids as $catid )
$categories [] = get_cat_name ( $catid );
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$tagnames = array ();
$tags = wp_get_post_tags ( $post_ID );
if ( ! empty ( $tags ) ) {
foreach ( $tags as $tag )
$tagnames [] = $tag -> name ;
$tagnames = implode ( ', ' , $tagnames );
} else {
$tagnames = '' ;
2007-08-29 19:01:48 -04:00
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$post = get_extended ( $postdata [ 'post_content' ]);
$link = post_permalink ( $postdata [ 'ID' ]);
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
// Get the author info.
$author = get_userdata ( $postdata [ 'post_author' ]);
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$allow_comments = ( 'open' == $postdata [ 'comment_status' ]) ? 1 : 0 ;
$allow_pings = ( 'open' == $postdata [ 'ping_status' ]) ? 1 : 0 ;
2008-01-10 16:46:25 -05:00
// Consider future posts as published
if ( $postdata [ 'post_status' ] === 'future' ) {
$postdata [ 'post_status' ] = 'publish' ;
}
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
$resp = array (
'dateCreated' => new IXR_Date ( $post_date ),
'userid' => $postdata [ 'post_author' ],
'postid' => $postdata [ 'ID' ],
'description' => $post [ 'main' ],
'title' => $postdata [ 'post_title' ],
'link' => $link ,
'permaLink' => $link ,
// commented out because no other tool seems to use this
// 'content' => $entry['post_content'],
'categories' => $categories ,
'mt_excerpt' => $postdata [ 'post_excerpt' ],
'mt_text_more' => $post [ 'extended' ],
'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' => $author -> ID ,
'wp_author_display_name' => $author -> display_name ,
'date_created_gmt' => new IXR_Date ( $post_date_gmt ),
2007-12-19 16:07:38 -05:00
'post_status' => $postdata [ 'post_status' ],
'custom_fields' => $this -> get_custom_fields ( $post_ID )
2007-12-06 14:49:33 -05:00
);
2008-02-05 01:47:27 -05:00
2007-12-06 14:49:33 -05:00
return $resp ;
2007-08-29 19:01:48 -04:00
} else {
2007-12-06 14:49:33 -05:00
return new IXR_Error ( 404 , __ ( 'Sorry, no such post.' ));
2007-08-29 19:01:48 -04:00
}
2004-09-17 16:53:18 -04:00
}
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
/* metaweblog.getRecentPosts ...returns recent posts */
function mw_getRecentPosts ( $args ) {
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_ID = ( int ) $args [ 0 ];
2006-11-19 02:56:05 -05:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2007-03-22 20:59:21 -04:00
$num_posts = ( int ) $args [ 3 ];
2004-09-17 16:53:18 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-17 16:53:18 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'metaWeblog.getRecentPosts' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$posts_list = wp_get_recent_posts ( $num_posts );
2004-09-17 16:53:18 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $posts_list ) {
2007-04-01 11:59:50 -04:00
$this -> error = new IXR_Error ( 500 , __ ( 'Either there are no posts, or something went wrong.' ));
2006-11-19 02:56:05 -05:00
return $this -> error ;
}
2004-09-17 16:53:18 -04:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
2007-12-26 14:50:26 -05:00
2006-11-19 02:56:05 -05:00
foreach ( $posts_list as $entry ) {
2007-12-27 17:14:27 -05:00
if ( ! current_user_can ( 'edit_post' , $entry [ 'ID' ] ) )
continue ;
2004-09-17 16:53:18 -04:00
2007-08-16 23:18:58 -04:00
$post_date = mysql2date ( 'Ymd\TH:i:s' , $entry [ 'post_date' ]);
$post_date_gmt = mysql2date ( 'Ymd\TH:i:s' , $entry [ 'post_date_gmt' ]);
2006-11-19 02:56:05 -05:00
$categories = array ();
$catids = wp_get_post_categories ( $entry [ 'ID' ]);
foreach ( $catids as $catid ) {
$categories [] = get_cat_name ( $catid );
}
2004-09-17 16:53:18 -04:00
2007-08-29 19:01:48 -04:00
$tagnames = array ();
$tags = wp_get_post_tags ( $entry [ 'ID' ] );
if ( ! empty ( $tags ) ) {
foreach ( $tags as $tag ) {
$tagnames [] = $tag -> name ;
}
$tagnames = implode ( ', ' , $tagnames );
} else {
$tagnames = '' ;
}
2006-11-19 02:56:05 -05:00
$post = get_extended ( $entry [ 'post_content' ]);
$link = post_permalink ( $entry [ 'ID' ]);
2004-09-17 16:53:18 -04:00
2007-01-29 22:09:58 -05:00
// Get the post author info.
2007-01-31 19:34:33 -05:00
$author = get_userdata ( $entry [ 'post_author' ]);
2007-01-29 22:09:58 -05:00
2006-11-19 02:56:05 -05:00
$allow_comments = ( 'open' == $entry [ 'comment_status' ]) ? 1 : 0 ;
$allow_pings = ( 'open' == $entry [ 'ping_status' ]) ? 1 : 0 ;
2008-01-10 16:46:25 -05:00
// Consider future posts as published
if ( $entry [ 'post_status' ] === 'future' ) {
$entry [ 'post_status' ] = 'publish' ;
}
2006-11-19 02:56:05 -05:00
$struct [] = array (
'dateCreated' => new IXR_Date ( $post_date ),
'userid' => $entry [ 'post_author' ],
'postid' => $entry [ 'ID' ],
'description' => $post [ 'main' ],
'title' => $entry [ 'post_title' ],
'link' => $link ,
'permaLink' => $link ,
2004-09-17 16:53:18 -04:00
// commented out because no other tool seems to use this
// 'content' => $entry['post_content'],
2006-11-19 02:56:05 -05:00
'categories' => $categories ,
'mt_excerpt' => $entry [ 'post_excerpt' ],
'mt_text_more' => $post [ 'extended' ],
'mt_allow_comments' => $allow_comments ,
2007-01-29 22:09:58 -05:00
'mt_allow_pings' => $allow_pings ,
2007-08-29 19:01:48 -04:00
'mt_keywords' => $tagnames ,
2007-01-29 22:09:58 -05:00
'wp_slug' => $entry [ 'post_name' ],
'wp_password' => $entry [ 'post_password' ],
2007-02-02 02:43:59 -05:00
'wp_author_id' => $author -> ID ,
2007-08-16 23:18:58 -04:00
'wp_author_display_name' => $author -> display_name ,
2007-12-05 02:42:42 -05:00
'date_created_gmt' => new IXR_Date ( $post_date_gmt ),
2007-12-19 16:07:38 -05:00
'post_status' => $entry [ 'post_status' ],
'custom_fields' => $this -> get_custom_fields ( $entry [ 'ID' ])
2006-11-19 02:56:05 -05:00
);
2004-09-17 16:53:18 -04:00
2006-11-19 02:56:05 -05:00
}
2004-09-17 16:53:18 -04:00
2006-11-19 02:56:05 -05:00
$recent_posts = array ();
for ( $j = 0 ; $j < count ( $struct ); $j ++ ) {
array_push ( $recent_posts , $struct [ $j ]);
}
return $recent_posts ;
2004-09-17 16:53:18 -04:00
}
2004-09-17 16:48:43 -04:00
2007-07-30 12:32:12 -04:00
/* metaweblog.getCategories ...returns the list of categories on a given blog */
2004-09-17 16:53:18 -04:00
function mw_getCategories ( $args ) {
2004-09-17 16:48:43 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_ID = ( int ) $args [ 0 ];
2006-11-19 02:56:05 -05:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-09-17 16:48:43 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-17 16:48:43 -04:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_posts' ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you must be able to edit posts on this blog in order to view categories.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'metaWeblog.getCategories' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$categories_struct = array ();
2004-09-17 16:48:43 -04:00
2007-06-25 17:34:06 -04:00
if ( $cats = get_categories ( 'get=all' ) ) {
foreach ( $cats as $cat ) {
$struct [ 'categoryId' ] = $cat -> term_id ;
$struct [ 'parentId' ] = $cat -> parent ;
$struct [ 'description' ] = $cat -> name ;
$struct [ 'categoryName' ] = $cat -> name ;
$struct [ 'htmlUrl' ] = wp_specialchars ( get_category_link ( $cat -> term_id ));
$struct [ 'rssUrl' ] = wp_specialchars ( get_category_rss_link ( false , $cat -> term_id , $cat -> name ));
2004-09-17 16:48:43 -04:00
2006-11-19 02:56:05 -05:00
$categories_struct [] = $struct ;
}
}
2004-09-17 16:48:43 -04:00
2006-11-19 02:56:05 -05:00
return $categories_struct ;
2004-08-26 11:42:43 -04:00
}
2004-08-27 04:46:24 -04:00
2004-09-17 16:53:18 -04:00
/* metaweblog.newMediaObject uploads a file, following your settings */
function mw_newMediaObject ( $args ) {
2005-12-01 17:51:40 -05:00
// adapted from a patch by Johann Richard
// http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/
2004-09-17 16:53:18 -04:00
2005-06-29 20:12:18 -04:00
global $wpdb ;
2005-06-30 12:07:42 -04:00
2007-03-22 20:59:21 -04:00
$blog_ID = ( int ) $args [ 0 ];
2005-12-01 17:51:40 -05:00
$user_login = $wpdb -> escape ( $args [ 1 ]);
2005-06-29 20:12:18 -04:00
$user_pass = $wpdb -> escape ( $args [ 2 ]);
2005-12-01 17:51:40 -05:00
$data = $args [ 3 ];
2004-09-17 16:53:18 -04:00
2007-01-09 17:53:14 -05:00
$name = sanitize_file_name ( $data [ 'name' ] );
2005-12-01 17:51:40 -05:00
$type = $data [ 'type' ];
$bits = $data [ 'bits' ];
2004-09-17 16:53:18 -04:00
2007-06-08 13:07:59 -04:00
logIO ( 'O' , '(MW) Received ' . strlen ( $bits ) . ' bytes' );
if ( ! $this -> login_pass_ok ( $user_login , $user_pass ) )
return $this -> error ;
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'metaWeblog.newMediaObject' );
2007-12-22 20:35:44 -05:00
2007-06-08 13:07:59 -04:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'upload_files' ) ) {
logIO ( 'O' , '(MW) User does not have upload_files capability' );
$this -> error = new IXR_Error ( 401 , __ ( 'You are not allowed to upload files to this site.' ));
return $this -> error ;
}
if ( $upload_err = apply_filters ( " pre_upload_error " , false ) )
return new IXR_Error ( 500 , $upload_err );
2007-02-21 20:42:21 -05:00
if ( ! empty ( $data [ " overwrite " ]) && ( $data [ " overwrite " ] == true )) {
2007-03-03 11:56:46 -05:00
// Get postmeta info on the object.
2007-03-09 15:14:52 -05:00
$old_file = $wpdb -> get_row ( "
SELECT ID
FROM { $wpdb -> posts }
WHERE post_title = '{$name}'
AND post_type = 'attachment'
2007-03-03 11:56:46 -05:00
" );
2007-03-09 15:14:52 -05:00
// Delete previous file.
wp_delete_attachment ( $old_file -> ID );
// Make sure the new name is different by pre-pending the
// previous post id.
$filename = preg_replace ( " /^wpid \ d+-/ " , " " , $name );
$name = " wpid { $old_file -> ID } - { $filename } " ;
2007-02-21 20:42:21 -05:00
}
2007-12-06 14:49:33 -05:00
$upload = wp_upload_bits ( $name , $type , $bits );
2005-12-28 21:07:10 -05:00
if ( ! empty ( $upload [ 'error' ]) ) {
2007-05-25 11:33:47 -04:00
$errorString = sprintf ( __ ( 'Could not write file %1$s (%2$s)' ), $name , $upload [ 'error' ]);
2007-03-16 18:12:15 -04:00
logIO ( 'O' , '(MW) ' . $errorString );
return new IXR_Error ( 500 , $errorString );
2005-12-01 17:51:40 -05:00
}
2006-11-30 23:34:59 -05:00
// Construct the attachment array
// attach to post_id -1
$post_id = - 1 ;
$attachment = array (
'post_title' => $name ,
'post_content' => '' ,
'post_type' => 'attachment' ,
'post_parent' => $post_id ,
'post_mime_type' => $type ,
'guid' => $upload [ 'url' ]
);
2007-02-21 20:42:21 -05:00
2007-03-03 11:56:46 -05:00
// Save the data
2007-03-22 22:05:29 -04:00
$id = wp_insert_attachment ( $attachment , $upload [ 'file' ], $post_id );
2007-03-03 11:56:46 -05:00
wp_update_attachment_metadata ( $id , wp_generate_attachment_metadata ( $id , $upload [ 'file' ] ) );
2007-03-09 15:14:52 -05:00
return apply_filters ( 'wp_handle_upload' , array ( 'file' => $name , 'url' => $upload [ 'url' ], 'type' => $type ) );
2004-08-27 04:46:24 -04:00
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:53:18 -04:00
/* MovableType API functions
* specs on http :// www . movabletype . org / docs / mtmanual_programmatic . html
*/
2004-09-14 12:52:13 -04:00
2004-09-17 16:53:18 -04:00
/* mt.getRecentPostTitles ...returns recent posts' titles */
function mt_getRecentPostTitles ( $args ) {
2004-09-14 12:52:13 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_ID = ( int ) $args [ 0 ];
2006-11-19 02:56:05 -05:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2007-03-22 20:59:21 -04:00
$num_posts = ( int ) $args [ 3 ];
2004-09-14 12:52:13 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-14 12:52:13 -04:00
2008-01-18 02:52:15 -05:00
do_action ( 'xmlrpc_call' , 'mt.getRecentPostTitles' );
2006-11-19 02:56:05 -05:00
$posts_list = wp_get_recent_posts ( $num_posts );
2004-09-14 12:52:13 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $posts_list ) {
2007-04-01 11:59:50 -04:00
$this -> error = new IXR_Error ( 500 , __ ( 'Either there are no posts, or something went wrong.' ));
2006-11-19 02:56:05 -05:00
return $this -> error ;
}
2004-09-14 12:52:13 -04:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
2006-11-19 02:56:05 -05:00
foreach ( $posts_list as $entry ) {
2008-02-05 01:47:27 -05:00
if ( ! current_user_can ( 'edit_post' , $entry [ 'ID' ] ) )
2007-12-27 17:14:27 -05:00
continue ;
2004-09-14 12:52:13 -04:00
2007-08-16 23:18:58 -04:00
$post_date = mysql2date ( 'Ymd\TH:i:s' , $entry [ 'post_date' ]);
$post_date_gmt = mysql2date ( 'Ymd\TH:i:s' , $entry [ 'post_date_gmt' ]);
2004-09-14 12:52:13 -04:00
2006-11-19 02:56:05 -05:00
$struct [] = array (
'dateCreated' => new IXR_Date ( $post_date ),
'userid' => $entry [ 'post_author' ],
'postid' => $entry [ 'ID' ],
'title' => $entry [ 'post_title' ],
2007-08-16 23:18:58 -04:00
'date_created_gmt' => new IXR_Date ( $post_date_gmt )
2006-11-19 02:56:05 -05:00
);
2004-09-14 12:52:13 -04:00
2006-11-19 02:56:05 -05:00
}
$recent_posts = array ();
for ( $j = 0 ; $j < count ( $struct ); $j ++ ) {
array_push ( $recent_posts , $struct [ $j ]);
}
return $recent_posts ;
2004-09-14 12:52:13 -04:00
}
2007-07-30 12:32:12 -04:00
/* mt.getCategoryList ...returns the list of categories on a given blog */
2004-09-17 16:53:18 -04:00
function mt_getCategoryList ( $args ) {
2004-09-14 12:52:13 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$blog_ID = ( int ) $args [ 0 ];
2006-11-19 02:56:05 -05:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-09-14 12:52:13 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-14 12:52:13 -04:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_posts' ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you must be able to edit posts on this blog in order to view categories.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'mt.getCategoryList' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$categories_struct = array ();
2004-09-14 12:52:13 -04:00
2007-05-23 16:59:11 -04:00
if ( $cats = get_categories ( 'hide_empty=0&hierarchical=0' ) ) {
2006-11-19 02:56:05 -05:00
foreach ( $cats as $cat ) {
2007-05-23 16:59:11 -04:00
$struct [ 'categoryId' ] = $cat -> term_id ;
$struct [ 'categoryName' ] = $cat -> name ;
2004-09-14 12:52:13 -04:00
2006-11-19 02:56:05 -05:00
$categories_struct [] = $struct ;
}
}
2004-09-14 12:52:13 -04:00
2006-11-19 02:56:05 -05:00
return $categories_struct ;
2004-09-14 12:52:13 -04:00
}
2004-09-16 09:26:06 -04:00
2004-09-17 16:53:18 -04:00
/* mt.getPostCategories ...returns a post's categories */
function mt_getPostCategories ( $args ) {
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$post_ID = ( int ) $args [ 0 ];
2006-11-19 02:56:05 -05:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-09-17 16:53:18 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-17 16:53:18 -04:00
2007-12-27 17:14:27 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_post' , $post_ID ) )
return new IXR_Error ( 401 , __ ( 'Sorry, you can not edit this post.' ) );
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'mt.getPostCategories' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$categories = array ();
$catids = wp_get_post_categories ( intval ( $post_ID ));
// first listed category will be the primary category
$isPrimary = true ;
foreach ( $catids as $catid ) {
$categories [] = array (
'categoryName' => get_cat_name ( $catid ),
2007-01-25 13:27:47 -05:00
'categoryId' => ( string ) $catid ,
2006-11-19 02:56:05 -05:00
'isPrimary' => $isPrimary
);
$isPrimary = false ;
}
return $categories ;
2004-09-16 10:54:25 -04:00
}
2004-09-17 16:53:18 -04:00
/* mt.setPostCategories ...sets a post's categories */
function mt_setPostCategories ( $args ) {
2004-09-16 10:54:25 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$post_ID = ( int ) $args [ 0 ];
2006-11-19 02:56:05 -05:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
$categories = $args [ 3 ];
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-16 10:54:25 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'mt.setPostCategories' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_post' , $post_ID ) )
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 401 , __ ( 'Sorry, you can not edit this post.' ));
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
foreach ( $categories as $cat ) {
$catids [] = $cat [ 'categoryId' ];
}
2006-02-12 02:53:23 -05:00
2006-11-19 02:56:05 -05:00
wp_set_post_categories ( $post_ID , $catids );
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
return true ;
2004-09-17 16:53:18 -04:00
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
/* mt.supportedMethods ...returns an array of methods supported by this server */
function mt_supportedMethods ( $args ) {
2004-09-16 10:54:25 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'mt.supportedMethods' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$supported_methods = array ();
foreach ( $this -> methods as $key => $value ) {
$supported_methods [] = $key ;
}
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
return $supported_methods ;
2004-09-16 10:54:25 -04:00
}
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
/* mt . supportedTextFilters ... returns an empty array because we don ' t
2006-11-19 02:56:05 -05:00
support per - post text filters yet */
2004-09-17 16:53:18 -04:00
function mt_supportedTextFilters ( $args ) {
2008-01-18 02:52:15 -05:00
do_action ( 'xmlrpc_call' , 'mt.supportedTextFilters' );
2007-03-25 19:50:22 -04:00
return apply_filters ( 'xmlrpc_text_filters' , array ());
2004-09-17 16:53:18 -04:00
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:53:18 -04:00
/* mt.getTrackbackPings ...returns trackbacks sent to a given post */
function mt_getTrackbackPings ( $args ) {
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
global $wpdb ;
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
$post_ID = intval ( $args );
2004-09-16 10:54:25 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'mt.getTrackbackPings' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
$actual_post = wp_get_single_post ( $post_ID , ARRAY_A );
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $actual_post ) {
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 404 , __ ( 'Sorry, no such post.' ));
2006-11-19 02:56:05 -05:00
}
2004-09-16 10:54:25 -04:00
2008-04-14 12:13:25 -04: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 ) );
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $comments ) {
return array ();
}
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
$trackback_pings = array ();
foreach ( $comments as $comment ) {
if ( 'trackback' == $comment -> comment_type ) {
$content = $comment -> comment_content ;
$title = substr ( $content , 8 , ( strpos ( $content , '</strong>' ) - 8 ));
$trackback_pings [] = array (
'pingTitle' => $title ,
'pingURL' => $comment -> comment_author_url ,
'pingIP' => $comment -> comment_author_IP
);
}
2004-09-16 10:54:25 -04:00
}
2006-11-19 02:56:05 -05:00
return $trackback_pings ;
2004-09-16 10:54:25 -04:00
}
2004-09-17 16:53:18 -04:00
/* mt.publishPost ...sets a post's publish status to 'publish' */
function mt_publishPost ( $args ) {
2004-09-16 10:54:25 -04:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2007-03-22 20:59:21 -04:00
$post_ID = ( int ) $args [ 0 ];
2006-11-19 02:56:05 -05:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-16 10:54:25 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'mt.publishPost' );
2007-12-22 20:35:44 -05:00
2006-11-19 02:56:05 -05:00
set_current_user ( 0 , $user_login );
if ( ! current_user_can ( 'edit_post' , $post_ID ) )
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 401 , __ ( 'Sorry, you can not edit this post.' ));
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
$postdata = wp_get_single_post ( $post_ID , ARRAY_A );
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
$postdata [ 'post_status' ] = 'publish' ;
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
// retain old cats
$cats = wp_get_post_categories ( $post_ID );
$postdata [ 'post_category' ] = $cats ;
2005-06-28 18:16:27 -04:00
$this -> escape ( $postdata );
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
$result = wp_update_post ( $postdata );
2004-09-16 10:54:25 -04:00
2006-11-19 02:56:05 -05:00
return $result ;
2004-09-17 16:53:18 -04:00
}
2004-09-16 10:54:25 -04:00
2004-09-16 09:26:06 -04:00
2004-09-17 16:53:18 -04:00
/* PingBack functions
* specs on www . hixie . ch / specs / pingback / pingback
*/
2004-09-16 09:26:06 -04:00
2004-09-17 16:53:18 -04:00
/* pingback.ping gets a pingback and registers it */
function pingback_ping ( $args ) {
2007-12-06 14:49:33 -05:00
global $wpdb ;
2004-09-16 09:26:06 -04:00
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'pingback.ping' );
2007-12-22 20:35:44 -05:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2004-09-17 16:53:18 -04:00
$pagelinkedfrom = $args [ 0 ];
$pagelinkedto = $args [ 1 ];
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
$title = '' ;
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
$pagelinkedfrom = str_replace ( '&' , '&' , $pagelinkedfrom );
2007-09-18 12:42:25 -04:00
$pagelinkedto = str_replace ( '&' , '&' , $pagelinkedto );
$pagelinkedto = str_replace ( '&' , '&' , $pagelinkedto );
2004-09-17 16:48:43 -04:00
2004-09-17 16:53:18 -04:00
// Check if the page linked to is in our site
2006-08-30 17:46:31 -04:00
$pos1 = strpos ( $pagelinkedto , str_replace ( array ( 'http://www.' , 'http://' , 'https://www.' , 'https://' ), '' , get_option ( 'home' )));
2005-06-04 06:15:36 -04:00
if ( ! $pos1 )
2007-12-06 14:49:33 -05:00
return new IXR_Error ( 0 , __ ( 'Is there no link to us?' ));
2004-09-16 09:26:06 -04:00
// let's find which post is linked to
2004-09-17 16:53:18 -04:00
// FIXME: does url_to_postid() cover all these cases already?
// if so, then let's use it and drop the old code.
2004-09-16 09:26:06 -04:00
$urltest = parse_url ( $pagelinkedto );
if ( $post_ID = url_to_postid ( $pagelinkedto )) {
$way = 'url_to_postid()' ;
2004-09-17 16:53:18 -04:00
} elseif ( preg_match ( '#p/[0-9]{1,}#' , $urltest [ 'path' ], $match )) {
2004-09-16 09:26:06 -04:00
// the path defines the post_ID (archives/p/XXXX)
$blah = explode ( '/' , $match [ 0 ]);
2007-03-22 20:59:21 -04:00
$post_ID = ( int ) $blah [ 1 ];
2004-09-16 09:26:06 -04:00
$way = 'from the path' ;
} elseif ( preg_match ( '#p=[0-9]{1,}#' , $urltest [ 'query' ], $match )) {
// the querystring defines the post_ID (?p=XXXX)
$blah = explode ( '=' , $match [ 0 ]);
2007-03-22 20:59:21 -04:00
$post_ID = ( int ) $blah [ 1 ];
2004-09-16 09:26:06 -04:00
$way = 'from the querystring' ;
} elseif ( isset ( $urltest [ 'fragment' ])) {
// an #anchor is there, it's either...
if ( intval ( $urltest [ 'fragment' ])) {
// ...an integer #XXXX (simpliest case)
2007-03-22 20:59:21 -04:00
$post_ID = ( int ) $urltest [ 'fragment' ];
2004-09-16 09:26:06 -04:00
$way = 'from the fragment (numeric)' ;
} elseif ( preg_match ( '/post-[0-9]+/' , $urltest [ 'fragment' ])) {
// ...a post id in the form 'post-###'
$post_ID = preg_replace ( '/[^0-9]+/' , '' , $urltest [ 'fragment' ]);
$way = 'from the fragment (post-###)' ;
} elseif ( is_string ( $urltest [ 'fragment' ])) {
// ...or a string #title, a little more complicated
2005-06-04 06:15:36 -04:00
$title = preg_replace ( '/[^a-z0-9]/i' , '.' , $urltest [ 'fragment' ]);
2008-04-14 12:13:25 -04:00
$sql = $wpdb -> prepare ( " SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s " , $title );
2004-09-17 16:53:18 -04:00
if ( ! ( $post_ID = $wpdb -> get_var ( $sql )) ) {
// returning unknown error '0' is better than die()ing
return new IXR_Error ( 0 , '' );
}
2004-09-16 09:26:06 -04:00
$way = 'from the fragment (title)' ;
}
} else {
// TODO: Attempt to extract a post ID from the given URL
2007-05-25 11:33:47 -04:00
return new IXR_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.' ));
2004-09-16 09:26:06 -04:00
}
2005-06-04 06:15:36 -04:00
$post_ID = ( int ) $post_ID ;
2004-09-16 09:26:06 -04:00
2006-08-30 12:40:17 -04:00
logIO ( " O " , " (PB) URL=' $pagelinkedto ' ID=' $post_ID ' Found=' $way ' " );
2004-09-16 09:26:06 -04:00
2005-06-30 12:07:42 -04:00
$post = get_post ( $post_ID );
2004-09-16 09:26:06 -04:00
2005-06-04 06:15:36 -04:00
if ( ! $post ) // Post_ID not found
2007-05-25 11:33:47 -04:00
return new IXR_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.' ));
2004-09-17 16:53:18 -04:00
2005-11-05 11:20:09 -05:00
if ( $post_ID == url_to_postid ( $pagelinkedfrom ) )
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 0 , __ ( 'The source URL and the target URL cannot both point to the same resource.' ));
2005-11-05 11:20:09 -05:00
2005-06-04 06:15:36 -04:00
// Check if pings are on
if ( 'closed' == $post -> ping_status )
2007-05-25 11:33:47 -04:00
return new IXR_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.' ));
2004-09-17 16:53:18 -04:00
// Let's check that the remote site didn't already pingback this entry
2008-04-14 12:13:25 -04:00
$wpdb -> get_results ( $wpdb -> prepare ( " SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s " , $post_ID , $pagelinkedfrom ) );
2004-09-17 16:53:18 -04:00
2005-06-04 06:15:36 -04:00
if ( $wpdb -> num_rows ) // We already have a Pingback from this URL
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 48 , __ ( 'The pingback has already been registered.' ));
2004-09-16 09:26:06 -04:00
2004-09-17 16:53:18 -04:00
// very stupid, but gives time to the 'from' server to publish !
sleep ( 1 );
2004-09-16 09:26:06 -04:00
2004-09-17 16:53:18 -04:00
// Let's check the remote site
2005-05-03 03:52:11 -04:00
$linea = wp_remote_fopen ( $pagelinkedfrom );
if ( ! $linea )
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 16 , __ ( 'The source URL does not exist.' ));
2004-09-16 11:20:39 -04:00
2008-03-14 15:08:09 -04:00
$linea = apply_filters ( 'pre_remote_source' , $linea , $pagelinkedto );
2004-09-17 16:53:18 -04:00
// Work around bug in strip_tags():
2005-06-04 06:15:36 -04:00
$linea = str_replace ( '<!DOC' , '<DOC' , $linea );
$linea = preg_replace ( '/[\s\r\n\t]+/' , ' ' , $linea ); // normalize spaces
$linea = preg_replace ( " / <(h1|h2|h3|h4|h5|h6|p|th|td|li|dt|dd|pre|caption|input|textarea|button|body)[^>]*>/ " , " \n \n " , $linea );
2004-09-17 16:53:18 -04:00
2005-06-04 06:15:36 -04:00
preg_match ( '|<title>([^<]*?)</title>|is' , $linea , $matchtitle );
$title = $matchtitle [ 1 ];
if ( empty ( $title ) )
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 32 , __ ( 'We cannot find a title on that page.' ));
2004-09-17 16:53:18 -04:00
2005-06-04 06:15:36 -04:00
$linea = strip_tags ( $linea , '<a>' ); // just keep the tag we need
2004-09-17 16:53:18 -04:00
2005-06-04 06:15:36 -04:00
$p = explode ( " \n \n " , $linea );
2006-02-12 02:53:23 -05:00
2006-12-27 01:10:03 -05:00
$preg_target = preg_quote ( $pagelinkedto );
2006-02-12 02:53:23 -05:00
2005-06-04 06:15:36 -04:00
foreach ( $p as $para ) {
2006-12-27 01:10:03 -05:00
if ( strpos ( $para , $pagelinkedto ) !== false ) { // it exists, but is it a link?
preg_match ( " |<a[^>]+? " . $preg_target . " [^>]*>([^>]+?)</a>| " , $para , $context );
// If the URL isn't in a link context, keep looking
if ( empty ( $context ) )
continue ;
// 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
$excerpt = preg_replace ( '|\</?wpcontext\>|' , '' , $para );
// prevent really long link text
if ( strlen ( $context [ 1 ]) > 100 )
$context [ 1 ] = substr ( $context [ 1 ], 0 , 100 ) . '...' ;
$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
$excerpt = trim ( $excerpt );
$preg_marker = preg_quote ( $marker );
$excerpt = preg_replace ( " |.*? \ s(. { 0,100} $preg_marker . { 0,100}) \ s.*|s " , '$1' , $excerpt );
$excerpt = strip_tags ( $excerpt ); // YES, again, to remove the marker wrapper
break ;
2005-06-04 06:15:36 -04:00
}
2004-09-17 16:53:18 -04:00
}
2006-12-27 01:10:03 -05:00
if ( empty ( $context ) ) // Link to target not found
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 17 , __ ( 'The source URL does not contain a link to the target URL, and so cannot be used as a source.' ));
2005-08-02 20:30:40 -04:00
2007-09-18 12:42:25 -04:00
$pagelinkedfrom = str_replace ( '&' , '&' , $pagelinkedfrom );
2005-06-04 06:15:36 -04:00
$context = '[...] ' . wp_specialchars ( $excerpt ) . ' [...]' ;
2005-07-05 16:47:22 -04:00
$pagelinkedfrom = $wpdb -> escape ( $pagelinkedfrom );
2004-09-17 16:53:18 -04:00
2006-07-26 18:18:36 -04:00
$comment_post_ID = ( int ) $post_ID ;
2004-09-22 15:45:29 -04:00
$comment_author = $title ;
2006-07-26 18:18:36 -04:00
$this -> escape ( $comment_author );
2004-09-22 15:45:29 -04:00
$comment_author_url = $pagelinkedfrom ;
$comment_content = $context ;
2006-07-26 18:18:36 -04:00
$this -> escape ( $comment_content );
2004-09-22 15:45:29 -04:00
$comment_type = 'pingback' ;
2004-09-17 16:53:18 -04:00
2004-09-22 15:45:29 -04:00
$commentdata = compact ( 'comment_post_ID' , 'comment_author' , 'comment_author_url' , 'comment_content' , 'comment_type' );
2007-03-22 22:05:29 -04:00
$comment_ID = wp_new_comment ( $commentdata );
2006-11-24 11:39:51 -05:00
do_action ( 'pingback_post' , $comment_ID );
2006-02-12 02:53:23 -05:00
2007-05-25 11:33:47 -04:00
return sprintf ( __ ( 'Pingback from %1$s to %2$s registered. Keep the web talking! :-)' ), $pagelinkedfrom , $pagelinkedto );
2004-09-17 16:53:18 -04:00
}
/* pingback . extensions . getPingbacks returns an array of URLs
2006-11-19 02:56:05 -05:00
that pingbacked the given URL
specs on http :// www . aquarionics . com / misc / archives / blogite / 0198. html */
2004-09-17 16:53:18 -04:00
function pingback_extensions_getPingbacks ( $args ) {
global $wpdb ;
2007-12-23 04:15:57 -05:00
do_action ( 'xmlrpc_call' , 'pingback.extensions.getPingsbacks' );
2007-12-22 20:35:44 -05:00
2005-06-28 18:16:27 -04:00
$this -> escape ( $args );
2004-09-17 16:53:18 -04:00
$url = $args ;
2007-03-22 22:05:29 -04:00
$post_ID = url_to_postid ( $url );
2004-09-17 16:53:18 -04:00
if ( ! $post_ID ) {
// We aren't sure that the resource is available and/or pingback enabled
2007-05-25 11:33:47 -04:00
return new IXR_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.' ));
2004-09-17 16:53:18 -04:00
}
$actual_post = wp_get_single_post ( $post_ID , ARRAY_A );
if ( ! $actual_post ) {
// No such post = resource not found
2007-04-01 11:59:50 -04:00
return new IXR_Error ( 32 , __ ( 'The specified target URL does not exist.' ));
2004-09-17 16:53:18 -04:00
}
2008-04-14 12:13:25 -04: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 ) );
2004-09-17 16:53:18 -04:00
if ( ! $comments ) {
return array ();
}
$pingbacks = array ();
foreach ( $comments as $comment ) {
2005-01-06 18:10:28 -05:00
if ( 'pingback' == $comment -> comment_type )
2004-09-17 16:53:18 -04:00
$pingbacks [] = $comment -> comment_author_url ;
2004-09-16 11:20:39 -04:00
}
2004-09-17 16:53:18 -04:00
return $pingbacks ;
2004-09-16 11:20:39 -04:00
}
2004-05-23 12:42:23 -04:00
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:53:18 -04:00
$wp_xmlrpc_server = new wp_xmlrpc_server ();
2008-05-25 11:50:15 -04:00
?>