Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intergrating with WordPress via XML-RPC

Intergrating with WordPress via XML-RPC

Talk at WordCamp NYC, June 9, 2012

Max Cutler

June 09, 2012
Tweet

More Decks by Max Cutler

Other Decks in Programming

Transcript

  1. Who am I? • http://maxcutler.com • @maxcutler • Student •

    WordPress for Windows Phone • Core Contributor for XML-RPC in 3.4
  2. Sample Exchange - Request POST /xmlrpc.php HTTP/1.0 User-Agent: Max’s API

    Client Host: maxcutler.com Content-Type: text/xml <?xml version="1.0"?> <methodCall> <methodName>wp.getUsersBlogs</methodName> <params> <param><value>maxcutler</value></param> <param><value>L1nk3d1nr0ck$</value></param> </params> </methodCall>
  3. Sample Exchange - Response HTTP/1.0 200 OK Content-Type: text/xml <?xml

    version="1.0"?> <methodResponse> <params><param><value><array><data><value><struct> <member><name>isAdmin</name> <value><boolean>1</boolean></value></member> <member><name>url</name> <value>http://www.maxcutler.com/</value></member> <member><name>blogid</name> <value>1</value></member> <member><name>blogName</name> <value>Max Cutler</value></member> <member><name>xmlrpc</name> <value>http://www.maxcutler.com/xmlrpc.php</value></member> </struct></value></data></array></value></param></params> </methodResponse>
  4. 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…
  5. 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)
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. Post Querying wp.getPosts( 0, username, password, array( ‘post_type’ => ‘product’,

    ‘orderby’ => ‘title’, ‘order’ => ‘ASC’ ), array( ‘post_title’, ‘date_modified_gmt’, ‘link’ ) )
  13. Post Creation wp.newPost( 0, username, password, array( ‘post_title’ => ‘Hello

    world’, ‘post_content’ => …, ‘terms_names’ => array( ‘post_tag’ => array( ‘day1’ ), ‘category’ => array( ‘introductions’ ) ) ) )
  14. 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 ) ) ) )
  15. 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');
  16. 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!
  17. Using 3.3 or earlier? Shim for 3.4 additions in my

    plugin: http://wordpress.org/extend/plugins /xml-rpc-modernization/