<

Ajax

Ultima modifica: 1 Agosto 2026

Il wordpress gpci framework è dotato un sistema semplificato, configurabile e integrato con le altre funzionalità per consentire connessioni ajax verso il sito. Questa è un'alternativa al sistema ajax integrato in wordpress (che rimane sempre valido), è comunque utile sapere che tutti i sistemi interni al framework utilizzano il sistema ajax personalizzato.

Azioni ajax

Per eseguire un'azione ajax (esempio un pulsante per aggiornare un post) è necessario eseguire 2 operazioni:

  1. configurare l'azione tramite php (sul server bersaglio)
  2. generare il codice javascript tramite la conversione dinamica (azione ajax)

1. configurare un'azione tramite php

Per configurare un'azione tramite php è sufficiente aggiungerla alla configurazione $GLOBALS['gpci']['config']['php']['ajax']['action'], sarà un contenitore di arrays contenenti i seguenti parametri:

id

- tipo: stringa

Id univoco dell'azione, se ci sono id doppi sarà preso l'ultimo in modo da poter sovrascrivere i precedenti.

encryption

- tipo: array associativo - default: ['id'=>'default']

Cifratura dati in formato compatibile con la funzione php EncryptionAction, quindi:

  • deve contenere le chiavi cipher, secret_key e iv oppure id

conditions

- tipo: come le altre configurazioni

Eventuali condizioni da controllare per ritenere l'azione valida durante la generazione e il controllo.

method

- tipo: stringa - default: GET

Metodo della richiesta: GET o POST.

response_target

- tipo: stringa - default: this

Bersaglio della risposta (ossia dove verrà visualizzata). Può essere:

  • false (booleano): la risposta non sarà processata
  • this: la risposta sostituirà l'elemento che permettte di inviarla (esempio un pulsante)
  • alert: la risposta verrà visualizzata in un alert
  • console.log: la risposta sarà visualizzata in console sviluppatori
  • se nessuno dei precedenti si suppone che sia una query in formato css, quindi la risposta sarà visualizzata in tutti i bersagli querySelectorAll del valore. Solitamente in questo caso sarà sufficiente inserire un tag unico nella pagina o un #id

max_duration

- tipo: numero intero - default: 86400 (ossia 24 ore)

Tempo in secondi entro il quale sarà valida l'azione.

function

- tipo: funzione php anonima oppure nome funzione

Funzione php che dovrà ritornare la risposta come stringa.

custom

- tipo: array associativo - default: []

Eventuali argomenti aggiuntivi generati da php da passare alla richiesta. Tenere presente che a questi si aggiungeranno quelli eventualmente passati tramite l'argomento omonimo in conversione dinamica, quindi ognuno deve avere la chiave univoca (altrimenti l'ultimo sovrascriverà il primo). Inoltre è bene sapere che seguono tutti le stesse regole, quindi saranno soggetti a una conversione dinamica con parametro maybe_convert => true.

custom_javascript

- tipo: array associativo - default: []

Eventuali argomenti aggiuntivi generati da javascript (non saranno cifrati!) da passare alla richiesta. Come sopra tenere presente che a questi si aggiungeranno quelli eventualmente passati tramite l'argomento omonimo in conversione dinamica e seguono le stesse regole.

fields

- tipo: stringa/array di stringhe - default: []

Selettori css di contenitori di campi compilabili dall'utente, che saranno inviati al server (non saranno cifrati ne sanificati, quindi saranno da sanificare manualmente). Come sopra tenere presente che a questi si aggiungeranno quelli eventualmente passati tramite l'argomento omonimo in conversione dinamica e seguono le stesse regole.

confirm

- tipo: booleano - default: false

Se richiedere la conferma tramite alert prima di inviare.

confirm_text

- tipo: stringa/null - default: null

Testo personalizzato di un eventuale conferma (altrimenti sarà usato un testo predefinito).

javascript_after_response

