Home | Articles | CV (pdf | short)
<2010-08-04> by Lorenzo

Simple Wordpress API lisp client

I like old things, therefore I started to learn Lisp.

There isn't a better way to learn than by doing, so I tried to implement a client for the wordpress api. the result, even if not complete yet, it's so elegant that I'd like to share it.

(require 's-xml-rpc)

(defpackage :wp 
  (:use :cl :cl-user :s-xml-rpc))

(in-package :wp)

(defparameter +interfaces+ 
  '((get-blogs "wp.getUsersBlogs" username password)
    (get-tags "wp.getTags" blog-id username password)
    (get-comment-count "wp.getCommentCount" blog-id username password post-id)
    (get-post-status-list "wp.getPostStatusList" blog-id username password)
    (get-page-status-list "wp.getPageStatusList" blog-id username password)
    (get-page-templates "wp.getPageTemplates" blog-id username password)
    (get-options "wp.getOptions" blog-id username password)
    (delete-comment "wp.deleteComment" blog-id username password comment-id)
    (get-comment-status-list "wp.getCommentStatusList" blog-id username password)
    (get-page "wp.getPage" blog-id page-id username password)
    (get-pages "wp.getPages" blog-id username password)
    (get-page-list "wp.getPageList" blog-id username password)
    (delete-page "wp.deletePage" blog-id username password page-id)
    (get-authors "wp.getAuthors" blog-id username password)
    (get-categories "wp.getCategories" blog-id username password)
    (delete-category "wp.deleteCategory" blog-id username password category-id)
    (suggest-categories "wp.suggestCategories" blog-id username password category max-results)
    (get-comment "wp.getComment" blog-id username password comment-id))
  "Interface definition to WP services")

(defun defunwp (params) 
  (destructuring-bind (name service &rest rest) params
    (setf (fdefinition name) (compile nil `(lambda (host ,@rest &optional (url "/xmlrpc.php")) 
                                             (block ,name 
                                                    (xml-rpc-call 
                                                      (encode-xml-rpc-call ,service ,@rest)
                                                      :host host
                                                      :url url)))))
    name))

(mapcar #'(lambda (interface) (export (defunwp interface))) +interfaces+)

It uses the s-xml-rpc package and I've tested it with SBCL.

Example usage is as follows:

(wp:get-blogs "username.wordpress.com" "your-username" "your-password") ; returns the list of blogs for the user
(wp:get-pages "username.wordpress.com" your-blog-id "your-username" "your-password") ; returns the list of pages

And so on (see wp::+interfaces+ for function names and required params).

Enjoy!