<

Queries

Ultima modifica: 7 Agosto 2026

Nel Gpci framework tutte le queries eseguite tramite la classe php WP_Query sono dotate di argomenti aggiuntivi per poter generare queries di posts, files, directory, opzioni, commenti, elementi personalizzati ed applicare i filtri della classe in modo da uniformare il tutto. Per le queries di posts non esistenti (passati tramite apposito argomento) saranno creati dei posts virtuali al volo da usare come database per le ricerche. In un secondo momento sarà integrata la cache.

Argomenti aggiuntivi

Gli argomenti aggiuntivi sono inseriti nell'array di argomenti esattamente come gli altri. Esempio in php:

//query di posts virtuali
$virtual_posts = [
  [ 'post_title'=>'Titolo 1', 'post_content'=>'Contenuto 1', 'chiave_personalizzata'=>'Valore1' ],
  [ 'post_title'=>'Titolo 2', 'post_content'=>'Contenuto 2', 'chiave_personalizzata'=>'Valore2' ],
];

$query = new WP_Query( [ 'virtual_posts'=>$virtual_posts, 'orderby'=>'title', 'order'=>'ASC', ] );
if( $query->have_posts() ){
  while( $query->have_posts() ){
    $query->the_post();
    //istruzioni
  }
  wp_reset_postdata();
}
//stessa cosa di
$posts = QueryAction( 'get_posts', [ 'virtual_posts'=>$virtual_posts, 'orderby'=>'title', 'order'=>'ASC', ] );
foreach( $posts as $post ){
  //istruzioni
}

virtual_posts

  • tipo: array di arrays associativi
  • default: []

Questo argomento configura i posts virtuali da creare al momento, è possibile inserire nell'array sia i campi wordpress (come post_content, post_title, ecc...) che campi personalizzati. Attenzione in quanto:

  • se non impostato l'ID sarà assegnato un valore progressivo da -1 in poi
  • se non impostato il post_type sarà assegnato post
  • se non impostato il post_status sarà assegnato publish

Se utilizzato questo argomento la query sarà solo virtuale, non verranno cercati risultati nel database. Vedere esempio sopra.

post

  • tipo: array associativo
  • default: []

Questo argomento modifica ogni post risultato della query tramite l'hook the_posts. Ospita le seguenti chiavi:

- get_post_meta

  • tipo: null/stringa
  • default: null

Aggiunge i campi personalizzati (tutti se */stringa vuota oppure quello specificato se altra stringa) ottenendoli dalla funzione php get_post_meta a ogni post all'interno del sotto array post_meta. Serve per poterli ottenere semplicemente tramite get_post, conversione dinamica, ecc... Attenzione in quanto si riuscirà ad ottenerli soltanto per il post corrente; per ottenere queste informazioni specificando manualmente l'id del post è meglio utilizzare funzioni apposite (come PostAction) all'interno della query.

//aggiunge tutti i campi personalizzati
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'post'=>[ 'get_post_meta'=>''] ] );
//oppure
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'post'=>[ 'get_post_meta'=>'*'] ] );

//aggiunge solo un campo
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'post'=>[ 'get_post_meta'=>'id_campo'] ] );

- get_relationship

  • tipo: stringa/null
  • default: null

Aggiunge i posts organizzzati per relazione (tutti se */la relazione specificata se stringa) a ogni post all'interno del sotto array relationship. Anche questo argomento serve per poter ottenere le informazioni semplicemente come per get_post_meta. Esempi:

//aggiunge tutte le relazioni
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'post'=>[ 'get_relationship'=>'*'] ] );

//aggiunge solo 1 relazione
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'post'=>[ 'get_relationship'=>'esercizio-a-schema' ] ] );

- unset

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

Rimuove le proprietà specificate da ogni oggetto post. Può essere utile in fase di debugging per semplificare i risultati oppure per fare semplicemente ordine visivo. Attenzione in quanto i campi rimossi non potranno essere più ottenuti nella query corrente.

//rimuove la proprietà post_contentda ogni post della query
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'post'=>[ 'unset'=>'post_content' ] ] );

//rimuove le proprietà post_content e post_excerpt da ogni post della query
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'post'=>[ 'unset'=>['post_content','post_excerpt'] ] ] );

custom_filters

  • tipo: array di arrays associativi
  • default: []

Questo argomento filtra la query tramite filtri personalizzati. I filtri sono configurati in modo quasi identico alla meta query ma funzionano su tutti i campi del post invece che solo sui post meta. In un secondo momento sarà aggiunta la possibilità di specificare la relazione tra le condizioni che per ora è sempre AND. Il type può essere settato su auto (valore predefinito), in qual caso sarà automaticamente configurato in base al tipo di valore.