- tipo: stringa/null - default: null

Eventuale funzione/proprietà javascript da risolvere (subito dopo aver processato il bersaglio della risposta) tramite la funzione javascript ResolveWindowProperty. Se funzione (caso più probabile) prenderà in ingresso il valore di ritorno della chiamata ajax.

2. generare il codice javascript

Il codice javascript necessario è generato automaticamente tramite la conversione dinamica (azione ajax) all'interno di un attributo html (come onclick o onload).

Note

Tutti i parametri php (sia predefiniti che personalizzati) sono crittografati tramite la funzione php EncryptionAction, inviati al launcher e decifrati. Se validi saranno filtrati dalle chiavi già utilizzate per le verifiche interne (come nonce, action e gpci-data-encrypted) e inseriti nella globale php $GLOBALS['gpci']['ajax']['current_args'] pronti per essere utilizzati. Se i dati non sono validi si suppone che ci sia stata una manomissione e non verrà eseguita alcuna operazione.

Esempi

//azione basilare inserita nel frontend in un attributo onclick
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'function' => function(){
    $args = $GLOBALS['gpci']['ajax']['current_args'];
    $post_id = $args['post_id'];
    //azioni php
    return 'Messaggio di ritorno';
  }
];
//stessa cosa di
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'method'           =>'GET',
  'response_target'  =>'this',
  'function'         =>function(){
    $args = $GLOBALS['gpci']['ajax']['current_args'];
    $post_id = $args['post_id'];
    //azioni php
    return 'Messaggio di ritorno';
  }
];

//stessa cosa ma con query personalizzata nel frontend
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione2',
  'method'=>'GET',
  'response_target'=>'#idelemento button',
  'function'=>function(){
    $args = $GLOBALS['gpci']['ajax']['current_args'];
    $post_id = $args['post_id'];
    //azioni php
    return 'Messaggio di ritorno';
  }
];

//stessa cosa ma la durata massima di sicurezza è settata a 15 minuti
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione2',
  'method'=>'GET',
  'response_target'=>'#idelemento button',
  'max_duration'=>900,
  'function'=>function(){
    $args = $GLOBALS['gpci']['ajax']['current_args'];
    $post_id = $args['post_id'];
    //azioni php
    return 'Messaggio di ritorno';
  }
];

//azione basilare con conferma e testo personalizzato
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'           => 'azione1',
  'confirm'      => true,
  'confirm_text' => 'Vuoi proseguire?',
  'function'     => 'nome_funzione'
];

//azione basilare con cifratura personalizzata
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'encryption' => [ 'cipher'=>'aes-128-cbc', 'secret_key'=>'stringa_16_caratteri', 'iv'=>'altra_stringa_16_caratteri' ],
  'function' => 'nome_funzione'
];
//stessa cosa di
$GLOBALS['gpci']['config']['php']['callback']['EncryptionAction'][] = [
  'id'          => 'id_cifratura',
  'cipher'      => 'aes-128-cbc',
  'secret_key'  => 'stringa_16_caratteri',
  'iv'          => 'altra_stringa_16_caratteri',
];
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'encryption' => [ 'id'=>'id_cifratura' ],
  'function' => 'nome_funzione'
];

//azione basilare ma generata solo se l'utente corrente è un'amministratore
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'conditions' => [ 'wp,current_user_can,administrator'=>'===true' ]
  'function' => 'nome_funzione'
];

//azione basilare con condizioni multiple
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'conditions' => [
    [ 'wp,current_user_can,administrator'=>'===true,===false', 'operator'=>'OR' ],
    [ 'value1'=>GetField( 'title' ), 'value2'=>'Titolo post', 'comparator'=>'!=' ],
    'operator'=>'AND'
  ],
  'function' => function(){ return 'Messaggio di ritorno'; }
];

