Manuel Shimano Recommendations

on 10 Aug, 17:36

PoP can finally be installed!

PoP can finally be installed!

Alright, that took some time in coming, but we can finally announce it: PoP can finally be installed through Composer! Sucess!!!!!

So for first time in its history, PoP can be easily installed, without resorting to hacks: simply execute a script, wait for a few minutes, and voilĂ . Currently, only the PoP API for WordPress is finished, and in a few months we will unlock further functionality: creating the whole site through PoP, and for other CMSs in addition to WordPress. Yay!

Installation instructions

Via Composer and WP-CLI (both are assumed to be installed globally):

  1. Create the WordPress database and user
  2. Configure WordPress through environment variables:

Copy the code below to an editor, replace all values (such as {YOUR_SITE_DB_NAME}) with your own values, and then either paste it on the terminal to execute, or save it in file “~/.bash_profile” and then execute source ~/.bash_profile.

export DB_NAME={YOUR_SITE_DB_NAME} #eg: database
export DB_USER={YOUR_SITE_DB_USER} #eg: admin
export DB_PASSWORD={YOUR_SITE_DB_PASSWORD} #eg: sADF!kl9diq@#Sjfk
export SITE_URL_WITH_HTTP={YOUR_SITE_URL_WITH_HTTP} #eg: http://localhost
export SITE_NAME="{YOUR_SITE_NAME}" #eg: "My awesome website"
export ADMIN_USER={ADMIN_USER} #eg: admin

To set the SALT keys there are two alternatives:

I. Set random values through environment variable SHUFFLE_SALT_KEYS:


II. Set the corresponding values directly:

# Obtain random values from
  1. Bootstrap a new project from this repo:
composer create-project leoloso/pop-api-wp
  1. Wait for a few minutes ☕️😁
  2. ✅ The site is installed under:
    • 👉WordPress site: {YOUR_SITE_URL_WITH_HTTP}
    • 👉WordPress admin: {YOUR_SITE_URL_WITH_HTTP}/wp/wp-admin/
    • 👉PoP API: {YOUR_SITE_URL_WITH_HTTP}/posts/?action=api&datastructure=rest (REST for posts)



on 2 Aug, 18:09

The PoP API now supports both REST and GraphQL!

The PoP API now supports both REST and GraphQL!

We are very proud to announce that PoP can now return the response of its API using both the REST and GraphQL formats. This way, a PoP API can be used as a drop-in replacement for both REST and GraphQL, providing the benefits of both these APIs, at the same time! Check out these benefits:

  • No over/under-fetching data (as in GraphQL)
  • Shape of the response mirrors mirrors the query (as in GraphQL)
  • Passing parameters to the query nodes, at any depth, for filtering/pagination/formatting/etc (as in GraphQL)
  • Server-side caching (as in REST)
  • Secure: Not chance of Denial of Service attacks (as in REST)
  • Provide default data when no query is provided (as in REST)

In a nutshell: the PoP API is REST endpoints with GraphQL queries.


The API is accessed through the following endpoints (click on them to see an example):


Add parameters action=api&datastructure=rest to the endpoint URL:


Add parameters action=api&datastructure=graphql to the endpoint URL, and parameter fields with the data fields to retrieve (using a custom dot notation). Examples:

PoP native:

Add parameters action=api to the endpoint URL, and parameter fields similar to the examples above for GraphQL.

How does it work?

Through a parameter datastructure in the URL we can select if the response must be REST-compatible or GraphQL-compatible. To fetch the data fields, for REST it supports default fields (as in typical REST behaviour), or explicitly querying for the fields, like in GraphQL. For this, the GraphQL query is converted to dot notation and passed in the URL through parameter fields. For instance, the following query:

