Come creare un plugin per WordPress

wordpress logo at davidonzo.comOggi vediamo un po’ come creare un plugin per WordPress. Succede spesso che mi si chiede di apportare modifiche e personalizzazioni a plugin esistenti e d’altra parte capita anche ce ci sia gente che usa un plugin molto articolato e pesante per modifiche del tutto banali e che non giustificherebbero un appesantimento del software.

L’utilizzo dei plugin aiuta ad astrarre determinate funzioni dal core di wordpress e permette di non dover modificare intensivamente il template per attivare / disattivare certe funzionalità.

Sono sempre stato contrario ad un utilizzo intensivo dei plugin. In parole povere, chi si va vantando di usare 50 e oltre plugin per wordpress, secondo me ha semplicemente sbagliato piattaforma 🙂 . Ma proprio per evitare queste eventualità, vediamo ora come si progetta un plugin per la più famosa piattaforma di blogging aiutandoci con un esempio passo passo. Alla fine otterremo un plugin che permette di aggiungere un testo arbitrario all’inizio di ogni post (un plugin inutile, ma con chiaro scopo didattico).

Fasi Preliminari

Come prima cosa, bisogna avere una conoscenza capillare delle funzioni messe a disposizione da WordPress. Per cui leggetevi per bene la documentazione ed avrete appreso più della metà di quello ce c’è bisogno di sapere.

Altra cosa fondamentale da sapere è come WordPress decide quali sono i plugin attivi. Le informazioni a tal proposito sono salvate nel database, ed esattamente nella tabella wp_opstions (dove wp_ è il table prefix) in corrispondenza della option_name = ‘active_plugins’.

Tutti i plugin sono contenuti nella directory /wp-content/plugins/.

[MORE] 

Cominciamo a Scrivere

Con il nostro editor di testo preferito creiamo un nuovo file, chiamato myplugin.php. Nelle primissime righe del file dobbiamo inserire delle linee di commento che verranno poi lette da wordpress al fine di identificare il plugin come tale e poterne importare le info relative alla versione, descrizione e autore.

<?php
/*
Plugin Name: Just a test plugin
Plugin URI: http://www.davidonzo.com/
Description: Just a simple plugin to show how wordpress plugins work and can be create.
Author: davidonzo
Version: 0.1
Author URI: http://www.davidonzo.com/
*/

  • Plugin Name: il nome del plugin.
  • Plugin URI: il link all’articolo che spiaga il funzionamento del plugin.
  • Description: una descrizione breve, scritta tutta su una riga.
  • Author: nome dell’autore.
  • Version: il numero di versione.
  • Author URI: il link dell’autore del plugin.

Tutte queste informazioni verranno poi mostrate nella pagina di gestione plugins del pannello di controllo di wordpress.

Le funzioni necessarie

Adesso dobbiamo pensare a cosa ci serve per far funzionare il plugin. Ripeto, stiamo pensando ad un plugin che mostrerà un testo arbitrario, scelto dall’utente, ad inizio di ogni post. Quindi ci serve un’opzione in cui salveremo la frase da mostrare, ed anche un’opzione per attivare / disattivare la visualizzazione.

Per semplificarci la vita sceglieremo di usare un solo recordi in cui includeremo le due informazioni necessarie. Le divideremo da simboli arbitrari (nell’esempio %%%) che ci permetteranno un explode sulla stringa.

A questo punto dobbiamo conoscere la struttura del database di wordpress. Le opzioni dei plugin vengono salvate sempre nella tabella wp_options. Possiamo creare una nuova opzione con la funziona add_option. Il valore attribuito verrà sempre salvato in un campo di tipo longtext.

In fase di installo aggiungeremo l’opzione necessaria dandogli dei valori di default. Vediamo come.

function myplugin_install(){
  if(get_option(‘opt_myplugin’ == ”) || !get_option(‘opt_myplugin’)){
    add_option(‘opt_myplugin’, ‘0%%%Write some text’);
  }
}

if (isset($_GET[‘activate’]) && $_GET[‘activate’] == ‘true’) {
    myplugin_install();
}

All’attivazione del plugin, se l’opzione opt_myplugin (nome che abbiamo scelto noi di dare) non esiste o se esiste, ma vuota allora viene aggiunta l’opzione al database. Questa funzione viene eseguita al momento dell’installazione del plugin.

Per come è scritta la funzione di installo, questa si eseguirà solo alla prima attivazione. Disattivando il plugin infatto le opzioni resteranno inalterate.

Pensiamo subito alla funzione per leggere le opzioni dal database, e nel nostro caso, estrarre le informazioni sensibili.

function myplugin_option($opt){
  $opt_myplugin = get_option(‘opt_myplugin’);
  $opt_myplugin = explode(‘%%%’, $opt_myplugin);
 
  switch($opt){
    case ‘active’:
      return $opt_myplugin[0];
    break;
   
    case ‘text’:
      return $opt_myplugin[1];
    break;
  }
}

La funzione get_option() fornita da wordpress ci fa estrarre in modo facile i dati dalla tabella wp_options. Tutto il resto è in funzione della nostra modalità di storing delle informazioni. Avremmo anche potuto pensare a due record per gestire separatamente i dati, ma in questo modo risparmiamo spazio di database, facendo fede ad una delle prime frasi scritte nel manuale di mysql: "make your data smaller as possibile".

