2004-05-23 04:02:53 +00:00
< ? php
# fix for mozBlog and other cases where '<?xml' isn't on the very first line
$HTTP_RAW_POST_DATA = trim ( $HTTP_RAW_POST_DATA );
2004-09-17 20:53:18 +00:00
include ( '../wp-config.php' );
include_once ( ABSPATH . WPINC . '/class-IXR.php' );
include_once ( ABSPATH . WPINC . '/functions-post.php' );
2004-05-23 04:02:53 +00:00
// Turn off all warnings and errors.
2004-09-17 20:53:18 +00:00
// error_reporting(0);
2004-05-23 04:02:53 +00:00
$post_default_title = " " ; // posts submitted via the xmlrpc interface get that title
$post_default_category = 1 ; // posts submitted via the xmlrpc interface go into that category
2004-09-14 17:20:22 +00:00
$xmlrpc_logging = 0 ;
2004-05-23 04:02:53 +00:00
function logIO ( $io , $msg ) {
global $xmlrpc_logging ;
if ( $xmlrpc_logging ) {
2004-09-17 20:53:18 +00:00
$fp = fopen ( " ../xmlrpc.log " , " a+ " );
2004-05-23 04:02:53 +00: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 ;
}
function starify ( $string ) {
$i = strlen ( $string );
return str_repeat ( '*' , $i );
}
logIO ( " I " , $HTTP_RAW_POST_DATA );
2004-09-01 16:13:35 +00:00
2004-09-17 20:53:18 +00:00
function printr ( $var , $do_not_echo = false ) {
// from php.net/print_r user contributed notes
ob_start ();
print_r ( $var );
$code = htmlentities ( ob_get_contents ());
ob_clean ();
if ( ! $do_not_echo ) {
echo " <pre> $code </pre> " ;
2004-08-27 08:46:24 +00:00
}
2004-09-17 20:53:18 +00:00
return $code ;
2004-08-26 15:42:43 +00:00
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
function mkdir_p ( $target ) {
// from php.net/mkdir user contributed notes
if ( file_exists ( $target )) {
if ( ! is_dir ( $target )) {
return false ;
} else {
return true ;
}
2004-09-01 16:13:35 +00:00
}
2004-09-17 20:53:18 +00:00
// Attempting to create the directory may clutter up our display.
if ( @ mkdir ( $target )) {
return true ;
2004-09-01 16:13:35 +00:00
}
2004-09-17 20:53:18 +00:00
// If the above failed, attempt to create the parent node, then try again.
if ( mkdir_p ( dirname ( $target ))) {
return mkdir_p ( $target );
2004-09-01 16:13:35 +00:00
}
2004-09-17 20:53:18 +00:00
return false ;
2004-09-01 16:13:35 +00:00
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
class wp_xmlrpc_server extends IXR_Server {
function wp_xmlrpc_server () {
$this -> methods = array (
// 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'
);
$this -> IXR_Server ( $this -> methods );
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
function sayHello ( $args ) {
return 'Hello!' ;
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
function addTwoNumbers ( $args ) {
$number1 = $args [ 0 ];
$number2 = $args [ 1 ];
return $number1 + $number2 ;
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
function login_pass_ok ( $user_login , $user_pass ) {
if ( ! user_pass_ok ( $user_login , $user_pass )) {
$this -> error = new IXR_Error ( 403 , 'Bad login/pass combination.' );
return false ;
}
return true ;
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:48:43 +00:00
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
/* Blogger API functions
* specs on http :// plant . blogger . com / api and http :// groups . yahoo . com / group / bloggerDev /
*/
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
/* blogger.getUsersBlogs will make more sense once we support multiple blogs */
function blogger_getUsersBlogs ( $args ) {
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
$is_admin = $user_data -> user_level > 3 ;
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$struct = array (
'isAdmin' => $is_admin ,
'url' => get_settings ( 'home' ) . '/' . get_settings ( 'blogfilename' ),
'blogid' => '1' ,
'blogName' => get_settings ( 'blogname' )
);
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
return array ( $struct );
2004-05-23 04:02:53 +00:00
}
2004-09-17 20:53:18 +00:00
/* blogger.getUsersInfo gives your client some info about you, so you don't have to */
function blogger_getUserInfo ( $args ) {
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$struct = array (
'nickname' => $user_data -> user_nickname ,
'userid' => $user_data -> ID ,
'url' => $user_data -> user_url ,
'email' => $user_data -> user_email ,
'lastname' => $user_data -> user_lastname ,
'firstname' => $user_data -> user_firstname
);
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
return $struct ;
2004-09-17 20:48:43 +00:00
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
/* blogger.getPost ...gets a post */
function blogger_getPost ( $args ) {
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = $args [ 1 ];
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
$post_data = wp_get_single_post ( $post_ID , ARRAY_A );
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$categories = implode ( ',' , wp_get_post_cats ( 1 , $post_ID ));
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$content = '<title>' . stripslashes ( $post_data [ 'post_title' ]) . '</title>' ;
$content .= '<category>' . $categories . '</category>' ;
$content .= stripslashes ( $post_data [ 'post_content' ]);
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00: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 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
return $struct ;
2004-05-23 04:02:53 +00:00
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* blogger.getRecentPosts ...gets recent posts */
function blogger_getRecentPosts ( $args ) {
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
$blog_ID = $args [ 1 ]; /* though we don't use it yet */
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$num_posts = $args [ 4 ];
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
$posts_list = wp_get_recent_posts ( $num_posts );
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $posts_list ) {
$this -> error = new IXR_Error ( 500 , 'Either there are no posts, or something went wrong.' );
return $this -> error ;
}
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
foreach ( $posts_list as $entry ) {
$post_date = mysql2date ( 'Ymd\TH:i:s' , $entry [ 'post_date' ]);
$categories = implode ( ',' , wp_get_post_cats ( 1 , $entry [ 'ID' ]));
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
$content = '<title>' . stripslashes ( $entry [ 'post_itle' ]) . '</title>' ;
$content .= '<category>' . $categories . '</category>' ;
$content .= stripslashes ( $entry [ 'post_content' ]);
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$struct [] = array (
'userid' => $entry [ 'post_author' ],
'dateCreated' => new IXR_Date ( $post_date ),
'content' => $content ,
'postid' => $entry [ 'ID' ],
);
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
}
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
$recent_posts = array ();
for ( $j = 0 ; $j < count ( $struct ); $j ++ ) {
array_push ( $recent_posts , $struct [ $j ]);
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
return $recent_posts ;
2004-05-23 15:46:43 +00:00
}
2004-09-17 20:53:18 +00:00
/* blogger.getTemplate returns your blog_filename */
function blogger_getTemplate ( $args ) {
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
$blog_ID = $args [ 1 ];
$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 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
if ( $user_data -> user_level < 3 ) {
return new IXR_Error ( 401 , 'Sorry, users whose level is less than 3, can not edit the template.' );
}
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
/* warning: here we make the assumption that the weblog's URI is on the same server */
$filename = get_settings ( 'home' ) . '/' . get_settings ( 'blogfilename' );
$filename = preg_replace ( '#http://.+?/#' , $_SERVER [ 'DOCUMENT_ROOT' ] . '/' , $filename );
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$f = fopen ( $filename , 'r' );
$content = fread ( $f , filesize ( $filename ));
fclose ( $f );
2004-05-23 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
/* so it is actually editable with a windows/mac client */
// 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 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
return $content ;
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* blogger.setTemplate updates the content of blog_filename */
function blogger_setTemplate ( $args ) {
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$blog_ID = $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 15:46:43 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
if ( $user_data -> user_level < 3 ) {
return new IXR_Error ( 401 , 'Sorry, users whose level is less than 3, can not edit the template.' );
}
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
/* warning: here we make the assumption that the weblog's URI is on the same server */
$filename = get_settings ( 'home' ) . '/' . get_settings ( 'blogfilename' );
$filename = preg_replace ( '#http://.+?/#' , $_SERVER [ 'DOCUMENT_ROOT' ] . '/' , $filename );
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
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 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
return true ;
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* blogger.newPost ...creates a new post */
function blogger_newPost ( $args ) {
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$blog_ID = $args [ 1 ]; /* though we don't use it yet */
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$content = $args [ 4 ];
$publish = $args [ 5 ];
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
if ( ! user_can_create_post ( $user_data -> ID , $blog_ID )) {
return new IXR_Error ( 401 , 'Sorry, you can not post on this weblog or category.' );
}
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$post_status = ( $publish ) ? 'publish' : 'draft' ;
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$post_author = $user_data -> ID ;
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$post_title = xmlrpc_getposttitle ( $content );
$post_category = xmlrpc_getpostcategory ( $content );
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$content = xmlrpc_removepostdata ( $content );
$post_content = format_to_post ( $content );
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$post_date = current_time ( 'mysql' );
$post_date_gmt = current_time ( 'mysql' , 1 );
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$post_data = compact ( 'blog_ID' , 'post_author' , 'post_date' , 'post_date_gmt' , 'post_content' , 'post_title' , 'post_category' , 'post_status' );
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = wp_insert_post ( $post_data );
2004-05-23 16:42:23 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $post_ID ) {
return new IXR_Error ( 500 , 'Sorry, your entry could not be posted. Something wrong happened.' );
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
logIO ( 'O' , " Posted ! ID: $post_ID " );
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
return $post_ID ;
2004-05-23 16:42:23 +00:00
}
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
/* blogger.editPost ...edits a post */
function blogger_editPost ( $args ) {
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = $args [ 1 ];
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$new_content = $args [ 4 ];
$publish = $args [ 5 ];
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$actual_post = wp_get_single_post ( $post_ID , ARRAY_A );
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $actual_post ) {
return new IXR_Error ( 404 , 'Sorry, no such post.' );
}
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$post_author_data = get_userdata ( $actual_post [ 'post_author' ]);
$user_data = get_userdatabylogin ( $user_login );
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
if ( ! user_can_edit_post ( $user_data -> ID , $post_ID )) {
return new IXR_Error ( 401 , 'Sorry, you do not have the right to edit this post.' );
}
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
extract ( $actual_post );
$content = $newcontent ;
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$post_title = xmlrpc_getposttitle ( $content );
$post_category = xmlrpc_getpostcategory ( $content );
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$content = xmlrpc_removepostdata ( $content );
$post_content = format_to_post ( $content );
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$postdata = compact ( 'ID' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' );
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$result = wp_update_post ( $postdata );
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $result ) {
return new IXR_Error ( 500 , 'For some strange yet very annoying reason, this post could not be edited.' );
}
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
return true ;
2004-08-25 15:24:09 +00:00
}
2004-09-17 20:53:18 +00:00
/* blogger.deletePost ...deletes a post */
function blogger_deletePost ( $args ) {
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = $args [ 1 ];
$user_login = $args [ 2 ];
$user_pass = $args [ 3 ];
$publish = $args [ 4 ];
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
$actual_post = wp_get_single_post ( $post_ID , ARRAY_A );
2004-08-25 15:24:09 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $actual_post ) {
return new IXR_Error ( 404 , 'Sorry, no such post.' );
}
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
if ( ! user_can_delete_post ( $user_data -> ID , $post_ID )) {
return new IXR_Error ( 401 , 'Sorry, you do not have the right to delete this post.' );
}
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$result = wp_delete_post ( $post_ID );
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $result ) {
return new IXR_Error ( 500 , 'For some strange yet very annoying reason, this post could not be deleted.' );
}
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
return true ;
2004-09-17 20:48:43 +00:00
}
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
/* MetaWeblog API functions
* specs on wherever Dave Winer wants them to be
*/
2004-09-14 17:20:22 +00:00
2004-09-17 20:53:18 +00:00
/* metaweblog.newPost creates a post */
function mw_newPost ( $args ) {
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$blog_ID = $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 ];
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
if ( ! user_can_create_post ( $user_data -> ID , $blog_ID )) {
return new IXR_Error ( 401 , 'Sorry, you can not post on this weblog or category.' );
}
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$post_author = $user_data -> ID ;
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$post_title = $content_struct [ 'title' ];
$post_content = format_to_post ( $content_struct [ 'description' ]);
$post_status = $publish ? 'publish' : 'draft' ;
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$post_excerpt = $content_struct [ 'mt_excerpt' ];
$post_more = $content_struct [ 'mt_text_more' ];
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$comment_status = ( empty ( $content_struct [ 'mt_allow_comments' ])) ?
get_settings ( 'default_comment_status' )
: $content_struct [ 'mt_allow_comments' ];
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$ping_status = ( empty ( $content_struct [ 'mt_allow_pings' ])) ?
get_settings ( 'default_ping_status' )
: $content_struct [ 'mt_allow_pings' ];
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
if ( $post_more ) {
$post_content = $post_content . " \n <!--more--> \n " . $post_more ;
}
// Do some timestamp voodoo
$dateCreatedd = $content_struct [ 'dateCreated' ];
$dateCreated = $dateCreatedd -> getIso ();
if ( ! empty ( $dateCreated )) {
$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 );
}
$catnames = $content_struct [ 'categories' ];
logio ( 'O' , 'Post cats: ' . printr ( $catnames , true ));
$post_category = array ();
if ( $catnames ) {
foreach ( $catnames as $cat ) {
$post_category [] = get_cat_ID ( $cat );
}
} else {
$post_category [] = 1 ;
}
// We've got all the data -- post it:
$postdata = compact ( 'post_author' , 'post_date' , 'post_date_gmt' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' , 'comment_status' , 'ping_status' );
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = wp_insert_post ( $postdata );
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $post_ID ) {
return new IXR_Error ( 500 , 'Sorry, your entry could not be posted. Something wrong happened.' );
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
logIO ( 'O' , " Posted ! ID: $post_ID " );
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
// FIXME: do we pingback always? pingback($content, $post_ID);
trackback_url_list ( $content_struct [ 'mt_tb_ping_urls' ], $post_ID );
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
return strval ( $post_ID );
2004-08-25 16:28:20 +00:00
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* metaweblog.editPost ...edits a post */
function mw_editPost ( $args ) {
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
$content_struct = $args [ 3 ];
$publish = $args [ 4 ];
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
if ( ! user_can_edit_post ( $user_data -> ID , $post_ID )) {
return new IXR_Error ( 401 , 'Sorry, you can not edit this post.' );
}
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$postdata = wp_get_single_post ( $post_ID , ARRAY_A );
extract ( $postdata );
2004-08-25 16:28:20 +00:00
2004-09-17 20:53:18 +00:00
$post_title = $content_struct [ 'title' ];
$post_content = format_to_post ( $content_struct [ 'description' ]);
$catnames = $content_struct [ 'categories' ];
if ( $catnames ) {
foreach ( $catnames as $cat ) {
$post_category [] = get_cat_ID ( $cat );
}
}
$post_excerpt = $content_struct [ 'mt_excerpt' ];
$post_more = $content_struct [ 'mt_text_more' ];
$post_status = $publish ? 'publish' : 'draft' ;
if ( $post_more ) {
$post_content = $post_content . " \n <!--more--> \n " . $post_more ;
}
$comment_status = ( empty ( $content_struct [ 'mt_allow_comments' ])) ?
get_settings ( 'default_comment_status' )
: $content_struct [ 'mt_allow_comments' ];
$ping_status = ( empty ( $content_struct [ 'mt_allow_pings' ])) ?
get_settings ( 'default_ping_status' )
: $content_struct [ 'mt_allow_pings' ];
// Do some timestamp voodoo
$dateCreated = $content_struct [ 'dateCreated' ];
$dateCreated = $dateCreated -> getIso ();
if ( ! empty ( $dateCreated )) {
$post_date = get_date_from_gmt ( iso8601_to_datetime ( $dateCreated ));
$post_date_gmt = iso8601_to_datetime ( $dateCreated , GMT );
} else {
$post_date = $postdata [ 'post_date' ];
$post_date_gmt = $postdata [ 'post_date_gmt' ];
}
// We've got all the data -- post it:
$newpost = compact ( 'ID' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' , 'comment_status' , 'ping_status' , 'post_date' , 'post_date_gmt' );
$post_ID = wp_update_post ( $newpost );
if ( ! $post_ID ) {
return new IXR_Error ( 500 , 'Sorry, your entry could not be edited. Something wrong happened.' );
}
logIO ( 'O' , " (MW) Edited ! ID: $post_ID " );
// FIXME: do we pingback always? pingback($content, $post_ID);
trackback_url_list ( $content_struct [ 'mt_tb_ping_urls' ], $post_ID );
return true ;
2004-08-26 15:42:43 +00:00
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* metaweblog.getPost ...returns a post */
function mw_getPost ( $args ) {
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-08-26 15:42:43 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-08-26 15:42:43 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-08-26 15:42:43 +00:00
2004-09-17 20:53:18 +00:00
$postdata = wp_get_single_post ( $post_ID , ARRAY_A );
2004-08-26 15:42:43 +00:00
2004-09-17 20:53:18 +00:00
if ( $postdata [ 'post_date' ] != '' ) {
2004-08-26 15:42:43 +00:00
2004-09-17 20:53:18 +00:00
$post_date = mysql2date ( 'Ymd\TH:i:s' , $postdata [ 'post_date' ]);
2004-08-26 15:42:43 +00:00
2004-09-17 20:53:18 +00:00
$categories = array ();
$catids = wp_get_post_cats ( '' , $post_ID );
foreach ( $catids as $catid ) {
$categories [] = get_cat_name ( $catid );
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$post = get_extended ( $postdata [ 'post_content' ]);
$link = post_permalink ( $postdata [ 'ID' ]);
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$allow_comments = ( 'open' == $postdata [ 'comment_status' ]) ? 1 : 0 ;
$allow_pings = ( 'open' == $postdata [ 'ping_status' ]) ? 1 : 0 ;
2004-08-26 15:42:43 +00:00
2004-09-17 20:53:18 +00: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
);
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
return $resp ;
} else {
return new IXR_Error ( 404 , 'Sorry, no such post.' );
}
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* metaweblog.getRecentPosts ...returns recent posts */
function mw_getRecentPosts ( $args ) {
$blog_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
$num_posts = $args [ 3 ];
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
$posts_list = wp_get_recent_posts ( $num_posts );
if ( ! $posts_list ) {
$this -> error = new IXR_Error ( 500 , 'Either there are no posts, or something went wrong.' );
return $this -> error ;
}
foreach ( $posts_list as $entry ) {
$post_date = mysql2date ( 'Ymd\TH:i:s' , $entry [ 'post_date' ]);
$categories = array ();
$catids = wp_get_post_cats ( '' , $entry [ 'ID' ]);
foreach ( $catids as $catid ) {
$categories [] = get_cat_name ( $catid );
}
$post = get_extended ( $entry [ 'post_content' ]);
$link = post_permalink ( $entry [ 'ID' ]);
$allow_comments = ( 'open' == $entry [ 'comment_status' ]) ? 1 : 0 ;
$allow_pings = ( 'open' == $entry [ 'ping_status' ]) ? 1 : 0 ;
$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 ,
// commented out because no other tool seems to use this
// 'content' => $entry['post_content'],
'categories' => $categories ,
'mt_excerpt' => $entry [ 'post_excerpt' ],
'mt_text_more' => $post [ 'extended' ],
'mt_allow_comments' => $allow_comments ,
'mt_allow_pings' => $allow_pings
);
}
$recent_posts = array ();
for ( $j = 0 ; $j < count ( $struct ); $j ++ ) {
array_push ( $recent_posts , $struct [ $j ]);
}
return $recent_posts ;
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* metaweblog.getCategories ...returns the list of categories on a given weblog */
function mw_getCategories ( $args ) {
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$blog_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$categories_struct = array ();
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
// FIXME: can we avoid using direct SQL there?
if ( $cats = $wpdb -> get_results ( " SELECT cat_ID,cat_name FROM $wpdb->categories " , ARRAY_A )) {
foreach ( $cats as $cat ) {
$struct [ 'categoryId' ] = $cat [ 'cat_ID' ];
$struct [ 'description' ] = $cat [ 'cat_name' ];
$struct [ 'categoryName' ] = $cat [ 'cat_name' ];
$struct [ 'htmlUrl' ] = htmlspecialchars ( get_category_link ( false , $cat [ 'cat_ID' ], $cat [ 'cat_name' ]));
$struct [ 'rssUrl' ] = htmlspecialchars ( get_category_rss_link ( false , $cat [ 'cat_ID' ], $cat [ 'cat_name' ]));
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$categories_struct [] = $struct ;
}
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
return $categories_struct ;
2004-08-26 15:42:43 +00:00
}
2004-08-27 08:46:24 +00:00
2004-09-17 20:53:18 +00:00
/* metaweblog.newMediaObject uploads a file, following your settings */
function mw_newMediaObject ( $args ) {
// adapted from a patch by Johann Richard
// http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/
$blog_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
$data = $args [ 3 ];
$name = $data [ 'name' ];
$type = $data [ 'type' ];
$bits = $data [ 'bits' ];
$file_realpath = get_settings ( 'fileupload_realpath' );
$file_url = get_settings ( 'fileupload_url' );
logIO ( 'O' , '(MW) Received ' . strlen ( $bits ) . ' bytes' );
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
$user_data = get_userdatabylogin ( $user_login );
if ( ! get_settings ( 'use_fileupload' )) {
// Uploads not allowed
logIO ( 'O' , '(MW) Uploads not allowed' );
$this -> error = new IXR_Error ( 405 , 'No uploads allowed for this site.' );
return $this -> error ;
}
if ( get_settings ( 'fileupload_minlevel' ) > $user_data -> user_level ) {
// User has not enough privileges
logIO ( 'O' , '(MW) Not enough privilege: user level too low' );
$this -> error = new IXR_Error ( 401 , 'You are not allowed to upload files to this site.' );
return $this -> error ;
}
if ( trim ( $file_realpath ) == '' || trim ( $file_url ) == '' ) {
// WordPress is not correctly configured
logIO ( 'O' , '(MW) Bad configuration. Real/URL path not defined' );
$this -> error = new IXR_Error ( 500 , 'Please configure WordPress with valid paths for file upload.' );
return $this -> error ;
}
$prefix = '/' ;
if ( ! empty ( $name )) {
// Create the path
$localpath = $file_realpath . $prefix . $name ;
$url = $file_url . $prefix . $name ;
if ( mkdir_p ( dirname ( $localpath ))) {
/* encode & write data (binary) */
$ifp = fopen ( $localpath , 'wb' );
$success = fwrite ( $ifp , $bits );
fclose ( $ifp );
@ chmod ( $localpath , 0666 );
if ( $success ) {
$resp = array ( 'url' => $url );
return $resp ;
} else {
logIO ( 'O' , '(MW) Could not write file ' . $name . ' to ' . $localpath );
return new IXR_Error ( 500 , 'Could not write file ' . $name );
}
} else {
return new IXR_Error ( 500 , 'Could not create directories for ' . $name );
}
}
2004-08-27 08:46:24 +00:00
}
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
/* MovableType API functions
* specs on http :// www . movabletype . org / docs / mtmanual_programmatic . html
*/
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
/* mt.getRecentPostTitles ...returns recent posts' titles */
function mt_getRecentPostTitles ( $args ) {
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
$blog_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
$num_posts = $args [ 3 ];
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
$posts_list = wp_get_recent_posts ( $num_posts );
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $posts_list ) {
$this -> error = new IXR_Error ( 500 , 'Either there are no posts, or something went wrong.' );
return $this -> error ;
}
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
foreach ( $posts_list as $entry ) {
$post_date = mysql2date ( 'Ymd\TH:i:s' , $entry [ 'post_date' ]);
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
$struct [] = array (
'dateCreated' => new IXR_Date ( $post_date ),
'userid' => $entry [ 'post_author' ],
'postid' => $entry [ 'ID' ],
'title' => $entry [ 'post_title' ],
);
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
}
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
$recent_posts = array ();
for ( $j = 0 ; $j < count ( $struct ); $j ++ ) {
array_push ( $recent_posts , $struct [ $j ]);
}
return $recent_posts ;
2004-09-14 16:52:13 +00:00
}
2004-09-17 20:53:18 +00:00
/* mt.getCategoryList ...returns the list of categories on a given weblog */
function mt_getCategoryList ( $args ) {
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
$blog_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
$categories_struct = array ();
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
// FIXME: can we avoid using direct SQL there?
if ( $cats = $wpdb -> get_results ( " SELECT cat_ID, cat_name FROM $wpdb->categories " , ARRAY_A )) {
foreach ( $cats as $cat ) {
$struct [ 'categoryId' ] = $cat [ 'cat_ID' ];
$struct [ 'categoryName' ] = $cat [ 'cat_name' ];
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
$categories_struct [] = $struct ;
}
}
2004-09-14 16:52:13 +00:00
2004-09-17 20:53:18 +00:00
return $categories_struct ;
2004-09-14 16:52:13 +00:00
}
2004-09-16 13:26:06 +00:00
2004-09-17 20:53:18 +00:00
/* mt.getPostCategories ...returns a post's categories */
function mt_getPostCategories ( $args ) {
$post_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
$categories = array ();
$catids = wp_get_post_cats ( '' , intval ( $post_ID ));
// first listed category will be the primary category
$isPrimary = true ;
foreach ( $catids as $catid ) {
$categories [] = array (
'categoryName' => get_cat_name ( $catid ),
'categoryId' => $catid ,
'isPrimary' => $isPrimary
);
$isPrimary = false ;
}
return $categories ;
2004-09-16 14:54:25 +00:00
}
2004-09-17 20:53:18 +00:00
/* mt.setPostCategories ...sets a post's categories */
function mt_setPostCategories ( $args ) {
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
$categories = $args [ 3 ];
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
if ( ! user_can_edit_post ( $user_data -> ID , $post_ID )) {
return new IXR_Error ( 401 , 'Sorry, you can not edit this post.' );
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
foreach ( $categories as $cat ) {
$catids [] = $cat [ 'categoryId' ];
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
wp_set_post_cats ( '' , $post_ID , $catids );
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
return true ;
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* mt.supportedMethods ...returns an array of methods supported by this server */
function mt_supportedMethods ( $args ) {
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$supported_methods = array ();
foreach ( $this -> methods as $key => $value ) {
$supported_methods [] = $key ;
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
return $supported_methods ;
2004-09-16 14:54:25 +00:00
}
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
/* mt . supportedTextFilters ... returns an empty array because we don ' t
support per - post text filters yet */
function mt_supportedTextFilters ( $args ) {
return array ();
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
/* mt.getTrackbackPings ...returns trackbacks sent to a given post */
function mt_getTrackbackPings ( $args ) {
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
global $wpdb ;
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = intval ( $args );
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$actual_post = wp_get_single_post ( $post_ID , ARRAY_A );
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $actual_post ) {
return new IXR_Error ( 404 , 'Sorry, no such post.' );
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$comments = $wpdb -> get_results ( " SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = $post_ID " );
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $comments ) {
return array ();
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$trackback_pings = array ();
foreach ( $comments as $comment ) {
if (( strpos ( $comment -> comment_content , '<trackback />' ) === 0 )
|| ( 'trackback' == $comment -> comment_type )) {
// FIXME: would be nicer to have a comment_title field?
// FIXME: assumption: here we make the assumption that trackback
// titles are stored as <strong>title</strong>
$content = str_replace ( '<trackback />' , '' , $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 14:54:25 +00:00
}
2004-09-17 20:53:18 +00:00
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
return $trackback_pings ;
2004-09-16 14:54:25 +00:00
}
2004-09-17 20:53:18 +00:00
/* mt.publishPost ...sets a post's publish status to 'publish' */
function mt_publishPost ( $args ) {
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$post_ID = $args [ 0 ];
$user_login = $args [ 1 ];
$user_pass = $args [ 2 ];
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
if ( ! $this -> login_pass_ok ( $user_login , $user_pass )) {
return $this -> error ;
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$user_data = get_userdatabylogin ( $user_login );
if ( ! user_can_edit_post ( $user_data -> ID , $post_ID )) {
return new IXR_Error ( 401 , 'Sorry, you can not edit this post.' );
}
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$postdata = wp_get_single_post ( $post_ID , ARRAY_A );
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$postdata [ 'post_status' ] = 'publish' ;
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
// retain old cats
$cats = wp_get_post_cats ( '' , $post_ID );
$postdata [ 'post_category' ] = $cats ;
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
$result = wp_update_post ( $postdata );
2004-09-16 14:54:25 +00:00
2004-09-17 20:53:18 +00:00
return $result ;
}
2004-09-16 14:54:25 +00:00
2004-09-16 13:26:06 +00:00
2004-09-17 20:53:18 +00:00
/* PingBack functions
* specs on www . hixie . ch / specs / pingback / pingback
*/
2004-09-16 13:26:06 +00:00
2004-09-17 20:53:18 +00:00
/* pingback.ping gets a pingback and registers it */
function pingback_ping ( $args ) {
// original code by Mort (http://mort.mine.nu:8080 -- site seems dead)
// refactored to return error codes and avoid deep ifififif headaches
global $wpdb , $wp_version ;
2004-09-16 13:26:06 +00:00
2004-09-17 20:53:18 +00:00
$pagelinkedfrom = $args [ 0 ];
$pagelinkedto = $args [ 1 ];
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$title = '' ;
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$pagelinkedfrom = str_replace ( '&' , '&' , $pagelinkedfrom );
$pagelinkedto = preg_replace ( '#&([^amp\;])#is' , '&$1' , $pagelinkedto );
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
$error_code = - 1 ;
2004-09-17 20:48:43 +00:00
2004-09-17 20:53:18 +00:00
// Check if the page linked to is in our site
$pos1 = strpos ( $pagelinkedto , str_replace ( 'http://' , '' , str_replace ( 'www.' , '' , get_settings ( 'home' ))));
if ( ! $pos1 ) {
return new IXR_Error ( 0 , '' );
}
2004-09-16 13:26:06 +00:00
// let's find which post is linked to
2004-09-17 20:53:18 +00: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 13:26:06 +00:00
$urltest = parse_url ( $pagelinkedto );
if ( $post_ID = url_to_postid ( $pagelinkedto )) {
$way = 'url_to_postid()' ;
2004-09-17 20:53:18 +00:00
} elseif ( preg_match ( '#p/[0-9]{1,}#' , $urltest [ 'path' ], $match )) {
2004-09-16 13:26:06 +00:00
// the path defines the post_ID (archives/p/XXXX)
$blah = explode ( '/' , $match [ 0 ]);
$post_ID = $blah [ 1 ];
$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 ]);
$post_ID = $blah [ 1 ];
$way = 'from the querystring' ;
} elseif ( isset ( $urltest [ 'fragment' ])) {
// an #anchor is there, it's either...
if ( intval ( $urltest [ 'fragment' ])) {
// ...an integer #XXXX (simpliest case)
$post_ID = $urltest [ 'fragment' ];
$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
$title = preg_replace ( '/[^a-zA-Z0-9]/' , '.' , $urltest [ 'fragment' ]);
$sql = " SELECT ID FROM $wpdb->posts WHERE post_title RLIKE ' $title ' " ;
2004-09-17 20:53:18 +00: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 13:26:06 +00:00
$way = 'from the fragment (title)' ;
}
} else {
// TODO: Attempt to extract a post ID from the given URL
2004-09-17 20:53:18 +00:00
return new IXR_Error ( 33 , 'The specified target URI cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.' );
2004-09-16 13:26:06 +00:00
}
2004-09-17 20:53:18 +00:00
logIO ( " O " , " (PB) URI=' $pagelinkedto ' ID=' $post_ID ' Found=' $way ' " );
2004-09-16 13:26:06 +00:00
2004-09-17 20:48:43 +00:00
$sql = 'SELECT post_author FROM ' . $wpdb -> posts . ' WHERE ID = ' . $post_ID ;
2004-09-16 13:26:06 +00:00
$result = $wpdb -> get_results ( $sql );
2004-09-17 20:53:18 +00:00
if ( ! $wpdb -> num_rows ) {
// Post_ID not found
return new IXR_Error ( 33 , 'The specified target URI cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.' );
}
// Let's check that the remote site didn't already pingback this entry
$sql = 'SELECT * FROM ' . $wpdb -> comments . '
WHERE comment_post_ID = '.$post_ID.'
AND comment_author_url = \ '' . $pagelinkedfrom . ' \ '
AND comment_type = \ 'pingback\'' ;
$result = $wpdb -> get_results ( $sql );
//return($sql);
2004-09-16 13:26:06 +00:00
if ( $wpdb -> num_rows ) {
2004-09-17 20:53:18 +00:00
// We already have a Pingback from this URL
return new IXR_Error ( 48 , 'The pingback has already been registered.' );
}
2004-09-16 13:26:06 +00:00
2004-09-17 20:53:18 +00:00
// very stupid, but gives time to the 'from' server to publish !
sleep ( 1 );
2004-09-16 13:26:06 +00:00
2004-09-17 20:53:18 +00:00
// Let's check the remote site
$fp = @ fopen ( $pagelinkedfrom , 'r' );
if ( ! $fp ) {
// The source URI does not exist
return new IXR_Error ( 16 , 'The source URI does not exist.' );
}
2004-09-16 15:20:39 +00:00
2004-09-17 20:53:18 +00:00
$puntero = 4096 ;
while ( $remote_read = fread ( $fp , $puntero )) {
$linea .= $remote_read ;
}
2004-09-16 15:20:39 +00:00
2004-09-17 20:53:18 +00:00
// Work around bug in strip_tags():
$linea = str_replace ( '<!DOCTYPE' , '<DOCTYPE' , $linea );
$linea = strip_tags ( $linea , '<title><a>' );
$linea = strip_all_but_one_link ( $linea , $pagelinkedto );
// I don't think we need this? -- emc3
//$linea = preg_replace('#&([^amp\;])#is', '&$1', $linea);
if ( empty ( $matchtitle )) {
preg_match ( '|<title>([^<]*?)</title>|is' , $linea , $matchtitle );
}
$pos2 = strpos ( $linea , $pagelinkedto );
$pos3 = strpos ( $linea , str_replace ( 'http://www.' , 'http://' , $pagelinkedto ));
if ( is_integer ( $pos2 ) || is_integer ( $pos3 )) {
// The page really links to us :)
$pos4 = ( is_integer ( $pos2 )) ? $pos2 : $pos3 ;
$start = $pos4 - 100 ;
$context = substr ( $linea , $start , 250 );
$context = str_replace ( " \n " , ' ' , $context );
$context = str_replace ( '&' , '&' , $context );
}
fclose ( $fp );
if ( empty ( $context )) {
// URL pattern not found
return new IXR_Error ( 17 , 'The source URI does not contain a link to the target URI, and so cannot be used as a source.' );
}
// Check if pings are on, inelegant exit
$pingstatus = $wpdb -> get_var ( " SELECT ping_status FROM $wpdb->posts WHERE ID = $post_ID " );
if ( 'closed' == $pingstatus ) {
return new IXR_Error ( 33 , 'The specified target URI cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.' );
}
$pagelinkedfrom = preg_replace ( '#&([^amp\;])#is' , '&$1' , $pagelinkedfrom );
$title = ( ! strlen ( $matchtitle [ 1 ])) ? $pagelinkedfrom : $matchtitle [ 1 ];
$original_context = strip_tags ( $context );
$context = '[...] ' ;
$context = htmlspecialchars ( $original_context );
$context .= ' [...]' ;
$original_pagelinkedfrom = $pagelinkedfrom ;
$pagelinkedfrom = addslashes ( $pagelinkedfrom );
$original_title = $title ;
$title = addslashes ( strip_tags ( trim ( $title )));
$user_ip = $_SERVER [ 'REMOTE_ADDR' ];
$user_agent = addslashes ( $_SERVER [ 'HTTP_USER_AGENT' ]);
$now = current_time ( 'mysql' );
$now_gmt = current_time ( 'mysql' , 1 );
// Check if the entry allows pings
if ( ! check_comment ( $title , '' , $pagelinkedfrom , $context , $user_ip , $user_agent ) ) {
return new IXR_Error ( 49 , 'Pingbacks not allowed on this entry.' );
}
$consulta = $wpdb -> query ( " INSERT INTO $wpdb->comments
( comment_post_ID , comment_author , comment_author_url , comment_author_IP , comment_date , comment_date_gmt , comment_content , comment_approved , comment_agent , comment_type )
VALUES
( $post_ID , '$title' , '$pagelinkedfrom' , '$user_ip' , '$now' , '$now_gmt' , '$context' , '1' , '$user_agent' , 'pingback' )
" );
$comment_ID = $wpdb -> get_var ( 'SELECT last_insert_id()' );
if ( get_settings ( 'comments_notify' )) {
wp_notify_postauthor ( $comment_ID , 'pingback' );
}
do_action ( 'pingback_post' , $comment_ID );
return " Pingback from $pagelinkedfrom to $pagelinkedto registered. Keep the web talking! :-) " ;
}
/* pingback . extensions . getPingbacks returns an array of URLs
that pingbacked the given URL
specs on http :// www . aquarionics . com / misc / archives / blogite / 0198. html */
function pingback_extensions_getPingbacks ( $args ) {
global $wpdb ;
$url = $args ;
$post_ID = url_to_postid ( $url );
if ( ! $post_ID ) {
// We aren't sure that the resource is available and/or pingback enabled
return new IXR_Error ( 33 , 'The specified target URI cannot be used as a target. It either doesn\'t exist, or it is not a pingback-enabled resource.' );
}
$actual_post = wp_get_single_post ( $post_ID , ARRAY_A );
if ( ! $actual_post ) {
// No such post = resource not found
return new IXR_Error ( 32 , 'The specified target URI does not exist.' );
}
$comments = $wpdb -> get_results ( " SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = $post_ID " );
if ( ! $comments ) {
return array ();
}
$pingbacks = array ();
foreach ( $comments as $comment ) {
if (( strpos ( $comment -> comment_content , '<pingback />' ) === 0 )
|| ( 'pingback' == $comment -> comment_type )) {
$pingbacks [] = $comment -> comment_author_url ;
2004-09-16 15:20:39 +00:00
}
}
2004-09-17 20:53:18 +00:00
return $pingbacks ;
2004-09-16 15:20:39 +00:00
}
2004-05-23 16:42:23 +00:00
}
2004-05-23 04:02:53 +00:00
2004-09-17 20:53:18 +00:00
$wp_xmlrpc_server = new wp_xmlrpc_server ();
?>