Extending WordPress XML-RPC Functions

XML-RPC is a great, somewhat little-known feature of WordPress that is perfect for accomplishing many remote tasks with WordPress. I have found it to be a valuable asset during plugin development. While there are numerous function built in to the XML-RPC WordPress library already, we are going to focus solely on extending the XML-RPC library to accomplish almost any remote WordPress tag you wish to. The focus of this article is going to be on using XML-RPC as a communication layer between two WordPress sites on different servers. The two sites could be on the same server, but it is important to know that they do not have to be.

Basic code to extend WordPress XML-RPC

function wp_testXMLRPC() {
$returnme = “XML-RPC is working!”;
return $returnme;
}//end wp_testXMLRPC extended XML-RPC function

function wp_extend_xmlrpc_methods($methods) {
    $methods[‘wp.testXMLRPC’] = ‘wp_testXMLRPC’;
    return $methods;   
}//end wp_extend_xmlrpc_methods
add_filter(‘xmlrpc_methods’, ‘wp_extend_xmlrpc_methods’);

That’s it! Add that code to your plugin file or theme’s functions.php file and you have successfully extended WordPress’ XML-RPC capabilities by adding a test function to test communication between two WordPress websites. Next I’ll show you how to use this code from another WordPress site. We can call the wp_testXMLRPC function from another WordPress website and it will return “XML-RPC is working!” if the XML-RPC functions are currently working on both WordPress sites involved.

Calling an XML-RPC function from another WordPress website

To call our custom extended XML-RPC function above from another WordPress site, we would make a custom page template or plugin file and add the following code where you want to display the results of the test_XMLRPC function:

<?php

$rpcurl = “http://example.com/xmlrpc.php”;//URL of site with custom XML-RPC function
$request = xmlrpc_encode_request(‘wp.testXMLRPC’);//wp_testXMLRPC = wp.testXMLRPC
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);

echo “<p>Results of XML-RPC wp_testXMLRPC function: $results</p>”;//output results

?>

That’s really all there is to it. However this is a simple function. It is also possible to create functions that accept and return parameter data and do complex WordPress actions etc.

How to pass parameters to an extended XML-RPC function and return values

The real power of XML-RPC becomes clear when you add the ability to pass values back and forth from one WordPress website to another! Soon we will examine how to pass a single parameter to an XML-RPC extended function. First, let’s look at how to make the function for WordPress site one:

<?php

function wp_sayHi($arg) {
// Array of WP_User objects.
$yourName = $arg[0];
$returnme = “Hello $yourName!”;
return $returnme;
}//end wp_sayHi extended XML-RPC function

?>

Then we have to add the code to extend the methods:

<php

function wp_extend_xmlrpc_methods($methods) {
    $methods[‘wp.sayHi’] = ‘wp_sayHi’;
    return $methods;   
}//end wp_extend_xmlrpc_methods
add_filter(‘xmlrpc_methods’, ‘wp_extend_xmlrpc_methods’);

?>

The above two sections of code need to get added to your functions.php or plugin file on the first WordPress site, the one you want to retrieve the data from. On the second WordPress site, the one you pass the data from, you would add the following code wherever you wanted to present the results of the XML-RPC function we made:

<?php

$your_name = “Ian Lin”;

$rpcurl = “http://example.com/xmlrpc.php”;
$argparam = array($your_name);
$request = xmlrpc_encode_request(‘wp.sayHi’,$argparam);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);

echo $results;

?>

The above code would print “Hello Ian Lin” to the screen wherever the code was called in a custom page template file or plugin file. Notice how we passed the $your_name vaiable as a parameter for the wp_sayHi function in lines 3 and 4 of the code above. $argparam puts the $your_name variable into a simple array before passing it to the $request made in the next line. Yes, XML-RPC functions accept arrays as parameters. Now let’s look at what to do if you wanted to pass two or more values to an XML-RPC function.

Passing Two or More Values to an extended XML-RPC Function

Here is a valuable nugget I’ll pass on to my readers that allows you to reset a user’s password on WordPress site one from WordPress site two! Yes, it allows you to reset a password from another site. The function takes two parameters to work. It needs the user_login name and the new password. Here’s the code that would go on WordPress site one:

