SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
Plastical Sagl Corso S. Gottardo 14, cp 1512
6830 Chiasso 1
Switzerland
tel.: +41 (0) 91 9675780
info@plastical.com
plastical.com
WP 4.7 & React

A perfect marriage?
Ryan Vannin — 12.04.2017
FrontEnders Ticino @ DOS Group
Ryan Vannin
MSc. com., PhD Informatics drop-out, soon-to-become lawyer.
Owner at Plastical, organiser of Hack the City.
Tech and innovation passionate. Below-the-average coder. Runner.
Follow me: @ryanvannin
Agenda
- Ideal vs. real world

- All is not lost! WP 4.7 + React

- Basic setup 

- Data fetching with Redux + Ducks

- Routing (React Router 4.0 alpha) + hacks

- Multi-language with“intl”

- Wrap-up

- Q&A
Ideal vs. real world
In an ideal world
I’m using the latest and fanciest technology available…
… running on great infrastructure or on customised self-
owned “metal”!
In a few words…
… Y’all know what?
I’m a full-stack developer, you a**holes!
In the real world
Crazy requirements

(Does coffee heating?… And don’t forget cats’ gifs!)
Tech constraints

(LAMP stack, wtf!)
Impossible deadlines and limited budget

(Duh, was I supposed to pay you for the website?
Visibility wasn’t enough?)
Let’s be honest here…
… this stuff won’t go away anytime soon!
All is not lost!

Wordpress 4.7 + React
Let’s put them together…
+
Wordpress 4.7
WP Rest API made it to the core in the 4.7 update of WP…
Good news:

no need to install a plug-in…
Bad news:

to fully benefit of its endpoints, you have to build your
own, custom theme!
Endpoints
Some examples:
…/wp-json/wp/v2/posts
…/wp-json/wp/v2/pages
…/wp-json/wp/v2/users
…/wp-json/wp/v2/events
React
… Seriously???
… Ok, not 100% true, but I had to use some cool marketing jargon
“Build a pure, beautiful and feature-rich JS
theme and never look back again to the legacy
PHP spaghetti-code Wordpress throws in”
Example of a complex WP theme
Posts and single pages (usual stuff)
Multi-language (requires a plug-in, e.g. WPML)
Events (+ management) via custom post types
List users and custom author pages with details
Contact form(s) with validation and file upload
Beautiful, responsive and fast theme
Basic setup
Localhost
Usual stuff to run WP locally,

i.e. MAMP (PRO) or via Terminal with LAMP stack


… And, no, Webpack Dev Server won’t do the task!
Folder structure

(usually in /wp-content/themes/your-theme)
…
footer.php
functions.php
header.php
index.php
package.json
webpack.config.js
…
— bin/ (for additional PHP config files)
— less/ (or sass, it’s up to you)
— src/ (our main react folder)

