{"id":1549,"date":"2016-12-09T15:59:10","date_gmt":"2016-12-09T15:59:10","guid":{"rendered":"https:\/\/ionic.io\/blog\/?p=1549"},"modified":"2023-04-24T14:14:26","modified_gmt":"2023-04-24T18:14:26","slug":"the-dynamic-duo-wordpress-and-ionic-2","status":"publish","type":"post","link":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2","title":{"rendered":"The Dynamic Duo: WordPress &#038; Ionic 2"},"content":{"rendered":"<p><em>Scott Bolinger, the co-founder of <a href=\"https:\/\/apppresser.com\">AppPresser<\/a>, has been working with mobile WordPress design and development for years. He is passionate about using WordPress in new, exciting ways and about transforming WordPress into a mobile app development platform.<\/em><\/p>\n<p>Ionic and WordPress have always gone well together. Ionic&#8217;s CEO, Max Lynch, has even called Ionic &#8220;<a href=\"https:\/\/ionic.io\/blog\/mobile-just-changed-forever\/\">WordPress for mobile<\/a>&#8220;.<\/p>\n<p>WordPress makes it easy to build all kinds of websites, and Ionic makes it easy to build all kinds of mobile apps. Over 27% of the entire web is now WordPress sites, making WordPress the most popular website software by far. Ionic powers thousands of apps and is the gold standard of hybrid app development. Bringing these two technologies together is a match made in heaven.<\/p>\n<p>With the final release of Ionic 2, as well as the REST API being included in WordPress core, it\u2019s getting even easier to integrate WordPress into mobile apps.<\/p>\n<p>At <a href=\"https:\/\/apppresser.com\">AppPresser<\/a>, we\u2019ve been building mobile apps with WordPress since Ionic 1 was in Alpha and the WP-API didn\u2019t even exist. We built lots of apps with Ionic and WordPress, and we recently <a href=\"https:\/\/apppresser.com\/3-announcement\/\">completely rebuilt our platform to utilize Ionic 2<\/a>. We\u2019ve learned a ton along the way, and I\u2019m excited to share some of it with you.<\/p>\n<h3>How to Integrate WordPress and Ionic 2<\/h3>\n<p>There are a couple of different ways to get WordPress into your app, using the WP-API and iframes. Let\u2019s look at each of these a little closer.<br \/>\n<!--more--><\/p>\n<h3>WP-API<\/h3>\n<p>As of WordPress 4.7, the REST API is a part of WordPress core. All sites updated to 4.7+ will have their content available in JSON format by default. (Sites prior to 4.7 can use the <a href=\"https:\/\/wordpress.org\/plugins\/rest-api\/\">WP-API plugin<\/a>.)<\/p>\n<p>The WordPress REST API allows you to fetch content, as well as post data. To get this content into an Ionic 2 app, you just need to do an http request and display the content in your template. We have an example of this <a href=\"https:\/\/apppresser.com\/ionic-2-wordpress-wp-api\/\">on our blog<\/a>:<\/p>\n<pre><code class=\"javascript\">import { Component } from &#039;@angular\/core&#039;;\nimport {Http} from &#039;@angular\/http&#039;;\nimport &#039;rxjs\/add\/operator\/map&#039;;\n\n@Component({\n  template: `&lt;ion-header&gt;\n  &lt;ion-navbar&gt;\n    &lt;ion-title&gt;Home&lt;\/ion-title&gt;\n  &lt;\/ion-navbar&gt;\n&lt;\/ion-header&gt;\n\n&lt;ion-content class=&quot;home&quot;&gt;\n  &lt;ion-list&gt;\n    &lt;button ion-item *ngFor=&quot;let item of items&quot; (click)=&quot;itemTapped($event, item)&quot;&gt;\n    &lt;h2 [innerHTML]=&quot;item.title.rendered&quot;&gt;&lt;\/h2&gt;\n    &lt;p [innerHTML]=&quot;item.excerpt.rendered&quot;&gt;&lt;\/p&gt;\n    &lt;\/button&gt;\n  &lt;\/ion-list&gt;\n&lt;\/ion-content&gt;`;\n})\nexport class HomePage {\n    url: string = &#039;http:\/\/www.mysite.com\/wp-json\/wp\/v2\/posts&#039;;\n    items: any;\n\n    constructor( private http: Http ) {}\n\n    ionViewDidEnter() {\n        this.http.get( this.url )\n        .map(res =&gt; res.json())\n        .subscribe(data =&gt; {\n          this.items = data;\n        });\n    }\n}\n\n<\/code><\/pre>\n<p>Pretty straightforward, right? That code will display a list, and you just need to hook up the detail template like so:<\/p>\n<pre><code class=\"javascript\">import {NavController, NavParams} from &#039;ionic-angular&#039;;\nimport {Component} from &#039;@angular\/core&#039;;\n\n@Component({\n  template: `&lt;ion-header&gt;\n\n  &lt;ion-navbar&gt;\n    &lt;ion-title&gt;{{selectedItem.title.rendered}}&lt;\/ion-title&gt;\n  &lt;\/ion-navbar&gt;\n\n&lt;\/ion-header&gt;\n\n&lt;ion-content padding&gt;\n &lt;div *ngIf=&quot;selectedItem&quot; class=&quot;selection&quot;&gt;\n    &lt;h2 [innerHTML]=&quot;selectedItem.title.rendered&quot;&gt;&lt;\/h2&gt;\n    &lt;div [innerHTML]=&quot;selectedItem.content.rendered&quot;&gt;&lt;\/div&gt;\n &lt;\/div&gt;\n&lt;\/ion-content&gt;\n`;\n})\nexport class PostDetail {\n  selectedItem: any;\n\n  constructor(private nav: NavController, navParams: NavParams) {\n    \/\/ If we navigated to this page, we will have an item available as a nav param\n    this.selectedItem = navParams.get(&#039;item&#039;);\n  }\n\n}\n<\/code><\/pre>\n<p>Now, you have a list of WordPress posts in your app.<\/p>\n<p>You can change the api url to get a different type of content, like pages, media, or users (requires authentication):<\/p>\n<ul>\n<li>mysite.com\/wp-json\/wp\/v2\/pages<\/li>\n<li>mysite.com\/wp-json\/wp\/v2\/media<\/li>\n<li>mysite.com\/wp-json\/wp\/v2\/users (requires auth)<\/li>\n<li>mysite.com\/wp-json\/wp\/v2\/comments<\/li>\n<\/ul>\n<p>You can even create a custom endpoint with any type of content you want. For example:<\/p>\n<pre><code class=\"php\">&lt;?php\n\/\/ add this code to a custom plugin, or child theme functions.php file\nadd_action( &#039;rest_api_init&#039;, function () {\n    register_rest_route( &#039;myplugin\/v1&#039;, &#039;\/author\/(?P&lt;id&gt;\\d+)&#039;, array(\n        &#039;methods&#039; =&gt; &#039;GET&#039;,\n        &#039;callback&#039; =&gt; &#039;my_awesome_func&#039;,\n    ) );\n} );\n\n\/**\n * Grab latest post title by an author!\n *\n * @param array $data Options for the function.\n * @return string|null Post title for the latest,\u2028 * or null if none.\n *\/\nfunction my_awesome_func( $data ) {\n    $posts = get_posts( array(\n        &#039;author&#039; =&gt; $data[&#039;id&#039;],\n    ) );\n\n    if ( empty( $posts ) ) {\n        return null;\n    }\n\n    return $posts[0]-&gt;post_title;\n}\n<\/code><\/pre>\n<p>You could then make a request to mysite.com\/myplugin\/v1\/author\/1\u00a0and get all the posts by the author who has an ID of 1. You can also add fields to your template, like a featured image, post content, or any other <a href=\"http:\/\/v2.wp-api.org\/reference\/posts\/\">available field<\/a>. Using the example template above, we could add:<\/p>\n<pre><code class=\"html\">&lt;a href=\u201c{{item.link}}\u201d&gt;{{item.title.rendered}}&lt;\/a&gt;\n&lt;p&gt;{{item.date}}&lt;\/p&gt;\n\n<\/code><\/pre>\n<p>Grabbing some content is the easy part; what we\u2019ve learned is that people who use WordPress like to customize everything. That\u2019s when things get more complex.<\/p>\n<h3>Gotchas<\/h3>\n<p>The WP-API works great for displaying simple content out of the box. Doing much more than that requires quite a bit of customization.<\/p>\n<p>Difficult stuff with the WP-API:<\/p>\n<ul>\n<li>Posting data to WordPress, such as creating or editing a post, because it requires <a href=\"http:\/\/v2.wp-api.org\/guide\/authentication\/\">authentication<\/a>.<\/li>\n<li>Supporting custom plugins<\/li>\n<li>Any interactivity, such as a form<\/li>\n<li>Displaying custom data, like post meta<\/li>\n<\/ul>\n<p>The WP-API does not display custom post types or post meta by default. That means if you have WooCommerce installed, it will not display products by default. If you add support for products, it will not display product price, images, variations, and most other product fields without custom code. You can add support for <a href=\"http:\/\/scottbolinger.com\/custom-post-types-wp-api-v2\/\">custom post types<\/a> and <a href=\"https:\/\/torquemag.io\/2015\/07\/working-with-post-meta-data-using-the-wordpress-rest-api\/\">post meta<\/a>, but supporting lots of custom data gets really tedious.<\/p>\n<p>Most plugins don&#8217;t support the WP-API, so you&#8217;re on your own there. Let\u2019s say your client is using Gravity Forms, and they want their forms in the app. Doing that through the API would require rebuilding the forms in Ionic, creating custom endpoints to post data, and creating all of the http requests to send the data. You\u2019d also have to handle sanitization, inline validation, and lots of other fun stuff.<\/p>\n<p>If your client doesn\u2019t have the budget for the hours of coding it will take you to do that, what other options are there?<\/p>\n<h3>iFrames FTW<\/h3>\n<p>Iframes are a great compromise to display custom plugin content like a form without hours of custom coding.<\/p>\n<p>They have a lot of advantages, like being able to display interactive content like forms in your app easily. They have a few disadvantages, mainly that they load a bit slower and they don\u2019t work offline. However, if we use them only where appropriate, they can be seamlessly integrated into your app.<\/p>\n<p>Using Gravity Forms as an example, let\u2019s say we have a contact form at mysite.com\/contact. We can display the contact form in our Ionic app using a custom page component. Create a new component, and add this as the content:<\/p>\n<pre><code class=\"html\">&lt;ion-content&gt;\n    &lt;iframe src=\u201chttp:\/\/www.mysite.com\/contact\u201d&gt;&lt;\/iframe&gt;\n&lt;\/ion-content&gt;\n<\/code><\/pre>\n<p>To make the iframe full height\/width, add this to your SCSS file:<\/p>\n<pre><code class=\"scss\">ion-content{\n    iframe {\n        height: 100%;\n        width: 100%;\n        border: none;\n    }\n}\n<\/code><\/pre>\n<p>Loading this page will display the whole site, so we need to remove the stuff we don\u2019t want using a custom theme.<\/p>\n<p>AppPresser uses a theme that has no header and uses Ionic styling for things like lists and page content. When you view it in the app, it looks exactly the same as any other content; you can\u2019t even tell it\u2019s loaded in a frame.<\/p>\n<p>To achieve this, we have to switch the theme when we get a request from the app. The technical side is outside the scope of this article, but essentially we use a URL parameter on our iFrame source and switch the theme based on that. You can view the <a href=\"https:\/\/github.com\/apppresser\/AppPresser\/blob\/master\/inc\/AppPresser_Theme_Switcher.php#L80-L82\">AppPresser plugin source code<\/a> for a glimpse into how this works.<\/p>\n<p>The final result is iFrame pages to display complex content like forms, alongside API driven lists or static content. It all works seamlessly together, thanks to Ionic.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"428\" height=\"609\" class=\"aligncenter size-full wp-image-1574 lazyload\" data-src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif\" alt=\"Ionic WordPress app\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" style=\"--smush-placeholder-width: 428px; --smush-placeholder-aspect-ratio: 428\/609;\" \/><noscript><img loading=\"lazy\" decoding=\"async\" width=\"428\" height=\"609\" class=\"aligncenter size-full wp-image-1574\" src=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif\" alt=\"Ionic WordPress app\" \/><\/noscript><\/p>\n<h3>API or iFrames? Both.<\/h3>\n<p>If you\u2019re wondering which approach is better, the answer is both.<\/p>\n<p>Use API-driven content when you can, and sprinkle in a touch of iFrames when it\u2019s appropriate. Most popular apps use some sort of web driven content, even native apps made by Apple and Amazon. The key is to make it all work together smoothly to give your app user a great experience.<\/p>\n<p>Using these two approaches side by side, powered by Ionic, we can create some amazing apps that integrate almost any type of WordPress content.<\/p>\n<h3>App Builder for WordPress and Ionic 2<\/h3>\n<p>We just launched version 3 of the AppPresser platform utilizing Ionic 2. If you\u2019re looking for an app builder that helps you integrate WordPress into a mobile app, <a href=\"https:\/\/apppresser.com\/3-announcement\/\">give us a look<\/a>.<\/p>\n<p>Cheers!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Scott Bolinger, the co-founder of AppPresser, has been working with mobile WordPress design and development for years. He is passionate about using WordPress in new, exciting ways and about transforming WordPress into a mobile app development platform. Ionic and WordPress have always gone well together. Ionic&#8217;s CEO, Max Lynch, has even called Ionic &#8220;WordPress for [&hellip;]<\/p>\n","protected":false},"author":47,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"publish_to_discourse":"","publish_post_category":"","wpdc_auto_publish_overridden":"","wpdc_topic_tags":"","wpdc_pin_topic":"","wpdc_pin_until":"","discourse_post_id":"","discourse_permalink":"","wpdc_publishing_response":"","wpdc_publishing_error":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[3,13,25,45],"class_list":["post-1549","post","type-post","status-publish","format-standard","hentry","category-all","tag-ionic","tag-ionic-2","tag-tutorials","tag-wordpress"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.0 (Yoast SEO v23.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>The Dynamic Duo: WordPress &amp; Ionic 2 - Ionic Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Dynamic Duo: WordPress &amp; Ionic 2\" \/>\n<meta property=\"og:description\" content=\"Scott Bolinger, the co-founder of AppPresser, has been working with mobile WordPress design and development for years. He is passionate about using WordPress in new, exciting ways and about transforming WordPress into a mobile app development platform. Ionic and WordPress have always gone well together. Ionic&#8217;s CEO, Max Lynch, has even called Ionic &#8220;WordPress for [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2\" \/>\n<meta property=\"og:site_name\" content=\"Ionic Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-09T15:59:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-24T18:14:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif\" \/>\n<meta name=\"author\" content=\"Scott Bolinger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:site\" content=\"@ionicframework\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Scott Bolinger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#article\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2\"},\"author\":{\"name\":\"Scott Bolinger\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/8a3fef153c1507c123b7338653431502\"},\"headline\":\"The Dynamic Duo: WordPress &#038; Ionic 2\",\"datePublished\":\"2016-12-09T15:59:10+00:00\",\"dateModified\":\"2023-04-24T18:14:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2\"},\"wordCount\":1148,\"commentCount\":12,\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif\",\"keywords\":[\"Ionic\",\"Ionic 2\",\"Tutorials\",\"WordPress\"],\"articleSection\":[\"All\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2\",\"url\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2\",\"name\":\"The Dynamic Duo: WordPress & Ionic 2 - Ionic Blog\",\"isPartOf\":{\"@id\":\"https:\/\/ionic.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#primaryimage\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#primaryimage\"},\"thumbnailUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif\",\"datePublished\":\"2016-12-09T15:59:10+00:00\",\"dateModified\":\"2023-04-24T18:14:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#primaryimage\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif\",\"width\":428,\"height\":609},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/ionic.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Dynamic Duo: WordPress &#038; Ionic 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/ionic.io\/blog\/#website\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"name\":\"ionic.io\/blog\",\"description\":\"Build amazing native and progressive web apps with the web\",\"publisher\":{\"@id\":\"https:\/\/ionic.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/ionic.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/ionic.io\/blog\/#organization\",\"name\":\"Ionic\",\"url\":\"https:\/\/ionic.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"contentUrl\":\"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png\",\"width\":1920,\"height\":854,\"caption\":\"Ionic\"},\"image\":{\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/ionicframework\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/8a3fef153c1507c123b7338653431502\",\"name\":\"Scott Bolinger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b372e47bada9ffa6e05d9d61d314e7229ca0bffdce0e0c9a83ec45ef2dd34d7d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b372e47bada9ffa6e05d9d61d314e7229ca0bffdce0e0c9a83ec45ef2dd34d7d?s=96&d=mm&r=g\",\"caption\":\"Scott Bolinger\"},\"sameAs\":[\"https:\/\/apppresser.com\/\"],\"url\":\"https:\/\/ionic.io\/blog\/author\/scott\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"The Dynamic Duo: WordPress & Ionic 2 - Ionic Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2","og_locale":"en_US","og_type":"article","og_title":"The Dynamic Duo: WordPress & Ionic 2","og_description":"Scott Bolinger, the co-founder of AppPresser, has been working with mobile WordPress design and development for years. He is passionate about using WordPress in new, exciting ways and about transforming WordPress into a mobile app development platform. Ionic and WordPress have always gone well together. Ionic&#8217;s CEO, Max Lynch, has even called Ionic &#8220;WordPress for [&hellip;]","og_url":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2","og_site_name":"Ionic Blog","article_published_time":"2016-12-09T15:59:10+00:00","article_modified_time":"2023-04-24T18:14:26+00:00","og_image":[{"url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif"}],"author":"Scott Bolinger","twitter_card":"summary_large_image","twitter_creator":"@ionicframework","twitter_site":"@ionicframework","twitter_misc":{"Written by":"Scott Bolinger","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#article","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2"},"author":{"name":"Scott Bolinger","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/8a3fef153c1507c123b7338653431502"},"headline":"The Dynamic Duo: WordPress &#038; Ionic 2","datePublished":"2016-12-09T15:59:10+00:00","dateModified":"2023-04-24T18:14:26+00:00","mainEntityOfPage":{"@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2"},"wordCount":1148,"commentCount":12,"publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"image":{"@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif","keywords":["Ionic","Ionic 2","Tutorials","WordPress"],"articleSection":["All"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2","url":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2","name":"The Dynamic Duo: WordPress & Ionic 2 - Ionic Blog","isPartOf":{"@id":"https:\/\/ionic.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#primaryimage"},"image":{"@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#primaryimage"},"thumbnailUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif","datePublished":"2016-12-09T15:59:10+00:00","dateModified":"2023-04-24T18:14:26+00:00","breadcrumb":{"@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#primaryimage","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2016\/12\/ionic-wordpress.gif","width":428,"height":609},{"@type":"BreadcrumbList","@id":"https:\/\/ionic.io\/blog\/the-dynamic-duo-wordpress-and-ionic-2#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ionic.io\/blog"},{"@type":"ListItem","position":2,"name":"The Dynamic Duo: WordPress &#038; Ionic 2"}]},{"@type":"WebSite","@id":"https:\/\/ionic.io\/blog\/#website","url":"https:\/\/ionic.io\/blog\/","name":"ionic.io\/blog","description":"Build amazing native and progressive web apps with the web","publisher":{"@id":"https:\/\/ionic.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ionic.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ionic.io\/blog\/#organization","name":"Ionic","url":"https:\/\/ionic.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","contentUrl":"https:\/\/ionic.io\/blog\/wp-content\/uploads\/2020\/10\/white-on-color.png","width":1920,"height":854,"caption":"Ionic"},"image":{"@id":"https:\/\/ionic.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/ionicframework"]},{"@type":"Person","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/8a3fef153c1507c123b7338653431502","name":"Scott Bolinger","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ionic.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/b372e47bada9ffa6e05d9d61d314e7229ca0bffdce0e0c9a83ec45ef2dd34d7d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b372e47bada9ffa6e05d9d61d314e7229ca0bffdce0e0c9a83ec45ef2dd34d7d?s=96&d=mm&r=g","caption":"Scott Bolinger"},"sameAs":["https:\/\/apppresser.com\/"],"url":"https:\/\/ionic.io\/blog\/author\/scott"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/1549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/users\/47"}],"replies":[{"embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/comments?post=1549"}],"version-history":[{"count":1,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/1549\/revisions"}],"predecessor-version":[{"id":5176,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/posts\/1549\/revisions\/5176"}],"wp:attachment":[{"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/media?parent=1549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/categories?post=1549"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ionic.io\/blog\/wp-json\/wp\/v2\/tags?post=1549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}