Creating native apps
  with WordPress
             Marko Heijnen
 January 14, 2012 at WordCamp Norway
Marko Heijnen
Freelance developer
Mobile / WordPress


http://markoheijnen.com
info@markoheijnen.com
@markoheijnen
History
2006: Started with WordPress
2009: Started with iOS development
2010: First patch to WordPress ( 3.0 )
2011: Combined iOS development with WordPress
2012: First WordCamp presentation
Lets talk mobile
Mobile is the growing
There is a change you
 get involved with it
Native app vs
Web app/site
Native vs mobile
Build a native app when:
   People are going to use it quite often ( daily basis )
   Features that aren’t possible for web ( yet )
   A lot of users request for it ( 10.000 > )
   Customers really want an app
We need
a native app
What does it mean for you
You need to communicate with another developer
Need to build an API that the developer can use
So you need to understand what a mobile developer wants
Need to build additional fields in WordPress for information
that the mobile app can use
The API
API of the app
WordPress for iOS uses XML-RPC
WordPress support it by default
Supports: Blogger API, metaWeblog API, and the Movable
Type API
Where can you find it
/xmlrpc.php
   handles the request
/wp-includes/class-wp-xmlrpc.server.php
   Registers all the default methods
Methods for testing
/**                                                  /**
  * Test XMLRPC API by saying, "Hello!" to client.     * Test XMLRPC API by adding two numbers for client.
  *                                                    *
  * @since 1.5.0                                       * @since 1.5.0
  *                                                    *
  * @param array $args Method Parameters.              * @param array $args Method Parameters.
  * @return string                                     * @return int
  */                                                   */
function sayHello($args) {                           function addTwoNumbers($args) {
	       return 'Hello!';                             	       $number1 = $args[0];
}                                                    	       $number2 = $args[1];
                                                     	       return $number1 + $number2;
                                                     }
