Minimum Plugin

English Language

Un esempio di plugin per WordPress.

Minimum Plugin è un piccolo plugin, utile ai novizi di WordPress che abbiano intenzione di scrivere un plugin o personalizzare molto il loro sito.

Il mio augurio è che questo articolo gli permetta di risparmiare un po’ del tempo necessario a familiarizzare con WordPress.

MinimumPlugin è composto da un file singolo ( MinimumPlugin.php ).

Contiene una pagina amministrativa con un form per 3 campi di input.

È previsto uno shortcode [ MinimumPlugin ] da inserire in una pagina di frontend.

La quantità di codice è contenuta allo stretto indispensabile.

Che cosa fa Minimum Plugin? Ebbene, visualizza un Conto alla Rovescia.

Le regole di WordPress prevedono che il file principale MinimumPlugin.php inizi con una descrizione, l’header.
Riferimenti:
Basic Header

/*
 Plugin Name: Minimum Plugin
 Plugin URI: https://wpd.edilweb.eu
 Description: This is an example plugin for beginners. It is very small, it displays a countdown.
 Version: 1.0.0
 Author: wpd.edilweb.eu
 Author URI: https://wpd.edilweb.eu
 License: GPL-2
 License URI: http://www.gnu.org/licenses/gpl-2.0.txt
 Text Domain: MinimumPlugin
 Domain Path: /languages
 */

Poi si aggiunge una precauzione per evitare che il file venga chiamato fuori dall’ambiente WordPress

if ( !defined( 'ABSPATH' )) { exit; }

Una funzione activate per attivare Minimum Plugin.
Riferimenti:
Activate

function activate_MinimumPlugin() {}

Una funzione deactivate per disattivare Minimum Plugin.
Riferimenti:
Deactivate

function deactivate_MinimumPlugin(){}

Una funzione per richiamare TextDomain che nel nostro caso è uguale al nome del plugin . La funzione è necessaria per localizzare il plugin.
Riferimenti:
load text domain

function textDomain_MinimumPlugin() {
     global $pP;
     load_plugin_textdomain( $pP->plugin_name );
 }
donna in piedi

Registriamo in WordPress una funzione che punta alla nostra funzione di convalida del form amministrativo, register_setting_MinimumPlugin()
Riferimenti alla pagina amministrativa:
Register Setting

function register_setting_MinimumPlugin() {
      global $pP;
      register_setting( $pP->plugin_name, $pP->plugin_name,
'validate_settings_MinimumPlugin' );
  }

Adesso vanno impostati i link alla pagina amministrativa.
Come altre funzioni che scriviamo anche queste hanno bisogno di un “hook” di WordPress, un aggancio al CMS. Nella sezione Main Code del file dopo le dichiarazioni di funzione, ci sono i richiami agli “hook” di WordPress.
Le prossime due funzioni fanno comparire il link settings del plugin nei Plugin installati ed il link MinimumPlugin nelle Impostazioni.
Riferimenti:
Options Page
Hook WP

function add_filter_link_MinimumPlugin( $links ) {
    $mylinks = array( '<a href="' 
    . admin_url( 'options-general.php?page=' 
    . plugin_basename(_FILE_) ) . '">Settings>/a' );

    return array_merge( $links, $mylinks );
}

function add_options_page_MinimumPlugin(){
     global $pP;
     $page_title = $pP->plugin_name;
     $menu_title = $pP->plugin_name;
     $capability = 'manage_options';
     $menu_slug = plugin_basename(_FILE_); 
     if( $pP->cheForm === 'simple' ){
         $function = 'display_setup_MinimumPlugin';
     }
     elseif ( $pP->cheForm === 'complex' ) {
          $function = 'display_setup2_MinimumPlugin';
     }    
    add_options_page( $page_title, $menu_title, $capability, $menu_slug, $function );
 }

