Slide 1

Slide 1 text

Integrating with WordPress via XML-RPC Max Cutler WordCamp NYC 2012

Slide 2

Slide 2 text

Who am I? • http://maxcutler.com • @maxcutler • Student • WordPress for Windows Phone • Core Contributor for XML-RPC in 3.4

Slide 3

Slide 3 text

Motivation What is XML-RPC? WordPress & XML-RPC Examples Tips for plugin and theme authors What’s next?

Slide 4

Slide 4 text

Motivation What is XML-RPC? WordPress & XML-RPC Examples Tips for plugin and theme authors What’s next?

Slide 5

Slide 5 text

Cross-system interoperability

Slide 6

Slide 6 text

Escape the data silo

Slide 7

Slide 7 text

Motivation What is XML-RPC? WordPress & XML-RPC Examples Tips for plugin and theme authors What’s next?

Slide 8

Slide 8 text

“Simple cross-platform distributed computing, based on the standards of the Internet.” xmlrpc.com

Slide 9

Slide 9 text

RPC using XML serialization

Slide 10

Slide 10 text

Sample Exchange - Request POST /xmlrpc.php HTTP/1.0 User-Agent: Max’s API Client Host: maxcutler.com Content-Type: text/xml wp.getUsersBlogs maxcutler L1nk3d1nr0ck$

Slide 11

Slide 11 text

Sample Exchange - Response HTTP/1.0 200 OK Content-Type: text/xml isAdmin 1 url http://www.maxcutler.com/ blogid 1 blogName Max Cutler xmlrpc http://www.maxcutler.com/xmlrpc.php

Slide 12

Slide 12 text

Libraries for every language • PHP/WordPress – IXR • Python – xmlrpclib • Ruby – XMLRPC::Client • Perl – RPC::XML • C# - XML-RPC.NET • Java – ws-xmlrpc • JavaScript – Mimic, node-xmlrpc • And many more…

Slide 13

Slide 13 text

Motivation What is XML-RPC? WordPress & XML-RPC Examples Tips for plugin and theme authors What’s next?

Slide 14

Slide 14 text

xmlrpc.php • WordPress.com • Off-by-default on WordPress.org • wp-includes/class- wp-xmlrpc-server.php

Slide 15

Slide 15 text

History • r1348 (May 2004) – xmlrpc.php born • 1.5 – Blogger, MovableType, metaWeblog, and pingback APIs • 2.2 - Pages • 2.5 – Categories, Custom Fields • 2.6 – Options/Settings • 2.7 – Comments • 3.1 – Media Library (read or upload)

Slide 16

Slide 16 text

History – 3.3 blogger.getUsersBlogs blogger.getUserInfo blogger.getPost blogger.getRecentPosts blogger.newPost blogger.editPost blogger.deletePost metaWeblog.newPost metaWeblog.editPost metaWeblog.deletePost metaWeblog.getPost metaWeblog.getRecentPosts metaWeblog.getCategories metaWeblog.newMediaObject metaWeblog.getUsersBlogs pingback.ping pingback.extensions mt.getCategoryList mt.getRecentPostTitles mt.getPostCategories mt.setPostCategories mt.publishPost mt.getTrackbackPings wp.getUsersBlogs wp.getAuthors wp.getPage wp.getPages wp.newPage wp.editPage wp.deletePage wp.getPageList wp.getPageTemplates wp.getPageStatusList wp.getCategories wp.getTags wp.newCategory wp.deleteCategory wp.suggestCategories wp.getCommentCount wp.getComment wp.getComments wp.newComment wp.getCommentStatusList wp.getOptions wp.setOptions wp.uploadFile wp.getMediaItem wp.getMediaLibrary wp.getPostFormats wp.getPostStatusList demo.sayHello demo.addTwoNumbers system.listMethods

Slide 17

Slide 17 text

Can we clean this up? • Limited or no support for 3.x core features • Widespread inconsistency of parameters and return values • Abuse of legacy method fields postid title description dateCreated date_created_gmt permaLink link title description mt_excerpt mt_text_more wp_more_text mt_allow_comments mt_allow_pings mt_keywords categories wp_slug wp_password userid wp_author_id wp_author_display_name post_status custom_fields wp_post_format sticky enclosure

Slide 18

Slide 18 text

Today – 3.4 • Unified post types • Unified taxonomies • More useful media • Actions & filters • Bug-fixes • Unit tests (!!!) http://codex.wordpress.org/XML-RPC_WordPress_API wp.getPost wp.getPosts wp.newPost wp.editPost wp.deletePost wp.getPostType wp.getPostTypes wp.getPostFormats wp.getPostStatusList wp.getTaxonomy wp.getTaxonomies wp.getTerm wp.getTerms wp.newTerm wp.editTerm wp.deleteTerm wp.getMediaItem wp.getMediaLibrary wp.uploadFile wp.getCommentCount wp.getComment wp.getComments wp.newComment wp.editComment wp.deleteComment wp.getCommentStatusList wp.getOptions wp.setOptions wp.getUsersBlogs wp.getAuthors

Slide 19

Slide 19 text