Adesso ci serve una pagina all’interno del pannello di controllo per gestire le opzioni. Per prima cosa aggiungiamo un link alla finestra settings nel pannello di controllo. Anche in questo caso ci aiuta una funzione del core di wordpress.

function myplugin_config_page(){
  if (function_exists(‘add_options_page’)){
    add_options_page(‘MyPlugin Menu Title’,
                     ‘MyPlugin Option’,
                     8,
                     basename(__FILE__),
                     ‘myplugin_config’
                     );
  }
}

La funzione add_options_page necessita di alcune opzioni:

  • Il titolo della pagina di destinazione.
  • L’ancora del link che apparirà nella pagina dei settings.
  • Il livello necessario per accedervi.
  • Il file da caricare.
  • La funzione, inserita all’interno del file da caricare, da eseguire.

Ed ora vediamo la funzione che si occupa di visualizzare il pannello di controllo.

function myplugin_config(){
  $active   = (myplugin_option(‘active’) == 1) ? ‘checked’ : ”;
  $deactive = (myplugin_option(‘active’) == 0) ? ‘checked’ : ”;
  print(‘<div class="wrap">
         <h2>MyPlugin Options Tab</h2>
          <form id="ak_sharethis" name="myplugin_cnf" action="’.get_bloginfo(‘wpurl’).’/wp-admin/index.php" method="post">
            <p>By this page it\’s possibile configure the plugin. Setup the following options to start testing how a wordpress plugin works!</p>
           <fieldset class="options">
            <p>Show some content before any post?</p>
               <ul>
                 <li>
                   <input type="radio" name="c_before_post" value="1" id="c_before_post_yes" ‘.$active.’ />
                     <label for="c_before_post_yes">Yes</label>
                 </li>
                
                 <li>
                   <input type="radio" name="c_before_post" value="0" id="c_before_post_no" ‘.$deactive.’ />
                     <label for="c_before_post_no">No</label>
                 </li>
               </ul>
              
               <p>Type the contet text to show:</p>
                 <input type="text" name="c_text_myplugin" value="’.myplugin_option(‘text’).’" /> 
            </fieldset>
           <p class="submit">
        <input type="submit" name="myplugin_submit_button" value="Update Settings" />
       </p>
      </form>
         </div>’);
}

Ne più ne meno che tanto html. Un form con cui gestiamo le poche opzioni di questo plugin. Ma non è tutto. Perchè se possiamo modificare le opzioni dalla pagina costruita dalla funzione precedente, è anche necessario avere una funzione che ci permetta di aggiornare le opzioni. Eccola:

function update_myplugin_settings(){
  if($_POST[‘myplugin_submit_button’] == ‘Update Settings’){
    $newsetting = $_POST[‘c_before_post’] . ‘%%%’ . $_POST[‘c_text_myplugin’];
    update_option(‘opt_myplugin’,$newsetting);
    header(‘Location: ‘.get_bloginfo(‘wpurl’).’/wp-admin/options-general.php?page=myplugin.php&updated=true’); 
  }
}

Si noti l’uso di update_option, che ci permette di aggiornare facilmente una particolare opzione inclusa nella tabella wp_options del database di wordpress.

Per fare eseguire tale funzione usiamo add_action(). Altro strumento messo a disposizione dal core di wordpress.

add_action(‘init’, ‘update_myplugin_settings’, 9999);

Aggiunta in questo modo, con il tag init ed una priorità (9999) molto alta, l’azione verrà eseguita ad ogni caricamento del plugin. Ma questo non vuol dire che ad ogni caricamento del file myplugin.php le opzioni verranno aggiornate. Guardate la funzione update_myplugin_settings(). Invia la query al database solo se riceve i dati in post.

Ora abbiamo tutto. Pannello di controllo, possibilità di aggiornare le opzioni, pagina di configurazione. Ma ci siamo dimenticati di pensare all’output di front end? Ma ovviamente no 🙂

Questa è sicuramente la parte più facile. Si pensi solo ad una funzione che riscriva la variabile $content.

function add_myplugin_text_to_content($content){
  if(myplugin_option(‘active’) == 1){
   $content = ‘<p>’.myplugin_option(‘text’).'</p>’ . $content;
  }
  return $content;
}

add_action(‘the_content’, ‘add_myplugin_text_to_content’);

Facile no? E da ora, tutte le volte che volete aggiungere una riga o un’immagine da qualche parte, non andate a caricare quei pesantissimi plugin che saranno ottimi per chi li usa almeno all’80%, ma sono semplicemente un peso per chi non li sfrutta, ed una tortura per chi naviga i vostri blog.

Volete scaricare il plugin di esempio? E qui per voi!

8 thoughts on “Come creare un plugin per WordPress”

  1. Riporto la guida nel mio NewsPortal, naturalmente con i dovuti credits.
    In caso di problemi contattatemi, e provvedero' alla rimozione.
    Buona continuazione
    WebDataBank

  2. Grazie.
    Hai citato un esempio che faceva al caso mio.
    Inoltre la tua guida risulta per me molto chiara.
    Ti ringrazio tanto!

    Saluti, Quadrrato

  3. Grazie per il lavoro che hai fatto ho due domande?

    1. questa procedura e quelle porzioni di codice vanno bene per le recenti versioni di Wp?

    2. Vorrei inserire in Wp uno dei plugin Java che si trovano in giro come –w.flowslider.com/for-developers/setup-html–
    o altri.
    Come posso farlo, hai qualche consiglio?
    grazie

Comments are closed.