How to get recent post
function mw_getRecentPosts($args) {

	      $this->escape($args);

	      $blog_ID = (int) $args[0];
	      $username = $args[1];
	      $password = $args[2];
	      if ( isset( $args[3] ) )
	      	        $query = array( 'numberposts' => absint( $args[3] ) );
	      else
	      	        $query = array();

	      if ( !$user = $this->login($username, $password) )
	      	       return $this->error;

	      do_action('xmlrpc_call', 'metaWeblog.getRecentPosts');
How you can use it in your own way
Create your own methods
add_filter( 'xmlrpc_methods', 'add_own_methods' );

function add_own_methods( $methods ) {
           $methods['own.my_method'] = 'own_my_method';

         return $methods
}

function own_my_method( $args ) {
          return $some_data
}
How does it look like
Request
<?xml version="1.0"?>
<methodCall>
<methodName>metaWeblog.getRecentPosts</methodName>
<params>
<param><value><string></string></value></param>
<param><value><string>username</string></value></param>
<param><value><string>password</string></value></param>
</params></methodCall>
Response
<?xml version="1.0"?>
<methodResponse>
  <params>
   <param>
     <value>
     <array><data>
  <value><struct>
  <member><name>dateCreated</name><value><dateTime.iso8601>20110904T18:15:26</dateTime.iso8601></value></member>
  <member><name>userid</name><value><string>1</string></value></member>
  <member><name>postid</name><value><string>1</string></value></member>
  <member><name>description</name><value><string>Welcome to &lt;a href=&quot;http://network.nginx.markoheijnen.com/&quot;&gt;WordPress Network Sites&lt;/a&gt;. This is your first post. Edit or delete it, then start blogging!</
string></value></member>
  <member><name>title</name><value><string>Hello world!</string></value></member>
  <member><name>link</name><value><string>http://test.network.nginx.markoheijnen.com/2011/09/04/hello-world/</string></value></member>
  <member><name>permaLink</name><value><string>http://test.network.nginx.markoheijnen.com/2011/09/04/hello-world/</string></value></member>
  <member><name>categories</name><value><array><data>
  <value><string>Uncategorized</string></value>
</data></array></value></member>
  <member><name>mt_excerpt</name><value><string></string></value></member>
  <member><name>mt_text_more</name><value><string></string></value></member>
  <member><name>mt_allow_comments</name><value><int>1</int></value></member>
  <member><name>mt_allow_pings</name><value><int>1</int></value></member>
  <member><name>mt_keywords</name><value><string></string></value></member>
  <member><name>wp_slug</name><value><string>hello-world</string></value></member>
  <member><name>wp_password</name><value><string></string></value></member>
  <member><name>wp_author_id</name><value><string>1</string></value></member>
  <member><name>wp_author_display_name</name><value><string>marko</string></value></member>
  <member><name>date_created_gmt</name><value><dateTime.iso8601>20110904T18:15:26</dateTime.iso8601></value></member>
  <member><name>post_status</name><value><string>publish</string></value></member>
  <member><name>custom_fields</name><value><array><data>
</data></array></value></member>
  <member><name>wp_post_format</name><value><string>standard</string></value></member>
</struct></value>
</data></array>
     </value>
   </param>
  </params>
</methodResponse>
XML-RPC
Critics of XML-RPC argue that RPC calls can be made with
plain XML
XML-RPC uses about 4 times the number of bytes compared
to plain XML
Need a lot of code on the app side
In the end the size of requests/responses do mather
Is this the best way or
are there alternatives?
Alternatives
Just XML instead of XML-RPC
Use JSON
What is JSON
JavaScript Object Notation
Use JSON as alternative to XML
It is derived from the JavaScript scripting language
Lightweight text-based open standard
Why JSON
Lighter and faster than XML
JSON objects are typed
   Array, object, string, number, boolean and null
Great libraries for mobile platforms
   iOS 5 does have native support for JSON
Easy to parse on mobile platforms
JSON Example
{
        "firstName"    :   "Marko",
        "lastName"     :   "Heijnen",
        "age"          :   25,
        "address"      :   null,
        "newsletter" :     false,
        "phoneNumber" :
        [
            {
               "type" :    "home",
               "number":   "212 555-1234"
            },
            {
               "type" :    "fax",
               "number":   "646 555-4567"
            }
        ]
    }
WordPress doesn’t have
 native support (yet)
Plugins you can use
JSON RPC - http://wordpress.org/extend/plugins/wp-json-
rpc-api/
JSON API - http://wordpress.org/extend/plugins/json-api/
WP RESTful - http://wordpress.org/extend/plugins/wp-
restful/


Be aware that these plugins aren’t up to date
What do I use
JSON API
Great to use because of the use of hooks
Good information on the plugin page
Simple backend interface


I use a modified version of it
   Added consumer key/secret
Interface
How to implement
function add_hello_controller( $controllers ) {
           $controllers[] = 'hello';
           return $controllers;
}
add_filter( 'json_api_controllers', 'add_hello_controller' );

function set_hello_controller_path() {
           return "/path/to/theme/hello.php";
}
add_filter( 'json_api_hello_controller_path', 'set_hello_controller_path' );
How to implement
<?php
class JSON_API_Hello_Controller {
          public function hello_world() {
                return array( "message" => "Hello, world" );
          }
}
?>
Important to know
Only return data that is needed
Return as less HTML as possible
Don’t change the feed without notifying the app developer
A call shouldn’t take to long, speed is everything
Cache the data if possible
   Transients: http://codex.wordpress.org/Transients_API
Recap
How to manage
mobile content
Post types
Add separate meta box for mobile content
   Even the ability to overrule the title
Additional user capability, so not everyone can manage it
Maybe even create a special post type for mobile content
Special admin page
Only for mobile configuration
Store settings
Store default pages for mobile like privacy disclaimer
Push notifications
Create ability to send push notifications in a smart way
   Add to posttype
   Make a separate box on dashboard or admin page
You can handle the sending yourself
Or use for example the services of Urban Airship
Last word
WordPress is a CMS
Can be used in a lot of ways
Sometimes look further then the plugin section
Questions
@markoheijnen / info@markoheijnen.com

Creating native apps with WordPress

  • 1.
    Creating native apps with WordPress Marko Heijnen January 14, 2012 at WordCamp Norway
  • 2.
    Marko Heijnen Freelance developer Mobile/ WordPress http://markoheijnen.com info@markoheijnen.com @markoheijnen
  • 3.
    History 2006: Started withWordPress 2009: Started with iOS development 2010: First patch to WordPress ( 3.0 ) 2011: Combined iOS development with WordPress 2012: First WordCamp presentation
  • 4.
  • 5.
  • 6.
    There is achange you get involved with it
  • 7.
  • 8.
    Native vs mobile Builda native app when: People are going to use it quite often ( daily basis ) Features that aren’t possible for web ( yet ) A lot of users request for it ( 10.000 > ) Customers really want an app
  • 9.
  • 10.
    What does itmean for you You need to communicate with another developer Need to build an API that the developer can use So you need to understand what a mobile developer wants Need to build additional fields in WordPress for information that the mobile app can use
  • 11.
  • 13.
    API of theapp WordPress for iOS uses XML-RPC WordPress support it by default Supports: Blogger API, metaWeblog API, and the Movable Type API
  • 14.
    Where can youfind it /xmlrpc.php handles the request /wp-includes/class-wp-xmlrpc.server.php Registers all the default methods
  • 15.
    Methods for testing /** /** * Test XMLRPC API by saying, "Hello!" to client. * Test XMLRPC API by adding two numbers for client. * * * @since 1.5.0 * @since 1.5.0 * * * @param array $args Method Parameters. * @param array $args Method Parameters. * @return string * @return int */ */ function sayHello($args) { function addTwoNumbers($args) { return 'Hello!'; $number1 = $args[0]; } $number2 = $args[1]; return $number1 + $number2; }
  • 16.
    How to getrecent post function mw_getRecentPosts($args) { $this->escape($args); $blog_ID = (int) $args[0]; $username = $args[1]; $password = $args[2]; if ( isset( $args[3] ) ) $query = array( 'numberposts' => absint( $args[3] ) ); else $query = array(); if ( !$user = $this->login($username, $password) ) return $this->error; do_action('xmlrpc_call', 'metaWeblog.getRecentPosts');
  • 17.
    How you canuse it in your own way
  • 18.
    Create your ownmethods add_filter( 'xmlrpc_methods', 'add_own_methods' ); function add_own_methods( $methods ) { $methods['own.my_method'] = 'own_my_method'; return $methods } function own_my_method( $args ) { return $some_data }
  • 19.
    How does itlook like
  • 20.
  • 21.
    Response <?xml version="1.0"?> <methodResponse> <params> <param> <value> <array><data> <value><struct> <member><name>dateCreated</name><value><dateTime.iso8601>20110904T18:15:26</dateTime.iso8601></value></member> <member><name>userid</name><value><string>1</string></value></member> <member><name>postid</name><value><string>1</string></value></member> <member><name>description</name><value><string>Welcome to &lt;a href=&quot;http://network.nginx.markoheijnen.com/&quot;&gt;WordPress Network Sites&lt;/a&gt;. This is your first post. Edit or delete it, then start blogging!</ string></value></member> <member><name>title</name><value><string>Hello world!</string></value></member> <member><name>link</name><value><string>http://test.network.nginx.markoheijnen.com/2011/09/04/hello-world/</string></value></member> <member><name>permaLink</name><value><string>http://test.network.nginx.markoheijnen.com/2011/09/04/hello-world/</string></value></member> <member><name>categories</name><value><array><data> <value><string>Uncategorized</string></value> </data></array></value></member> <member><name>mt_excerpt</name><value><string></string></value></member> <member><name>mt_text_more</name><value><string></string></value></member> <member><name>mt_allow_comments</name><value><int>1</int></value></member> <member><name>mt_allow_pings</name><value><int>1</int></value></member> <member><name>mt_keywords</name><value><string></string></value></member> <member><name>wp_slug</name><value><string>hello-world</string></value></member> <member><name>wp_password</name><value><string></string></value></member> <member><name>wp_author_id</name><value><string>1</string></value></member> <member><name>wp_author_display_name</name><value><string>marko</string></value></member> <member><name>date_created_gmt</name><value><dateTime.iso8601>20110904T18:15:26</dateTime.iso8601></value></member> <member><name>post_status</name><value><string>publish</string></value></member> <member><name>custom_fields</name><value><array><data> </data></array></value></member> <member><name>wp_post_format</name><value><string>standard</string></value></member> </struct></value> </data></array> </value> </param> </params> </methodResponse>
  • 22.
    XML-RPC Critics of XML-RPCargue that RPC calls can be made with plain XML XML-RPC uses about 4 times the number of bytes compared to plain XML Need a lot of code on the app side In the end the size of requests/responses do mather
  • 23.
    Is this thebest way or are there alternatives?
  • 24.
    Alternatives Just XML insteadof XML-RPC Use JSON
  • 25.
    What is JSON JavaScriptObject Notation Use JSON as alternative to XML It is derived from the JavaScript scripting language Lightweight text-based open standard
  • 26.
    Why JSON Lighter andfaster than XML JSON objects are typed Array, object, string, number, boolean and null Great libraries for mobile platforms iOS 5 does have native support for JSON Easy to parse on mobile platforms
  • 27.
    JSON Example { "firstName" : "Marko", "lastName" : "Heijnen", "age" : 25, "address" : null, "newsletter" : false, "phoneNumber" : [ { "type" : "home", "number": "212 555-1234" }, { "type" : "fax", "number": "646 555-4567" } ] }
  • 28.
    WordPress doesn’t have native support (yet)
  • 29.
    Plugins you canuse JSON RPC - http://wordpress.org/extend/plugins/wp-json- rpc-api/ JSON API - http://wordpress.org/extend/plugins/json-api/ WP RESTful - http://wordpress.org/extend/plugins/wp- restful/ Be aware that these plugins aren’t up to date
  • 30.
  • 31.
    JSON API Great touse because of the use of hooks Good information on the plugin page Simple backend interface I use a modified version of it Added consumer key/secret
  • 32.
  • 33.
    How to implement functionadd_hello_controller( $controllers ) { $controllers[] = 'hello'; return $controllers; } add_filter( 'json_api_controllers', 'add_hello_controller' ); function set_hello_controller_path() { return "/path/to/theme/hello.php"; } add_filter( 'json_api_hello_controller_path', 'set_hello_controller_path' );
  • 34.
    How to implement <?php classJSON_API_Hello_Controller { public function hello_world() { return array( "message" => "Hello, world" ); } } ?>
  • 35.
    Important to know Onlyreturn data that is needed Return as less HTML as possible Don’t change the feed without notifying the app developer A call shouldn’t take to long, speed is everything Cache the data if possible Transients: http://codex.wordpress.org/Transients_API
  • 36.
  • 37.
  • 38.
    Post types Add separatemeta box for mobile content Even the ability to overrule the title Additional user capability, so not everyone can manage it Maybe even create a special post type for mobile content
  • 39.
    Special admin page Onlyfor mobile configuration Store settings Store default pages for mobile like privacy disclaimer
  • 40.
    Push notifications Create abilityto send push notifications in a smart way Add to posttype Make a separate box on dashboard or admin page You can handle the sending yourself Or use for example the services of Urban Airship
  • 41.
    Last word WordPress isa CMS Can be used in a lot of ways Sometimes look further then the plugin section
  • 42.