Method analogies WordPress Core API XML-RPC Method get_posts wp.getPost, wp.getPosts wp_insert_post wp.newPost, wp.editPost get_taxonomy wp.getTaxonomy, wp.getTaxonomies get_terms wp.getTerm, wp.getTerms wp_insert_term wp.newTerm wp_update_term wp.editTerm get_post_types wp.getPostType, wp.getPostTypes get_comments wp.getComment, wp.getComments

Slide 20

Slide 20 text

Motivation What is XML-RPC? WordPress & XML-RPC Examples Tips for plugin and theme authors What’s next?

Slide 21

Slide 21 text

Clients • Language • Standard Library • 3rd-party libraries & wrappers – PHP: IXR_Client (ships with WordPress) – Python: python-wordpress-xmlrpc – Node.js: node-wordpress – C#/.NET: JoeBlogs

Slide 22

Slide 22 text

Post Querying • wp.getPosts – Filter • post_type, number, offset, order, orderby – Fields • Meta-fields: post, taxonomies, custom_fields • Individual fields – post_id, post_title, post_date, post_date_gmt, post_modified, post_modified_gmt, post_status, post_type, post_name, post_author, post_password, post_excerpt, post_content, link, comment_status, ping_status, sticky, post_format, terms, custom_fields, enclosure

Slide 23

Slide 23 text

Post Querying wp.getPosts( 0, username, password, array( ‘post_type’ => ‘product’, ‘orderby’ => ‘title’, ‘order’ => ‘ASC’ ), array( ‘post_title’, ‘date_modified_gmt’, ‘link’ ) )

Slide 24

Slide 24 text

Post Creation wp.newPost( 0, username, password, array( ‘post_title’ => ‘Hello world’, ‘post_content’ => …, ‘terms_names’ => array( ‘post_tag’ => array( ‘day1’ ), ‘category’ => array( ‘introductions’ ) ) ) )

Slide 25

Slide 25 text

Post Creation (2) wp.newPost( 0, username, password, array( ‘post_type’ => ‘product’, ‘post_title’ => ‘ACME’, ‘post_content’ => …, ‘custom_fields’ => array( array( ‘key’ => ‘price’, ‘value’ => 15 ) ) ) )

Slide 26

Slide 26 text

Real world examples

Slide 27

Slide 27 text

Mobile Apps http://wordpress.org/extend/mobile/

Slide 28

Slide 28 text

Offline Writing Applications Windows Live Writer, MarsEdit, ecto, etc.

Slide 29

Slide 29 text

Jetpack

Slide 30

Slide 30 text

Chicago Tribune News Apps Varnish Caching Unit Tests http://blog.apps.chicagotribune.com/2011/06/28/dont-break-the-homepage-using-unit-tests- to-validate-your-wordpress-varnish-caching-strategy/

Slide 31

Slide 31 text

Generate WordPress site using build tools https://github.com/scottgonzalez/grunt-wordpress github.com/jquery/api.jquery.com (XML files in git repo) grunt-wordpress (XML-RPC bridge) api.jquery.com (WordPress site)

Slide 32

Slide 32 text

External Search Django + Haystack + Solr

Slide 33

Slide 33 text

Camayak Editorial content production with multiple-site remote publishing Camayak WordPress InDesign NITF Drupal

Slide 34

Slide 34 text

Motivation What is XML-RPC? WordPress & XML-RPC Examples Tips for plugin and theme authors What’s next?

Slide 35

Slide 35 text

http://codex.wordpress.org/ XML-RPC_Support http://codex.wordpress.org/ XML-RPC_Extending

Slide 36

Slide 36 text

Add/remove methods xmlrpc_methods filter function mynamespace_subtractTwoNumbers( $args ) { $number1 = (int) $args[0]; $number2 = (int) $args[1]; return $number1 - $number2; } function mynamespace_new_xmlrpc_methods( $methods ) { $methods['mynamespace.subtractTwoNumbers'] = 'mynamespace_subtractTwoNumbers'; return $methods; } add_filter( 'xmlrpc_methods', mynamespace_new_xmlrpc_methods');

Slide 37

Slide 37 text

Adjust return values • xmlrpc_default_*_fields – post, posttype, taxonomy • xmlrpc_prepare_* – post, post_type, taxonomy, term, media_item, comment, page • xmlrpc_blog_options • wp_handle_upload • Use the source, Luke!

Slide 38

Slide 38 text

PSA: Omit Trailing “?>”

Slide 39

Slide 39 text

Motivation What is XML-RPC? WordPress & XML-RPC Examples Tips for plugin and theme authors What’s next?

Slide 40

Slide 40 text

Using 3.3 or earlier? Shim for 3.4 additions in my plugin: http://wordpress.org/extend/plugins /xml-rpc-modernization/

Slide 41

Slide 41 text

WordPress 3.5? User management Even more media enhancements Improved custom fields JSON Serialization

Slide 42

Slide 42 text

REST API v1 on http://developer.wordpress.com v2 in core? TBD

Slide 43

Slide 43 text

http://codex.wordpress.org/ XML-RPC_Support

Slide 44

Slide 44 text

Thanks! Q&A