//azione basilare con aggiunta di argomenti personalizzati php 
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'custom' => [
    'argomento1'=>'valore',
    'argomento2'=>[ 'valore1', 'valore2' ],
    'argomento3'=>'wp,title,1000',  //conversione dinamica
    'argomento4'=>[ 'type'=>'wp', 'content'=>'title' ],  //conversione dinamica
  ],
  'function' => function(){
    $custom = $GLOBALS['gpci']['ajax']['current_args']['custom'];
    //istruzioni
    return 'Messaggio di ritorno';
  }
];

//azione basilare con aggiunta di argomenti personalizzati javascript
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'custom_javascript' => [
    'Lingua'=>'navigator.language',
    'Proprieta1'=>'FunzioneSenzaArgomenti',
    'Proprieta2'=>[ 'FunzioneConArgomenti', 'argomento1', 'argomento2' ]
  ],
  'function' => function(){
    $custom_javascript = $GLOBALS['gpci']['ajax']['current_args']['custom_javascript'];
    //istruzioni
    return 'Messaggio di ritorno';
  }
];

//azione basilare con aggiunta di campi compilabili
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'       => 'azione1',
  'fields' => [
    '#contenitore1',
    'string,#contenitore2_id_[render_data data="id"]'
  ],
  'function' => function(){
    $custom_javascript = $GLOBALS['gpci']['ajax']['current_args']['custom_javascript'];
    //istruzioni
    return 'Messaggio di ritorno';
  }
];

//azione di cancellazione con conferma all'invio + ricaricamento pagina
$GLOBALS['gpci']['config']['php']['ajax']['action'][] = [
  'id'                        => 'azione1',
  'custom'                    => [ 'id'=>$id ],
  'method'                    => 'POST',
  'confirm'                   => true,
  'confirm_text'              => 'Vuoi procedere alla cancellazione?',
  'javascript_after_response' => 'location.reload',
  'function'                  => function(){
    //istruzioni per la cancellazione
  }
];

Inserire ora un pulsante con attributo onclick contenente una conversione dinamica con:

  • tipo: azione ajax
  • contenuto: azione1 o azione2
  • se ci sono argomenti aggiuntivi inserirli come json oppure json semplificato negli args

Aggiunta di argomenti personalizzati:

//formato json
"custom":{
  "postid":"[render_data data='id']",
  "argomento2":"valore2",
  "titolo":"wp,title"
}
//stessa cosa in formato json semplificato
custom:{
  postid:[render_data data="id"]
  argomento2:valore2
  titolo:wp,title
}

//argomenti javascript
custom_javascript:{
  Lingua:navigator.language
  Proprieta1:FunzioneSenzaArgomenti,
  Proprieta2:FunzioneConArgomenti,argomento1,argomento2
}

//campi compilabili
fields:#contenitore1,#contenitore2_id_[render_data data="id"]

Se è una connessione verso un altro gpci_framework utilizzare qualcosa come:

id_azione,https://www.sito.it,id:id_cifratura_remota

--oppure

id_azione,
https://www.sito.it,
cipher:aes-128-cbc,
secret_key:chiave_16_caratteri,
iv:altra_chiave_16_caratteri

Parametri aggiuntivi

Parametri predefiniti

Il framework aggiunge automaticamente i seguenti parametri alla richiesta javascript:

  • launch - imposta il contesto che sarà valutato dal launcher
  • nomeazione-nonce - nonce relativo l'azione ajax - nota: il campo _wp_http_referer è disabilitato (vedi campo successivo)
  • origin_url - url dal quale è inviata la richiesta javascript - sostituisce _wp_http_referer - Sarà sostituito da origin_url
  • time - timestamp (in secondi) al quale è stata generata l'azione ajax da php
  • max_duration - tempo in secondi entro il quale è valida l'azione
  • action - azione ajax
  • gpci-data-encrypted - dati crittografati

Evitare quindi (in condizioni normali) di inserire parametri personalizzati identici.

Documentazione rilevante aggiuntiva