columbiaroad / wp-ssr
Server-side rendering for JavaScript apps inside WordPress templates.
Installs: 1 487
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 4
Forks: 0
Open Issues: 9
Type:wordpress-plugin
Requires (Dev)
- dev-master
- v1.1.4
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- 0.1.2
- 0.1.1
- 0.1.0
- dev-dependabot/npm_and_yarn/express-4.17.3
- dev-dependabot/npm_and_yarn/qs-6.5.3
- dev-dependabot/npm_and_yarn/moment-timezone-0.5.37
- dev-dependabot/npm_and_yarn/moment-2.29.4
- dev-dependabot/npm_and_yarn/node-fetch-2.6.7
- dev-dependabot/npm_and_yarn/minimist-1.2.6
- dev-dependabot/npm_and_yarn/path-parse-1.0.7
- dev-dependabot/npm_and_yarn/normalize-url-4.5.1
- dev-dependabot/npm_and_yarn/ws-7.4.6
- dev-develop
- dev-release/1.0.0
This package is auto-updated.
Last update: 2025-04-12 07:03:41 UTC
README
Poor man's Server Side Rendering
This application aims to solve server side rendering of JavaScript applications inside WordPress templates. It runs in two parts. First there is the WordPress plugin which creates new post type for the renders and REST API endpoints to get an array of render objects. Secondly there is Express server which when accessed fetches these render objects and launches puppeteer to render the pages. When the page is rendered and the wanted application part of that page is parsed, it will save the html back to the post through the REST API.
Disclaimer
This application doesn't provide you real time server side rendering but it's suitable for better SEO accessibility for your content. The puppeteer renders the page always as unauthenticated user and it requires that the state changes are reflected in the url.
Setup
WordPress
You can install the plugin using composer:
composer require "columbiaroad/wp-ssr:0.1.2@dev"
First you need to navigate to the plugin settings and fill in the required information. You need to provide an API key to be used for authenticating with the REST API. Then you need to give WordPress the Node application url what to ping for renders. Last you can define the interval when the renders expire.
In the WordPress template you need to request the rendered content before initial render of the header. You can request the content of the application by using WPSSR\Render::render
method which takes in three parameters:
string $url
Url of the page you are requesting to be renderedstring $app_selector
Query selector for the application root elementstring $waitfor_selector
Query selector for the puppeteer to wait before rendering the page
<?php /** * Template Name: React Application * */ $content = WPSSR\Render::render( get_permalink(), '#react-app-root', // App selector '#react-app-inner' // Waitfor selector ); get_header(); ?> <div id="react-app-root"> <?php echo $content; ?> </div> <?php get_footer(); ?>
Node App
To start the Node application you need to have couple of environment variables available for it.
WP_DOMAIN
which points to the root of your WordPress installationAPI_KEY
is the same API key that you provided in the plugin settings pageNODE_ENV
to define the Node environment. This is used in example to ignore puppeteer HTTPS errorsSCHEDULE
to define the schedule for rendering cron job
One way to run the application is to use the Docker image provided:
docker run -d \ -e "WP_DOMAIN=https://example.com" \ -e "API_KEY=my-api-key" \ -e "NODE_ENV=production" \ -e "SCHEDULE=*/15 * * * *" \ -p 80:3000 \ --restart=unless-stoppped \ --name=wpssr \ columbiaroadcom/wp-ssr
Publishing package
The composer package is automatically published to columbiaroad/wp-ssr
when a github release is made.
To publish to dockerhub you need access to the repository there. Publishing is done as follows:
docker build . --tag columbiaroadcom/wp-ssr:<tag> docker push columbiaroadcom/wp-ssr:<tag>
TODO
- Add
.env
file support for the Node application - Optimize for large amount of renders
- Lock the rendering process to prevent multiple simultaneous render calls