Vai al contenuto

Plugin base: differenze tra le versioni

Da Wiki Marco Cerutti.
Nessun oggetto della modifica
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 39: Riga 39:
=== my-plugin.php – File di bootstrap ===
=== my-plugin.php – File di bootstrap ===


Avvia il plugin caricando la classe Plugin.
File principale.
* Avvia il plugin  
* Caricando la classe Plugin


<pre>
<pre>
require_once plugin_dir_path(__FILE__) . 'includes/Core/Plugin.php';
defined('ABSPATH') || exit;


function run_my_plugin() {
// Autoload minimale per le classi del namespace MyCity\
     $plugin = new MyPlugin\Core\Plugin();
spl_autoload_register(function ($class) {
    // Considera solo le classi del tuo namespace
    if (strpos($class, 'MyPlugin\\') !== 0) {
        return;
    }
 
    // Converte il namespace in percorso file dentro /includes
    $relative = str_replace(['MyPlugin\\', '\\'], ['', '/'], $class) . '.php';
    $path = plugin_dir_path(__FILE__) . 'includes/' . $relative;
 
    if (file_exists($path)) {
        require_once $path;
    }
});
 
// Avvio del plugin quando WP ha caricato i plugin
add_action('plugins_loaded', function () {
    // Ora l'autoloader è attivo: non serve richiedere Plugin.php a mano
     $plugin = new \MyPlugin\Core\Plugin();
     $plugin->run();
     $plugin->run();
}
});
 
run_my_plugin();


</pre>
</pre>
Riga 58: Riga 76:


<pre>
<pre>
namespace MyPlugin\Core;
class Plugin {
class Plugin {
     public function run() {
     public function run() {
Riga 64: Riga 84:
     }
     }
}
}
</pre>


</pre>
=== Loader.php –  ===


=== Loader.php – Inizializzazione dei moduli ===
Gestione hook e azioni.


<pre>
<pre>
namespace MyPlugin\Core;
class Loader {
class Loader {
     public function init() {
     public function init() {
Riga 91: Riga 114:
* gli shortcode e gli script se sei nel frontend
* gli shortcode e gli script se sei nel frontend
* sempre la REST API e l’AJAX handler
* sempre la REST API e l’AJAX handler


=== SettingsPage.php – Menu nel pannello admin ===
=== SettingsPage.php – Menu nel pannello admin ===

Versione attuale delle 17:00, 15 ago 2025

Info

[modifica]

Struttura modulare, basata su classi, con il supporto integrato per REST API e AJAX.

my-plugin/
│
├── my-plugin.php                 # File principale del plugin
├── uninstall.php                # Disinstallazione pulita
│
├── includes/
│   ├── Core/
│   │   ├── Plugin.php           # Classe principale che avvia il plugin
│   │   └── Loader.php           # Classe che carica tutte le componenti
│   │
│   ├── Admin/
│   │   └── SettingsPage.php     # Pannello admin nel backend
│   │
│   ├── Frontend/
│   │   └── ShortcodeHandler.php # Gestione shortcode e risorse frontend
│   │
│   ├── Api/
│   │   └── RestRoutes.php       # Definizione di una rotta REST API
│   │
│   └── Ajax/
│       └── AjaxHandler.php      # Gestione delle chiamate AJAX
│
├── assets/
│   ├── css/
│   ├── js/
│   └── images/
│
└── templates/
    └── admin-settings.php       # HTML della pagina di impostazioni admin

LOGICA DEL PLUGIN

[modifica]

my-plugin.php – File di bootstrap

[modifica]

File principale.

  • Avvia il plugin
  • Caricando la classe Plugin
defined('ABSPATH') || exit;

// Autoload minimale per le classi del namespace MyCity\
spl_autoload_register(function ($class) {
    // Considera solo le classi del tuo namespace
    if (strpos($class, 'MyPlugin\\') !== 0) {
        return;
    }

    // Converte il namespace in percorso file dentro /includes
    $relative = str_replace(['MyPlugin\\', '\\'], ['', '/'], $class) . '.php';
    $path = plugin_dir_path(__FILE__) . 'includes/' . $relative;

    if (file_exists($path)) {
        require_once $path;
    }
});

// Avvio del plugin quando WP ha caricato i plugin
add_action('plugins_loaded', function () {
    // Ora l'autoloader è attivo: non serve richiedere Plugin.php a mano
    $plugin = new \MyPlugin\Core\Plugin();
    $plugin->run();
});

Plugin.php – Punto di ingresso OOP

[modifica]

Crea una nuova istanza del Loader, che inizializza tutte le funzionalità.

namespace MyPlugin\Core;

class Plugin {
    public function run() {
        $loader = new Loader();
        $loader->init();
    }
}

Loader.php –

[modifica]

Gestione hook e azioni.

namespace MyPlugin\Core;

class Loader {
    public function init() {
        if (is_admin()) {
            (new \MyPlugin\Admin\SettingsPage())->register();
        } else {
            (new \MyPlugin\Frontend\ShortcodeHandler())->register();
        }

        // Extra
        (new \MyPlugin\Api\RestRoutes())->register();
        (new \MyPlugin\Ajax\AjaxHandler())->register();
    }
}

Carica:

  • la pagina admin se sei nel backend
  • gli shortcode e gli script se sei nel frontend
  • sempre la REST API e l’AJAX handler

SettingsPage.php – Menu nel pannello admin

[modifica]

Aggiunge un menu personalizzato in Impostazioni > Il Mio Plugin.

ShortcodeHandler.php – Gestione frontend

[modifica]
  • Registra uno shortcode [my_shortcode]
  • Carica un file CSS dal plugin
  • Ritorna un blocco HTML nel contenuto del post

REST API – RestRoutes.php

[modifica]

Rotta

GET /wp-json/myplugin/v1/hello

Risposta

{ "message": "Ciao dal plugin!" }

Codice

register_rest_route('myplugin/v1', '/hello', [
    'methods' => 'GET',
    'callback' => [$this, 'handle_hello'],
    'permission_callback' => '__return_true'
]);

AJAX – AjaxHandler.php

[modifica]

Azioni registrate:

add_action('wp_ajax_myplugin_action', [$this, 'handle']);
add_action('wp_ajax_nopriv_myplugin_action', [$this, 'handle']);

JS (esempio per usarlo):

jQuery.post(
    myplugin_ajax.ajax_url,
    { action: 'myplugin_action' },
    function(response) {
        console.log(response.data.message);
    }
);

Puoi localizzare lo script con wp_localize_script() per passare ajax_url.

uninstall.php

[modifica]

Contiene il codice di disinstallazione.