Dopo la dichiarazione, la pagina amministrativa viene resa disponibile per WordPress con la funzione display_setup2_MinimumPlugin() .
Dentro c’è tutto l’html amministrativo, ma prima bisogna accedere ai dati archiviati nel database che riguardano questo plugin, nella tabella #_options .
Lo facciamo mediante la funzione di WordPress get_option( $var ) .
Le Options amministrative dei plugin vengono archiviate in questa tabella ( #_options ), per default e sono già presenti nel database a questo punto dell’esecuzione.
Le opzioni iniziali di Minimum Plugin vengono impostate una volta soltanto, nella sezione Main Code di questo file.
Riferimenti alla tabella e al database:
Database


L’ Url del form è ancora uno dei servizi di WordPress, la funzione admin_url()
Riferimenti:
admin url


È necessario aggiungere al form alcuni campi di controllo e sicurezza.
Funzione di WordPress settings_fields( $arg );
Riferimenti:
Nonce


I campi di input del form amministrativo di Minimum Plugin, che in questo caso invia al server un array con tre valori, sono simili a questi:

<td>
  <input 
    type="text" 
    name="<?php echo $plugin_option; ?>[mpTxt]" 
<!-- name_of_the_option[key_option] --> 
    id="mp_txt" 
    title="Countdown event" 
    value="<?php echo $db_options['mpTxt']; ?>" 
<!-- value of the option from database -->
    required>
</td>

Il pulsante di submit del form si ottiene dalla funzione di WordPress submit_button();

display_setup2_MinimumPlugin() La funzione
function display_setup2_MinimumPlugin(){
     global $pP;
     $url = admin_url( 'options.php' );
     $db_options = get_option( $pP->plugin_name );
 /*  translations    */
$cEvent = __( 'Countdown event', 'MinimumPlugin' ); 
$cDate = __( 'Countdown departure date', 'MinimumPlugin' ); 
$cDini = __( 'Countdown start', 'MinimumPlugin' );
$cTime = __( 'Countdown start time', 'MinimumPlugin' );
$cTini = __( 'Time start', 'MinimumPlugin' );

$toBw = <<<EOF
<div class="wrap">
<h1>Minimum Plugin Settings</h1>
<form action="{$url}" method="post" 
id="MinimumPlugin-form">
EOF;
     echo $toBw;

     settings_fields( $pP->plugin_name );

$toBw2 = <<<BW2
<table class="form-table">
<tbody>
<tr>
<th scope="row">
<label for="mp_txt">Your Event </label>
</th>
<td>
<input type="text" name="{$pP->plugin_name}[mpTxt]" 
id="mp_txt" title="{$cEvent}" 
value="{$db_options['mpTxt']}" required>
</td>
</tr>
<tr>
<th scope="row">
<label for="mp_Data">{$cDate} </label>
</th>
<td>
<input type="date" name="{$pP->plugin_name}[mpData]" 
id="mp_Data"  title="{$cDini}" 
value="{$db_options['mpData']}" required>
</td>
</tr>
<tr>
<th scope="row">
<label for="mp_Time">{$cTime} </label>
</th>
<td>
<input type="time" name="{$pP->plugin_name}[mpTime]" 
id="mp_Time"  title="{$cTini}" 
value="{$db_options['mpTime']}" 
required>
</td>
</tr>
</tbody>
</table>
BW2;
echo $toBw2; 

submit_button();

$toBw3 = <<<BW3
     </form>
 </div>
 BW3;
 echo $toBw3;
}

 

Gli input del form vengono convalidati prima che siano registrati nel database. Funzione validate_settings_MinimumPlugin( $input )

function validate_settings_MinimumPlugin( $input ){
     /*  here the code to validate form     */    
     global $pP; 
if( $pP->cheForm === 'simple' ){ /*  single option  1 field */ 
  $valid = sanitize_text_field( $input );
}
elseif ( $pP->cheForm === 'complex' ) { /*  3 fields    */     
 $valid = []; 
$valid[ 'mpTxt' ] = sanitize_text_field( $input[ 'mpTxt' ]);
$valid[ 'mpData' ] = sanitize_text_field( $input[ 'mpData' ]);
$valid[ 'mpTime' ] = sanitize_text_field( $input[ 'mpTime' ]);
} 
else {
die('error');
}
return $valid;
}

Esaurite le funzioni amministrative registriamo in WordPress una funzione che segnala la presenza eventuale di uno shortcode , shortcodes_MinimumPlugin_init() .
Riferimenti:
Shortcode

function shortcodes_MinimumPlugin_init(){
     global $pP;
     add_shortcode($pP->shortcode,
'shortcodes_MinimumPlugin_exec');
 }

Aggiungiamo una funzione per l’esecuzione dello shortcode nel front-end. shortcodes_MinimumPlugin_exec()

Funzione shortcodes_MinimumPlugin_exec()
function shortcodes_MinimumPlugin_exec(){
 global $pP;
 $db_options = get_option( $pP->plugin_name );
   switch ($pP->cheForm) {
    case 'complex':   /* Here $db_options is an array */
$a = <<<EOF
<p style="font-size: 20px; margin-bottom: 0;">{$db_options['mpTxt']}<br>{$db_options['mpData']}   time {$db_options['mpTime']}<br><br>Time to end:</p>
<p style="height: 50px; font-size: 30px; margin-top: 0px;" id="idMinPlug"></p>
<script>
var dateFromDb = '{$db_options['mpData']}', timeFromDb = '{$db_options['mpTime']}';var countDownDate = new Date( dateFromDb + ' ' + timeFromDb ).getTime();
var xMinimumPlugin = setInterval(function () {var now = new Date().getTime();var distance = countDownDate - now;if (distance > 0) {var days = Math.floor(distance / (1000 * 60 * 60 * 24));var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));var seconds = Math.floor((distance % (1000 * 60)) / 1000);idMinPlug.innerHTML = days + "d - " + hours + "h - " + minutes + "m : " + seconds + "s ";} else {clearInterval(xMinimumPlugin);idMinPlug.innerHTML = "EXPIRED";}}, 1000);
</script>
EOF;
   break;
   case 'simple':  /*  Here $db_options is a simple variable   */
$a = <<<EOF
<p style="font-size: 20px; margin-bottom: 0;">Countdown start: <br>day {$db_options}   <br><span style="font-size: 13px;">Time to end:</span></p>
<p style="height: 50px; font-size: 30px; margin-top: 0px;" id="idMinPlug"></p>
<script>
var dateFromDb = '{$db_options}', timeFromDb = '00:00';var countDownDate = new Date( dateFromDb + ' ' + timeFromDb ).getTime();
var xMinimumPlugin = setInterval(function () {var now = new Date().getTime();var distance = countDownDate - now;if (distance > 0) {var days = Math.floor(distance / (1000 * 60 * 60 * 24));var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));var seconds = Math.floor((distance % (1000 * 60)) / 1000);idMinPlug.innerHTML = days + "d - " + hours + "h - " + minutes + "m : " + seconds + "s ";} else {clearInterval(xMinimumPlugin);idMinPlug.innerHTML = "EXPIRED";}}, 1000);
</script>
EOF;
    break;

   default:
     $a = 'error "shortcodes_MinimumPlugin_exec"';
     break;
    }
    
    return $a;
}

 

