@harrasteblogi JUURI NYT
--:--

Tilaa uutiskirje

Saat tuoreimmat 10 uusinta artikkelia kerran viikossa sähköpostiisi.

Tilaa uutiskirje

WordPressin object-oriented plugin-rakenne käytännössäMonet WordPress-pluginit alkavat pienestä functions.php-tyylisestä koodista ja kasvavat nopeasti vaikeasti ylläpidettäviksi kokonaisuuksiksi. Kun plugin sisältää asetuksia, API-kutsuja, admin-näkymiä, REST-endpointteja, cron-logiikkaa ja custom database -rakenteita, pelkkä proseduraalinen PHP ei enää skaalaudu hyvin.

Tiivistelmä
OOP-rakenteen tavoite

Hyvä pluginarkkitehtuuri erottaa:...

Bootstrap-tiedosto

Pluginin pääentrypoint:...

Namespacejen käyttö

Erittäin tärkeää WordPressissä....

Composer autoloading

Composer mahdollistaa PSR-4-rakenteen....

Core Plugin class

Yksi keskitetty bootstrap-luokka....

Service layer

Erota logiikka palveluluokkiin....

Dependency Injection

Älä luo kaikkea suoraan luokan sisällä....

Hookien organisointi

Älä rekisteröi hookeja satunnaisesti....

Admin ja frontend erilleen

Tyypillinen rakenne:...

REST API controllerit

Erota endpointit omiin luokkiin....

Database layer

Älä kirjoita SQL:ää kaikkialle....

Repository pattern

Hyödyllinen isoissa plugineissa....

Config-luokat

Asetukset yhteen paikkaan....

Singleton vai ei?

Monet WordPress-pluginit käyttävät singletonia:...

Traitit WordPressissä

Traitteja voi käyttää yhteiseen logiikkaan....

Activation ja uninstall classes

Pidä lifecycle-operaatiot erillään....

Testing OOP-rakenteessa

OOP mahdollistaa:...

SOLID-periaatteet WordPressissä

Hyvä plugin noudattaa:...

Event-driven ajattelu

Voit rakentaa oman event layerin:...

Asset management

Pidä assetit hallittuna:...

Yleisimmät virheet

Skaalautuva WordPress-plugin sisältää:...

Hyvä OOP-arkkitehtuuri

Skaalautuva WordPress-plugin sisältää:...

Yhteenveto

Object-oriented plugin-rakenne tekee WordPress-kehityksestä huomattavasti hallittavampaa erityisesti isoissa projekteissa. Kun logiikka erotellaan palveluihin, controller-luokkiin ja repository-kerroksiin, pluginista tulee helpompi ylläpitää, testata ja laajentaa....

Object-oriented plugin-rakenne tuo WordPress-kehitykseen samanlaisen arkkitehtuurin kuin moderneissa ohjelmistoprojekteissa:

  • selkeä vastuunjako
  • helpompi testattavuus
  • parempi ylläpidettävyys
  • modulaarinen rakenne
  • skaalautuva kehitysmalli

Miksi procedural WordPress-koodi hajoaa nopeasti

Tyypillinen ongelma:

function my_plugin_save() {}
function my_plugin_api() {}
function my_plugin_admin() {}

Kun plugin kasvaa:

  • hookit lisääntyvät
  • tiedostot paisuvat
  • globaalit funktiot törmäävät
  • logiikka sekoittuu

Tuloksena on vaikeasti debugattava järjestelmä.

OOP-rakenteen tavoite

Hyvä pluginarkkitehtuuri erottaa:

  • bootstrap
  • palveluluokat
  • business logic
  • API-kerrokset
  • admin-logiikan
  • frontendin
  • database layerin

Hyvä plugin-rakenne

Esimerkki:

my-plugin/
├── my-plugin.php
├── src/
│   ├── Core/
│   ├── Admin/
│   ├── Api/
│   ├── Database/
│   ├── Services/
│   └── Frontend/
├── vendor/
├── composer.json
└── assets/

Tämä muistuttaa modernia PHP-sovellusta.

Bootstrap-tiedosto

Pluginin pääentrypoint:

<?php

/**
 * Plugin Name: My Plugin
 */

require_once __DIR__ . '/vendor/autoload.php';

use MyPlugin\Core\Plugin;

(new Plugin())->boot();

Tämä pitää bootstrapin erittäin kevyenä.

Namespacejen käyttö

Erittäin tärkeää WordPressissä.

namespace MyPlugin\Services;

class ApiService {

}

Hyödyt:

  • ei funktiokonflikteja
  • selkeä rakenne
  • moderni autoloading