Yep! React stuff mixed up with PHP!!!
However, on deploy these go away
functions.php (1)
Let’s first configure WP to talk to React
https://github.com/plastical/react-theme/blob/master/
functions.php
functions.php (2)
function plastical_scripts() {
$bundleDir = ($isWithinTemplate) ? get_template_directory_uri() : ‘/
assets';
wp_enqueue_style('plastical-style', $bundleDir . ‘/build/bundle.css');
wp_enqueue_script(PLASTICAL_VENDOR, $bundleDir . '/build/
vendor.bundle.js', array('jquery'), PLASTICAL_VERSION, true);
wp_enqueue_script(PLASTICAL_APP, $bundleDir . '/build/bundle.js',
array('jquery'), PLASTICAL_VERSION, true);
…
}
index.php
<?php get_header(); ?>
<div id="root"></div>
<?php get_footer(); ?>
No sidebar.php?

No, unless you want to turn it into a nightmare…
package.json
Usual stuff
{

….

“intl”: “ˆ1.2.5”

…

"react-intl": "^2.1.5",
"react-intl-redux": "^0.2.0",

…

“react-router”: “4.0.0-alpha.6”

…



"wordpress-query-comments": "^1.1.0",
"wordpress-query-custom-posts-events": "^0.2.0",
"wordpress-query-menu": "^1.1.0",
"wordpress-query-page": "^1.1.0",
"wordpress-query-page-children": "^0.1.4",
"wordpress-query-posts": "^1.1.1",
"wordpress-query-term": "^1.1.0",
"wordpress-query-users": "^0.2.0"

}
+
Ducks!!!

Back to this stuff later
Our app structure

(/src)
— components/
— data/
— i18n/
index.js (app entry point)
reducer.js
— routing/
structure.js
— utils/
More about this folder later…
webpack.config.js (v 2.0)
Again, usual stuff…
module.exports = {
entry: {
assets: './src/index.js',
vendor: ['react','react-dom','react-router','redux']
},
output: {
path: path.join(__dirname, '../../../assets/build'),
filename: 'bundle.js'
},
resolve: {
extensions: ['.js', '.jsx'],
alias: {
data: path.join(__dirname, 'src/data'),
components: path.join(__dirname, 'src/components'),
utils: path.resolve(__dirname, 'src/utils'),
},
modules: ['node_modules', ‘src']
},
….
Remember? all the stuff goes under /assets/…
+
Data fetching with Redux + Ducks
Redux
Redux will hold the application state in its store,
including data fetched from the WP Rest API endpoints



https://github.com/plastical/react-theme/blob/master/
src/store.js
PS.: nothing fancy here…
Ducks???
“Ducks” are redux modules containing single-purpose
constants, actions and reducers.



https://github.com/plastical/react-theme/blob/master/
src/reducer.js
Ex.: https://github.com/plastical/wordpress-query-
users
Fetching and data persistence
Routing (React Router 4.0 alpha) + hacks
React Router 4.0 alpha
Component based, but unstable (e.g., Match vs. Route)
Not working with “react-router-redux”, had to build my
own sync…
Huge mess with “intl", “react-intl” and “react-redux-intl”…



https://github.com/plastical/react-theme/blob/master/
src/routing/index.js
PS.: version > 4.0 beta? Need contributions!
Routing? Welcome some ugly hacks…
index.js
https://github.com/plastical/react-theme/blob/master/
src/index.js
structure.js
https://github.com/plastical/react-theme/blob/master/
src/structure.js
External URLs + click capture… jQuery!!!
Multi-language with“intl”
Intl
Needs i18n
https://github.com/plastical/react-theme/tree/master/
src/i18n
Import in component as decorator:
import { injectIntl } from 'react-intl';
…
{
…
<h1>
{props.intl.formatMessage({ id: 'home.latest_news' })}
</h1>
…
}
export default injectIntl(
connect((state, ownProps) => { … })(Home)
);
Translations as messages:
…

{

…

‘home.latest_news’: ‘Latest news’,

…

}
WP multi language with React?
Needs WPML (or a similar plug-in)
To fully recognise new locale a browser reload is needed
(onClick)
Translation strings are hardcoded, thus wasn’t easier an
other solution (e.g. inject directly from PHP)?
Wrap-up
Some cool stuff…
WP 4.7 + React: excellent combination to build an almost
pure JS theme
Blazing fast (once your bundles are in cache)
Using endpoints opens up endless possibilities with a few
specialised components, e.g. search and contact
Some less cool stuff… (1)
You HAVE to know both JS and PHP in order to benefit of
both words
You have to configure WP to use the WP Rest APIs,
otherwise it doesn’t work as expected (e.g. menus!!!)
Overcomplicated, over bloated
Simple out-of-the-box features do not work without
tweaks (ex. active state on navigation)
Some less cool stuff… (2)
Multi language is just a nightmare, as well as routing
(you need to manipulate the DOM — not the virtual, but
the real — to detect clicks or onEnters…)
You are stuck with a LAMP stack, unless you fetch data
from outside…
In production, simplest changes (e.g., string translations
or add/modify a className) require “npm run build”,
while in PHP just edit the .php file
Some less cool stuff… (3)
Bundle size ~1MB!!!
(ok, can cache it and gzip it, but what’s the point?)
The result
Site in production:

http://dev.agire.ch
Source code:

https://github.com/plastical/react-theme
Q&As
Plastical Sagl Corso S. Gottardo 14, cp 1512
6830 Chiasso 1
Switzerland
tel.: +41 (0) 91 9675780
info@plastical.com
plastical.com
Thanks

@ryanvannin / ryan@plastical.com

Contenu connexe

Tendances

Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Michiel Rook
 
Automated Deployment With Phing
Automated Deployment With PhingAutomated Deployment With Phing
Automated Deployment With PhingDaniel Cousineau
 
Makefile for python projects
Makefile for python projectsMakefile for python projects
Makefile for python projectsMpho Mphego
 
Build Automation of PHP Applications
Build Automation of PHP ApplicationsBuild Automation of PHP Applications
Build Automation of PHP ApplicationsPavan Kumar N
 
Deploying PHP applications with Phing
Deploying PHP applications with PhingDeploying PHP applications with Phing
Deploying PHP applications with PhingMichiel Rook
 
Web Development in Perl
Web Development in PerlWeb Development in Perl
Web Development in PerlNaveen Gupta
 
Introduction to Web Programming with Perl
Introduction to Web Programming with PerlIntroduction to Web Programming with Perl
Introduction to Web Programming with PerlDave Cross
 
Building and Deploying PHP Apps Using phing
Building and Deploying PHP Apps Using phingBuilding and Deploying PHP Apps Using phing
Building and Deploying PHP Apps Using phingMihail Irintchev
 
Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016Clark Everetts
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is DockerNick Belhomme
 
New EEA Plone Add-ons
New EEA Plone Add-onsNew EEA Plone Add-ons
New EEA Plone Add-onsAlin Voinea
 

Tendances (20)

Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)
 
Automated Deployment With Phing
Automated Deployment With PhingAutomated Deployment With Phing
Automated Deployment With Phing
 
Makefile for python projects
Makefile for python projectsMakefile for python projects
Makefile for python projects
 
Presentation php
Presentation phpPresentation php
Presentation php
 
Build Automation of PHP Applications
Build Automation of PHP ApplicationsBuild Automation of PHP Applications
Build Automation of PHP Applications
 
Deploying PHP applications with Phing
Deploying PHP applications with PhingDeploying PHP applications with Phing
Deploying PHP applications with Phing
 
Web Development in Perl
Web Development in PerlWeb Development in Perl
Web Development in Perl
 
Os Treat
Os TreatOs Treat
Os Treat
 
Php Ppt
Php PptPhp Ppt
Php Ppt
 
Php Power Tools
Php Power ToolsPhp Power Tools
Php Power Tools
 
Ant vs Phing
Ant vs PhingAnt vs Phing
Ant vs Phing
 
Introduction to Web Programming with Perl
Introduction to Web Programming with PerlIntroduction to Web Programming with Perl
Introduction to Web Programming with Perl
 
Building and Deploying PHP Apps Using phing
Building and Deploying PHP Apps Using phingBuilding and Deploying PHP Apps Using phing
Building and Deploying PHP Apps Using phing
 
Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016
 
Phpbasics
PhpbasicsPhpbasics
Phpbasics
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
 
Php presentation
Php presentationPhp presentation
Php presentation
 
Php
PhpPhp
Php
 
Phing
PhingPhing
Phing
 
New EEA Plone Add-ons
New EEA Plone Add-onsNew EEA Plone Add-ons
New EEA Plone Add-ons
 

Similaire à WP 4.7 & React — A perfect marriage?

TTW FTW: Plone as the new wordpress
TTW FTW: Plone as the new wordpressTTW FTW: Plone as the new wordpress
TTW FTW: Plone as the new wordpressDylan Jay
 
Everything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebEverything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebJames Rakich
 
Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Christian Heilmann
 
A intro to (hosted) Shiny Apps
A intro to (hosted) Shiny AppsA intro to (hosted) Shiny Apps
A intro to (hosted) Shiny AppsDaniel Koller
 
Fundamentals of web_design_v2
Fundamentals of web_design_v2Fundamentals of web_design_v2
Fundamentals of web_design_v2hussain534
 
Bring drupal 8 to all in their native languages
Bring drupal 8 to all in their native languagesBring drupal 8 to all in their native languages
Bring drupal 8 to all in their native languagesSébastien Corbin
 
All a flutter about Flutter.io
All a flutter about Flutter.ioAll a flutter about Flutter.io
All a flutter about Flutter.ioSteven Cooper
 
HAXTheWeb @ Apereo 19
HAXTheWeb @ Apereo 19HAXTheWeb @ Apereo 19
HAXTheWeb @ Apereo 19btopro
 
Introduction to Flutter - truly crossplatform, amazingly fast
Introduction to Flutter - truly crossplatform, amazingly fastIntroduction to Flutter - truly crossplatform, amazingly fast
Introduction to Flutter - truly crossplatform, amazingly fastBartosz Kosarzycki
 
Drupal Theme Development - DrupalCon Chicago 2011
Drupal Theme Development - DrupalCon Chicago 2011Drupal Theme Development - DrupalCon Chicago 2011
Drupal Theme Development - DrupalCon Chicago 2011Ryan Price
 
Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedGil Fink
 
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data EverywhereApache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data EverywhereGanesh Raju
 
Moving from Web 1.0 to Web 2.0
Moving from Web 1.0 to Web 2.0Moving from Web 1.0 to Web 2.0
Moving from Web 1.0 to Web 2.0Estelle Weyl
 
Pinax Long Tutorial Slides
Pinax Long Tutorial SlidesPinax Long Tutorial Slides
Pinax Long Tutorial SlidesDaniel Greenfeld
 
Drupal in 30 Minutes
Drupal in 30 MinutesDrupal in 30 Minutes
Drupal in 30 MinutesRobert Carr
 

Similaire à WP 4.7 & React — A perfect marriage? (20)

Current state-of-php
Current state-of-phpCurrent state-of-php
Current state-of-php
 
TTW FTW: Plone as the new wordpress
TTW FTW: Plone as the new wordpressTTW FTW: Plone as the new wordpress
TTW FTW: Plone as the new wordpress
 
Everything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebEverything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the Web
 
Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010Enjoying the full stack - Frontend 2010
Enjoying the full stack - Frontend 2010
 
A intro to (hosted) Shiny Apps
A intro to (hosted) Shiny AppsA intro to (hosted) Shiny Apps
A intro to (hosted) Shiny Apps
 
Fundamentals of web_design_v2
Fundamentals of web_design_v2Fundamentals of web_design_v2
Fundamentals of web_design_v2
 
Bring drupal 8 to all in their native languages
Bring drupal 8 to all in their native languagesBring drupal 8 to all in their native languages
Bring drupal 8 to all in their native languages
 
All a flutter about Flutter.io
All a flutter about Flutter.ioAll a flutter about Flutter.io
All a flutter about Flutter.io
 
HAXTheWeb @ Apereo 19
HAXTheWeb @ Apereo 19HAXTheWeb @ Apereo 19
HAXTheWeb @ Apereo 19
 
Introduction to Flutter - truly crossplatform, amazingly fast
Introduction to Flutter - truly crossplatform, amazingly fastIntroduction to Flutter - truly crossplatform, amazingly fast
Introduction to Flutter - truly crossplatform, amazingly fast
 
Drupal Theme Development - DrupalCon Chicago 2011
Drupal Theme Development - DrupalCon Chicago 2011Drupal Theme Development - DrupalCon Chicago 2011
Drupal Theme Development - DrupalCon Chicago 2011
 
Demystifying Maven
Demystifying MavenDemystifying Maven
Demystifying Maven
 
Stencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrivedStencil the time for vanilla web components has arrived
Stencil the time for vanilla web components has arrived
 
Devtools cheatsheet
Devtools cheatsheetDevtools cheatsheet
Devtools cheatsheet
 
Devtools cheatsheet
Devtools cheatsheetDevtools cheatsheet
Devtools cheatsheet
 
DSLs in JavaScript
DSLs in JavaScriptDSLs in JavaScript
DSLs in JavaScript
 
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data EverywhereApache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
 
Moving from Web 1.0 to Web 2.0
Moving from Web 1.0 to Web 2.0Moving from Web 1.0 to Web 2.0
Moving from Web 1.0 to Web 2.0
 
Pinax Long Tutorial Slides
Pinax Long Tutorial SlidesPinax Long Tutorial Slides
Pinax Long Tutorial Slides
 
Drupal in 30 Minutes
Drupal in 30 MinutesDrupal in 30 Minutes
Drupal in 30 Minutes
 

Dernier

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 

Dernier (20)

Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 

WP 4.7 & React — A perfect marriage?

  • 1. Plastical Sagl Corso S. Gottardo 14, cp 1512 6830 Chiasso 1 Switzerland tel.: +41 (0) 91 9675780 info@plastical.com plastical.com WP 4.7 & React
 A perfect marriage? Ryan Vannin — 12.04.2017 FrontEnders Ticino @ DOS Group
  • 2. Ryan Vannin MSc. com., PhD Informatics drop-out, soon-to-become lawyer. Owner at Plastical, organiser of Hack the City. Tech and innovation passionate. Below-the-average coder. Runner. Follow me: @ryanvannin
  • 3. Agenda - Ideal vs. real world
 - All is not lost! WP 4.7 + React
 - Basic setup 
 - Data fetching with Redux + Ducks
 - Routing (React Router 4.0 alpha) + hacks
 - Multi-language with“intl”
 - Wrap-up
 - Q&A
  • 5. In an ideal world I’m using the latest and fanciest technology available…
  • 6. … running on great infrastructure or on customised self- owned “metal”!
  • 7. In a few words… … Y’all know what? I’m a full-stack developer, you a**holes!
  • 8. In the real world Crazy requirements
 (Does coffee heating?… And don’t forget cats’ gifs!) Tech constraints
 (LAMP stack, wtf!) Impossible deadlines and limited budget
 (Duh, was I supposed to pay you for the website? Visibility wasn’t enough?)
  • 9. Let’s be honest here… … this stuff won’t go away anytime soon!
  • 10. All is not lost!
 Wordpress 4.7 + React
  • 11. Let’s put them together… +
  • 12. Wordpress 4.7 WP Rest API made it to the core in the 4.7 update of WP… Good news:
 no need to install a plug-in… Bad news:
 to fully benefit of its endpoints, you have to build your own, custom theme!
  • 15. … Ok, not 100% true, but I had to use some cool marketing jargon “Build a pure, beautiful and feature-rich JS theme and never look back again to the legacy PHP spaghetti-code Wordpress throws in”
  • 16. Example of a complex WP theme Posts and single pages (usual stuff) Multi-language (requires a plug-in, e.g. WPML) Events (+ management) via custom post types List users and custom author pages with details Contact form(s) with validation and file upload Beautiful, responsive and fast theme
  • 18. Localhost Usual stuff to run WP locally,
 i.e. MAMP (PRO) or via Terminal with LAMP stack 
 … And, no, Webpack Dev Server won’t do the task!
  • 19. Folder structure
 (usually in /wp-content/themes/your-theme) … footer.php functions.php header.php index.php package.json webpack.config.js … — bin/ (for additional PHP config files) — less/ (or sass, it’s up to you) — src/ (our main react folder)
 Yep! React stuff mixed up with PHP!!! However, on deploy these go away
  • 20. functions.php (1) Let’s first configure WP to talk to React https://github.com/plastical/react-theme/blob/master/ functions.php
  • 21. functions.php (2) function plastical_scripts() { $bundleDir = ($isWithinTemplate) ? get_template_directory_uri() : ‘/ assets'; wp_enqueue_style('plastical-style', $bundleDir . ‘/build/bundle.css'); wp_enqueue_script(PLASTICAL_VENDOR, $bundleDir . '/build/ vendor.bundle.js', array('jquery'), PLASTICAL_VERSION, true); wp_enqueue_script(PLASTICAL_APP, $bundleDir . '/build/bundle.js', array('jquery'), PLASTICAL_VERSION, true); … }
  • 22. index.php <?php get_header(); ?> <div id="root"></div> <?php get_footer(); ?> No sidebar.php?
 No, unless you want to turn it into a nightmare…
  • 23. package.json Usual stuff {
 ….
 “intl”: “ˆ1.2.5”
 …
 "react-intl": "^2.1.5", "react-intl-redux": "^0.2.0",
 …
 “react-router”: “4.0.0-alpha.6”
 …
 
 "wordpress-query-comments": "^1.1.0", "wordpress-query-custom-posts-events": "^0.2.0", "wordpress-query-menu": "^1.1.0", "wordpress-query-page": "^1.1.0", "wordpress-query-page-children": "^0.1.4", "wordpress-query-posts": "^1.1.1", "wordpress-query-term": "^1.1.0", "wordpress-query-users": "^0.2.0"
 } + Ducks!!!
 Back to this stuff later
  • 24. Our app structure
 (/src) — components/ — data/ — i18n/ index.js (app entry point) reducer.js — routing/ structure.js — utils/ More about this folder later…
  • 25. webpack.config.js (v 2.0) Again, usual stuff… module.exports = { entry: { assets: './src/index.js', vendor: ['react','react-dom','react-router','redux'] }, output: { path: path.join(__dirname, '../../../assets/build'), filename: 'bundle.js' }, resolve: { extensions: ['.js', '.jsx'], alias: { data: path.join(__dirname, 'src/data'), components: path.join(__dirname, 'src/components'), utils: path.resolve(__dirname, 'src/utils'), }, modules: ['node_modules', ‘src'] }, …. Remember? all the stuff goes under /assets/… +
  • 26. Data fetching with Redux + Ducks
  • 27. Redux Redux will hold the application state in its store, including data fetched from the WP Rest API endpoints
 
 https://github.com/plastical/react-theme/blob/master/ src/store.js PS.: nothing fancy here…
  • 28. Ducks??? “Ducks” are redux modules containing single-purpose constants, actions and reducers.
 
 https://github.com/plastical/react-theme/blob/master/ src/reducer.js Ex.: https://github.com/plastical/wordpress-query- users
  • 29. Fetching and data persistence
  • 30. Routing (React Router 4.0 alpha) + hacks
  • 31. React Router 4.0 alpha Component based, but unstable (e.g., Match vs. Route) Not working with “react-router-redux”, had to build my own sync… Huge mess with “intl", “react-intl” and “react-redux-intl”…
 
 https://github.com/plastical/react-theme/blob/master/ src/routing/index.js PS.: version > 4.0 beta? Need contributions!
  • 32. Routing? Welcome some ugly hacks… index.js https://github.com/plastical/react-theme/blob/master/ src/index.js structure.js https://github.com/plastical/react-theme/blob/master/ src/structure.js External URLs + click capture… jQuery!!!
  • 34. Intl Needs i18n https://github.com/plastical/react-theme/tree/master/ src/i18n Import in component as decorator: import { injectIntl } from 'react-intl'; … { … <h1> {props.intl.formatMessage({ id: 'home.latest_news' })} </h1> … } export default injectIntl( connect((state, ownProps) => { … })(Home) ); Translations as messages: …
 {
 …
 ‘home.latest_news’: ‘Latest news’,
 …
 }
  • 35. WP multi language with React? Needs WPML (or a similar plug-in) To fully recognise new locale a browser reload is needed (onClick) Translation strings are hardcoded, thus wasn’t easier an other solution (e.g. inject directly from PHP)?
  • 37. Some cool stuff… WP 4.7 + React: excellent combination to build an almost pure JS theme Blazing fast (once your bundles are in cache) Using endpoints opens up endless possibilities with a few specialised components, e.g. search and contact
  • 38. Some less cool stuff… (1) You HAVE to know both JS and PHP in order to benefit of both words You have to configure WP to use the WP Rest APIs, otherwise it doesn’t work as expected (e.g. menus!!!) Overcomplicated, over bloated Simple out-of-the-box features do not work without tweaks (ex. active state on navigation)
  • 39. Some less cool stuff… (2) Multi language is just a nightmare, as well as routing (you need to manipulate the DOM — not the virtual, but the real — to detect clicks or onEnters…) You are stuck with a LAMP stack, unless you fetch data from outside… In production, simplest changes (e.g., string translations or add/modify a className) require “npm run build”, while in PHP just edit the .php file
  • 40. Some less cool stuff… (3) Bundle size ~1MB!!! (ok, can cache it and gzip it, but what’s the point?)
  • 41. The result Site in production:
 http://dev.agire.ch Source code:
 https://github.com/plastical/react-theme
  • 42. Q&As
  • 43. Plastical Sagl Corso S. Gottardo 14, cp 1512 6830 Chiasso 1 Switzerland tel.: +41 (0) 91 9675780 info@plastical.com plastical.com Thanks
 @ryanvannin / ryan@plastical.com