mindspun/wordpress-plugin-framework

Framework for creating professional-grade WordPress plugins.

v1.1.0 2023-12-15 14:52 UTC

This package is auto-updated.

Last update: 2024-04-15 15:31:50 UTC


README

The WordPress plugin framework utilizes the registry and facade design patterns to create profession-grade plugins that:

  • Have a clean, easy to understand, OOP implementation.
  • Have 100% unit test coverage.

See the examples directory for a batteries-included example.

Installation

The code is simple enough - and licensed appropriately - to be copied into your product directly, however, the best approach is to use Composer and Strauss.

See the examples directory for complete plugin that uses this method.

Autoloading

This package also contains a simple autoloader class that support both WordPress and PSR-4 style classes. Use it to autoload your application code.

require_once( __DIR__ . '/vendor-prefixed/autoload.php' );
Autoloader::autoload( 'Examples\Logging', __DIR__ . '/includes' );

The first line pulls in the Strauss autoloader, which loads the framework - including our autoloader class. The second line loads our plugin code.

The autoload method registers a namespace and associates the directory containing the files.

autoload( string $namespace, string $dir, string $type = 'psr4' )

The $type parameter also accepts wordpress or wp in which case the WordPress file namings scheme is used - i.e. with 'class-' filenames etc.

Usage

The facade/provider combo acts as a mini-library inside your plugin. The facade is the sole way the rest of the application acts with the functionality the provider provides.

In the plugin file, you'd call:

MyComponentProvider::provide();

then in the rest of the application, use the facade:

MyComponent::my_method();

Globals Facade/Provider

The framework contains one 'built-in' facade/provider combo: 'Globals', since every plugin is going to need it.

In your plugin, replace any call to a global function - either PHP native, or WordPress defined - with this facade. For example, die() becomes Globals::die(), wp_redirect(...) becomes Globals::wp_redirect(...) etc.

Generally, you'd create a 'Globals' class in your own namespace that extends Mindspun\Framework\Facades\Globals and then has an empty body. The purpose of this class is to add PHP doc @method comments with the globals you use to assist your editor. See the 'Globals' class in the 'examples' directory for an example.

Motivation

There are at least six other GitHub projects with the name 'wordpress-plugin-framework', so why one more?

  • It's just plain difficult to get 100% code coverage for a plugin of any complexity, and we consider that a minimum requirement for release. This approach fixes that.
  • Just look at any of the older plugins on wordpress.org/plugins/, and you'll see that it's really difficult to prevent a plugin from turning into spaghetti code as it grows. This approach prevents that (mostly, care must still be taken).

Development

Setup

composer update
./vendor/bin/phpcs --config-set installed_paths vendor/phpcompatibility/php-compatibility,vendor/phpcompatibility/phpcompatibility-wp,vendor/wp-coding-standards/wpcs