<?php

function wp_syncPasswords($args) {
// Array of WP_User objects.
$userArg = $args[0];//gets user_login value passed in $args
$passArg = $args[1];//gets password from $args
//get user ID by login:
$userget = get_userdatabylogin($userArg);
$usergot = $userget->ID;//gets id of passed user
//update password:
wp_set_password($passArg, $usergot);
$returnme = $usergot.”~”.$userArg.”~”.$passArg;
return $returnme;
}//end wp_syncPasswords extended XML-RPC function

?>

There you have an XML-RPC function that allows you to actually change a user’s password remotely! Pretty neat huh?

Take notice of the $returnme variable in the above wp_syncPasswords function. It returns 3 values in a string separated by a tilde character. You could use any special character to separate the values, but I find the tilde to be safe and reliable, so that’s what I use a lot. I do this because you cannot return an array of values in an XML-RPC response. If I’m wrong, someone please enlighten me, but that’s what I’ve learned from my experience anyway. Then we would simply parse out the values in the response on WordPress site two when we call the function and get $results.

Of course next to have to extend the XML-RPC methods just like we did earlier. Please note that if you already have other XML-RPC functions in your functions.php or plugin file, then you wouldn’t rewrite the entire block of code to add additional functions as methods, you can simply add on to your previous functions. For example, here we’ll add on to our last extended XML-RPC function from above:

<php

function wp_extend_xmlrpc_methods($methods) {
    $methods[‘wp.sayHi’] = ‘wp_sayHi’;

$methods[‘wp.syncPasswords’] = ‘wp_suncPasswords’;
    return $methods;   
}//end wp_extend_xmlrpc_methods
add_filter(‘xmlrpc_methods’, ‘wp_extend_xmlrpc_methods’);

?>

Notice that this time, since we already had the wp_sayHi function extending XML-RPC previously, all we had to do is add the highlighted line to the wp_extend_xmlrpc_methods function above to make our new function valid and ready to call from another website such as WordPress site two.

Calling the wp_syncPasswords Function from a Remote WordPress Site Passing Two Parameters via XML-RPC

<?php

$userlog = “admin”;//set WordPress user name
$new_pass =”YOUR_PASSWORD_HERE”;//set new password
$rpcurl = “http://example.com/xmlrpc.php”;
$argparam = array($userlog,$new_pass);
$request = xmlrpc_encode_request(‘wp.syncPasswords’,$argparam);
$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
curl_setopt($ch, CURLOPT_URL, $rpcurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
$results = curl_exec($ch);
curl_close($ch);
}//end my_profile_update function by Ian L.

?>

Running the code above would change the password of the admin user to YOUR_PASSWORD_HERE, so be sure to change admin to an existing username on WordPress site one and change YOUR_PASSWORD_HERE to the value of the new password you want to set from WordPress site two. This code could go in a WordPress plugin, but probably not appropriate for a page template, however it is possible.

Notice in the above PHP code, how we passed two parameters by setting the value of $argparam to array($userlog, $new_pass). Then we pass $argparam array to WordPress site one in the XML-RPC request in the next line. It’s important to note how we pass one, two, or more parameters to XML-RPC functions. Now you should know how!

Some of you might be saying, “Hey, what about the returned results?” Well, you got me, I left them out to keep the code simple. It will work as it is above, but if you wanted to show the results returned you could do so by parsing the three values from the $results variable using something like this:

<?php

$myArray = explode(“~”, $results);

$remoteUserID = $myArray[0];

$remoteUserLogin = $myArray[1];

$remoteUserPassword = $myArray[2];

echo “<h2>User id: $remoteUserID with user login: $remoteUserLogin has had their password reset to $remoteUserPassword on WordPress site one!</h2>”;

?>

That just about covers everything you need to know about extending the XML-RPC functionality of WordPress. You can do just about anything you want with this tool of you are good with writing custom WordPress code. Happy coding!

Leave a Reply

Your email address will not be published. Required fields are marked *