Composizione_spaziale_Katarzyna_Kobro


A questo punto dobbiamo eseguire le funzioni dichiarate prima.
Attivazione e deattivazione del plugin :
Riferimenti:
Attiva hook

$pP = new stdClass;
$pP->plugin_name = 'MinimumPlugin';
$pP->version = '1.0.0';
//  $pP->cheForm = 'simple';        /*  simple = form admin with one field */
$pP->cheForm = 'complex';           /*  complex = form admin with more than one field    */
$pP->shortcode = 'MinimumPlugin';
register_activation_hook( __FILE__, 'activate_MinimumPlugin' );
register_deactivation_hook( __FILE__, 'deactivate_MinimumPlugin' );


Agganci delle funzioni ad azioni specifiche
Riferimenti:
Action Reference
add action/

add_action( 'plugins_loaded', 'textDomain_MinimumPlugin' );
add_action('init', 'shortcodes_MinimumPlugin_init');
add_action( 'admin_init', 'register_setting_MinimumPlugin' );
add_action( 'admin_menu', 'add_options_page_MinimumPlugin' ); 

Aggancio di una funzione ad uno specifico filtro di WordPress.
Riferimenti:
action links

add_filter( 'plugin_action_links_'.
 plugin_basename(__FILE__),
 'add_filter_link_MinimumPlugin' ); 

Per ultimo c’è l’inserimento nel database delle opzioni amministrative iniziali. Questo blocco viene eseguito una volta soltanto.

if( false == get_option( $pP->plugin_name )){
    if( $pP->cheForm === 'simple' ){  /*  single option  1 field */
        add_option($pP->plugin_name, '2020-12-25' );
    }
    elseif ( $pP->cheForm === 'complex' ) { /*  3 fields    */
        $ppIniVal = [ 'mpTxt' => 'Wedding Anniversary', 
                'mpData' => '2020-12-25', 'mpTime' => '00:00' ];
        add_option( $pP->plugin_name, ( array )$ppIniVal );
    }
    else { die('error'); }
} 

Minimum Plugin Example

Italian elections day
2022-09-25  time 23:01

Waiting Time:

Test Ajax FrontEnd



Scarica il plugin. Si installa e attiva come gli altri.

DownLoad MinimumPlugin 2.1.0