Esempi:

//ottiene gli esercizi con post_title = Congiuntivo presente
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'custom_filters'=>[
           'post_title'=>'Congiuntivo presente',
           //oppure
           [ 'post_title'=>'Congiuntivo presente' ],
           //oppure
           [ 'key'=>'post_title', 'compare'=>'=', 'value'=>'Congiuntivo presente' ],
           //oppure
           [ 'key'=>'post_title', 'compare'=>'=', 'value'=>'Congiuntivo presente', 'type'=>'AUTO' ],
           //oppure
           [ 'key'=>'post_title', 'compare'=>'=', 'value'=>'Congiuntivo presente', 'type'=>'CHAR' ],

         ] ] );

E' possibile utilizzare la conversione dinamica aggiungendo la chiave value_type, eventuali argomenti della conversione vanno inseriti nella chiave value_args. Esempio:

//ottiene gli esercizi con post_title = Congiuntivo presente
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'custom_filters'=>[
           [ 'key'=>'post_title', 'compare'=>'=', 'value_type'=>'function', 'value'=>'nome_funzione', 'value_args'=>[], 'type'=>'CHAR' ]
         ] ] );

E' possibile anche filtrare per post_meta e campi in relationship utilizzando il nesting nella chiave (come visto in altri contesti del framework), avanzare nel filtro utilizzando la virgola. Esempi:

//ottiene gli esercizi con post_meta/livello-esercizio = B
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'custom_filters'=>[
           [ 'post_meta,livello-esercizio'=>'B' ]
           //oppure
           [ 'key'=>'post_meta,livello-esercizio', 'compare'=>'=', 'value'=>'B' ],
         ] ] );

//ottiene gli esercizi che NON hanno almeno una relazione esistente esercizio-a-schema
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'custom_filters'=>[
           [ 'key'=>'relationship,esercizio-a-schema', 'compare'=>'NOT EXISTS' ]
         ] ] );

//ottiene gli esercizi che hanno almeno una relazione esercizio-a-schema con schema/ID 6697
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'custom_filters'=>[
           [ 'relationship,esercizio-a-schema,ID'=>6697 ]
         ] ] );

//ottiene gli esercizi che hanno almeno una relazione esercizio-a-schema con schema/post_title = Imperfetto
$posts = QueryAction( 'get_posts', [ 'post_type'=>'esercizi', 'custom_filters'=>[
           ['relationship,esercizio-a-schema,post_title'=>'Imperfetto']
         ] ] );

//ottiene gli schemi grammaticali che hanno almeno una relazione con un esercizio di livello B
$posts = QueryAction( 'get_posts', [ 'post_type'=>'schema-grammaticale', 'custom_filters'=>[
           ['relationship,esercizio-a-schema,post_meta,livello-esercizio'=>'B']
         ] ] );

Esempi completi

Generiamo una query di immagini filtrabili partendo da 1000 files con estensione webp o jpeg:

$files = FolderAction( $action='get_content', $folder='wp_upload', $args=[ 'skip_dots'=>true, 'skip_folders'=>true, 'limit'=>1000, 'files_conditions'=>[ [ 'file,extension'=>'===webp,===jpeg', 'operator'=>'or' ] ] ] );

$virtual_posts = [];
foreach( $files as $file ){
  $FileInfo = FileAction( 'get_info', $file );
  if( !$FileInfo ){ continue; }
  $virtual_posts[] = [
    'post_title'        => $FileInfo['filename'],
    'post_name'         => $FileInfo['basename'],
    'post_mime_type'    => $FileInfo['mime'],
    'post_modified'     => DateTimeAction( 'ConvertDateTimeFormat', [ 'datetime'=>$FileInfo['date_modified'], 'datetime_format'=>'mysql' ] ),

    'size'       => $FileInfo['size'],
    'width'      => $FileInfo['width'],
    'height'     => $FileInfo['height'],
    'extension'  => $FileInfo['extension'],
  ];
}

//ulteriori filtri nella query
$posts = QueryAction( $action='get_posts', $args=[ 'virtual_posts'=>$virtual_posts, 'orderby'=>'post_title', 'custom_filters'=>[
           [ 'key'=>'size', 'compare'=>'between', 'value'=>[6000,6200], 'type'=>'NUMERIC' ]
         ] ] );
foreach( $posts as $post ){
  //istruzioni
}