Date post: | 17-May-2015 |
Category: |
Technology |
Upload: | marko-heijnen |
View: | 6,684 times |
Download: | 0 times |
Marko HeijnenJanuary 14, 2012 at WordCamp Norway
Creating native apps with WordPress
Freelance developer
Mobile / WordPress
http://markoheijnen.com
@markoheijnen
Marko Heijnen
History2006: 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 youget involved with it
Native app vsWeb app/site
Native vs mobileBuild 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 youYou 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 appWordPress 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. * * @since 1.5.0 * * @param array $args Method Parameters. * @return string */function sayHello($args) { return 'Hello!';}
/** * Test XMLRPC API by adding two numbers for client. * * @since 1.5.0 * * @param array $args Method Parameters. * @return int */function addTwoNumbers($args) { $number1 = $args[0]; $number2 = $args[1]; return $number1 + $number2;}
How to get recent postfunction 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 methodsadd_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 <a href="http://network.nginx.markoheijnen.com/">WordPress Network Sites</a>. 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-RPCCritics 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 orare there alternatives?
AlternativesJust XML instead of XML-RPC
Use JSON
What is JSONJavaScript Object Notation
Use JSON as alternative to XML
It is derived from the JavaScript scripting language
Lightweight text-based open standard
Why JSONLighter and faster than XML
JSON objects are typed
Array, object, string, number, boolean and null
Great libraries for mobile platformsiOS 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 useJSON 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 APIGreat 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 implementfunction 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<?phpclass JSON_API_Hello_Controller {
public function hello_world() {return array( "message" => "Hello, world" );
}}?>
Important to knowOnly 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 managemobile content
Post typesAdd 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 pageOnly for mobile configuration
Store settings
Store default pages for mobile like privacy disclaimer
Push notificationsCreate 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 wordWordPress is a CMS
Can be used in a lot of ways
Sometimes look further then the plugin section