query {
  comments {
    author {
      posts {

Is converted to dot notation like this:



on 30 Jun, 11:52

Leo’s presentation on the Component-based API from JSConf Asia 2019 is now online!

Leo’s presentation on the Component-based API from JSConf Asia 2019 is now online!

Leo took part in the latest version of JSConf Asia 2019, with a talk titled “Introduction to the Component-based API” in which he explains many of the concepts powering PoP, including how it features a component-model architecture for the back-end (PHP), and how PoP delivers an API which is a mix of REST and GraphQL, containing benefits from both of them, and which can be progressively enhanced to deliver the application itself.

The talk is now available online:



on 7 Jun, 18:19

Notes on PoP’s code migration to Composer

Notes on PoP’s code migration to Composer

We have finally started migrated PoP to Composer components, hence it will soon be possible to install it with a simple `composer require` command. We are expecting this task to be finished around end of 2019. The migration involves the following actions:

All components already migrated can be found under PoP’s account in GitHub: To date, we have migrated the following components:

  • root: Declaration of dependencies shared by all PoP components
  • engine-wp: Implementation of PoP Engine for WordPress
  • engine-wp-bootloader: PoP Engine Bootloader for WordPress
  • engine-symfony: Implementation of contracts for PoP Engine through Symfony components
  • hooks: Contracts to implement hooks (filters and actions) for PoP
  • hooks-wp: WordPress implementation of the contracts to implement hooks (filters and actions) for PoP
  • translation: Translation API for PoP components
  • translation-wp: Implementation of the Translation API for WordPress
  • cache: Contracts for implementing caching for PoP components
  • cache-symfony: Implementation of the contracts for caching through Symfony Cache
  • filestore: Base classes to save files to disk, read them and reference them through an URL
  • spa: Single-Page Application for PoP

In addition, we have created a Bootstrap project for WordPress, enabling to quickly install WordPress together with PoP. This project will contain the most basic PoP components, which will be continuously added as their migration is completed.

The most important component in PoP is engine, since it contains the fundamental logic for rendering components in PoP. This component is currently being migrated. Once its migration is complete, PoP’s fundamentals will be in place, so that any application will be able to use it. From then on, the other components to migrate will be features.

The migration is taking a very long time due to the following reasons:

  • PoP’s code was based on WordPress, which is very old. Hence, we’re conveniently converting PoP to a modern codebase, based around components installed through Composer, and full compatibility with the PHP Standard Recommendations, particularly PSRs 1, 2 and 4
  • During the previous 5 years, we developed tons of functionalities which must be migrated to the modern codebase

How many components must still be migrated for the migration to be completed? A lot:

If anyone is unwilling to wait for so long until the migration is complete, and want to contribute with the migration, give Leo a shout!

on 19 Mar, 21:42

We are finally decoupling PoP from WordPress

We are finally decoupling PoP from WordPress

In our previous blog post we described that we were migrating PoP code into components. While doing so, we are abstracting the whole code away from WordPress, so that it can be powered by other frameworks, such as Laravel. The task involves finding all the references to WordPress code inside the PoP codebase, and move that code behind the implementation of an interface. Because the interface can be implemented for any CMS, we will then be able to install PoP using any framework.

This task is time consuming, so we are working on it, however we hope it will be finished within a couple of weeks, after which we will finally start making components available.

Stay tuned!

on 12 Dec, 19:03

PoP is now available as a standalone API, can power any WordPress theme

PoP is now available as a standalone API, can power any WordPress theme

Together with the release of the PoP API, we announce a major feature: the PoP API has been completely decoupled from the overall application, so it can be used as a standalone API to power any application, using a PoP theme or any standard WordPress theme.

For instance, we have deployed a site under, which uses the default WordPress 5.0 theme “Twenty Nineteen”:

If, however, we add parameter ouput=json to the URL, we get the data through the PoP API:

This makes it possible to use PoP purely as an API to fetch or post data, alongside any other theme out there.


Sign up to our newsletter:

Welcome to the PoP framework!
Break the information monopoly

the PoP framework is open source software which aims to decentralize the content flow and break the information monopoly from large internet corporations. Read more.