Composer autoloading

Composer mahdollistaa PSR-4-rakenteen.

{
  "autoload": {
    "psr-4": {
      "MyPlugin\\": "src/"
    }
  }
}

Sitten:

composer dump-autoload

Core Plugin class

Yksi keskitetty bootstrap-luokka.

namespace MyPlugin\Core;

class Plugin {

    public function boot() {

        $this->register_hooks();
    }

    protected function register_hooks() {

        add_action('init', [$this, 'init']);
    }

    public function init() {

    }
}

Service layer

Erota logiikka palveluluokkiin.

namespace MyPlugin\Services;

class EmailService {

    public function send($to, $message) {

        wp_mail($to, 'Subject', $message);
    }
}

Dependency Injection

Älä luo kaikkea suoraan luokan sisällä.

Huono:

$mailer = new EmailService();

Parempi:

class UserController {

    public function __construct(
        protected EmailService $mailer
    ) {}
}

Hookien organisointi

Älä rekisteröi hookeja satunnaisesti.

Parempi:

class Hooks {

    public function register() {

        add_action('init', [$this, 'init']);
        add_action('admin_menu', [$this, 'menu']);
    }
}

Admin ja frontend erilleen

Tyypillinen rakenne:

src/Admin/
src/Frontend/

Bootstrap:

if (is_admin()) {
    new AdminManager();
} else {
    new FrontendManager();
}

REST API controllerit

Erota endpointit omiin luokkiin.

namespace MyPlugin\Api;

class UserEndpoint {

    public function register() {

        register_rest_route(...);
    }
}

Database layer

Älä kirjoita SQL:ää kaikkialle.

namespace MyPlugin\Database;

class UserRepository {

    public function find($id) {

    }
}

Tämä keskittää queryt yhteen paikkaan.

Repository pattern

Hyödyllinen isoissa plugineissa.

Esimerkki:

$user = $repository->findByEmail($email);

Ei:

$wpdb->get_results(...)

kaikkialla projektissa.

Config-luokat

Asetukset yhteen paikkaan.

class Config {

    public static function apiUrl() {

        return get_option('api_url');
    }
}

Singleton vai ei?

Monet WordPress-pluginit käyttävät singletonia:

class Plugin {

    private static $instance;
}

Nykyään dependency injection on usein parempi vaihtoehto.

Traitit WordPressissä

Traitteja voi käyttää yhteiseen logiikkaan.

trait LoggerTrait {

    public function log($message) {

    }
}

Mutta niitä ei pidä käyttää liikaa.

Activation ja uninstall classes

Pidä lifecycle-operaatiot erillään.

class Installer {

    public function run() {

    }
}
register_activation_hook(__FILE__, [Installer::class, 'run']);

Testing OOP-rakenteessa

OOP mahdollistaa:

  • unit testing
  • mocking
  • dependency injection testing

Tämä on lähes mahdotonta procedural spaghetti-koodissa.

SOLID-periaatteet WordPressissä

Hyvä plugin noudattaa:

  • Single Responsibility
  • Open/Closed
  • Dependency Inversion

Esimerkiksi:

  • yksi luokka = yksi vastuualue

Event-driven ajattelu

Voit rakentaa oman event layerin:

do_action('myplugin_order_processed');

Tämä tekee pluginista laajennettavan.

Asset management

Pidä assetit hallittuna:

assets/
├── js/
├── css/

Ja enqueue omassa luokassaan.

Yleisimmät virheet

  • kaikki yhdessä luokassa
  • massiivinen singleton
  • ei namespaceja
  • SQL kaikkialla
  • hookit satunnaisesti
  • business logic templateissa
  • ei dependency injectionia

Hyvä OOP-arkkitehtuuri

Skaalautuva WordPress-plugin sisältää:

  • Composer autoloading
  • namespace-rakenne
  • service layer
  • repository pattern
  • REST controllerit
  • dependency injection
  • modulaarinen rakenne
  • erillinen admin/frontend

Yhteenveto

Object-oriented plugin-rakenne tekee WordPress-kehityksestä huomattavasti hallittavampaa erityisesti isoissa projekteissa. Kun logiikka erotellaan palveluihin, controller-luokkiin ja repository-kerroksiin, pluginista tulee helpompi ylläpitää, testata ja laajentaa.

Moderni WordPress-kehitys muistuttaa yhä enemmän muuta PHP-sovelluskehitystä, joten Composer, namespace-rakenne ja OOP-ajattelu ovat käytännössä välttämättömiä pitkäikäisissä plugineissa.

🍪