{"id":27951,"date":"2022-08-11T09:00:00","date_gmt":"2022-08-11T07:00:00","guid":{"rendered":"https:\/\/supporthost.com\/it\/?p=27951"},"modified":"2025-04-24T09:41:41","modified_gmt":"2025-04-24T07:41:41","slug":"wp-list-table-tutorial","status":"publish","type":"post","link":"https:\/\/supporthost.com\/it\/wp-list-table-tutorial\/","title":{"rendered":"WP_List_Table tutorial"},"content":{"rendered":"\n<p>In questi giorni stavo scrivendo un plugin e cercando in giro ho notato che non ci sono tutorial aggiornati e completi per la classe WP_List_Table di WordPress.<\/p>\n\n\n\n<p>Dal momento che mi sono dovuto studiare la classe per fare il plugin, ho pensato di scrivere un tutorial per WP List Table in modo da spiegarla meglio di come \u00e8 stato fatto finora.<\/p>\n\n\n\n<p>Seguendo questo tutorial imparerai a creare una tabella custom nel database di WordPress, inserire dei dati al suo interno e prendere questi dati per mostrarli nell&#8217;area amministratore di WordPress.<\/p>\n\n\n\n<p>Otterrai un risultato come questo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-1024x558.png\" alt=\"Wp List Table Tutorial Risultato Finale\" class=\"wp-image-27984\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-1024x558.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-300x164.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-768x419.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-116x63.png 116w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Il risultato finale<\/figcaption><\/figure>\n\n\n\n<p>Ho caricato il codice completo del plugin su <a href=\"https:\/\/supporthost.com\/it\/github\/\">GitHub<\/a> per rendere pi\u00f9 semplice la lettura di questo tutorial, trovi il link nelle conclusioni di questo post.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Indice<\/h2><nav><ul><li><a href=\"#cose-la-classe-wp-list-table\">Cos&#8217;\u00e8 la classe WP_List_Table?<\/a><\/li><li><a href=\"#preparazione-dellambiente-di-sviluppo\">Preparazione dell&#8217;ambiente di sviluppo<\/a><\/li><li><a href=\"#la-struttura-di-wp-list-table\">La struttura di WP List Table<\/a><\/li><li><a href=\"#impostiamo-il-plugin\">Impostiamo il plugin<\/a><\/li><li><a href=\"#creare-il-plugin\">Creare il plugin<\/a><ul><li><a href=\"#creare-lheader-della-nostra-tabella\">Creare l&#8217;header della nostra tabella<\/a><\/li><li><a href=\"#collegare-la-tabelle-a-dati-e-colonne\">Collegare la tabelle a dati e colonne<\/a><\/li><li><a href=\"#prendere-i-dati-dal-database\">Prendere i dati dal database<\/a><\/li><li><a href=\"#mostrare-i-dati-nella-tabella\">Mostrare i dati nella tabella<\/a><\/li><\/ul><\/li><li><a href=\"#ordinamento\">Ordinamento<\/a><\/li><li><a href=\"#aggiungere-la-paginazione-con-wp-list-table\">Aggiungere la paginazione con WP_List_Table<\/a><\/li><li><a href=\"#impostazioni-schermata\">Impostazioni schermata<\/a><\/li><li><a href=\"#il-form-di-ricerca\">Il form di ricerca<\/a><\/li><li><a href=\"#action-links\">Action links<\/a><\/li><li><a href=\"#aggiungere-le-azioni-di-gruppo\">Aggiungere le azioni di gruppo<\/a><\/li><li><a href=\"#conclusioni\">Conclusioni<\/a><\/li><\/ul><\/nav><\/div>\n\n\n\n<p>In questo tutorial voglio spiegare come usare la classe WP List Table, ma come prima cosa vediamo a cosa serve.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cose-la-classe-wp-list-table\">Cos&#8217;\u00e8 la classe WP_List_Table?<\/h2>\n\n\n\n<p>La classe WP List Table \u00e8 usata per mostrare una tabella dei contenuti come ad esempio la lista dei nostri articoli:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"220\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-posts-1024x220.png\" alt=\"Wp List Table Tutorial Posts\" class=\"wp-image-27953\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-posts-1024x220.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-posts-300x65.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-posts-768x165.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-posts-120x26.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-posts.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Come anche la lista delle pagine:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"259\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-1024x259.png\" alt=\"Wp List Table Tutorial\" class=\"wp-image-27952\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-1024x259.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-300x76.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-768x195.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial-120x30.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-tutorial.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Questa classe ci permette di mostrare una lista di contenuti, con tanto di paginazione, impostazioni di schermata, ricerca, azioni di gruppo, ordinamento e molto altro.<\/p>\n\n\n\n<p>Normalmente se creiamo un <a href=\"https:\/\/supporthost.com\/it\/custom-post-type\/\" data-type=\"post\" data-id=\"44303\">custom post type<\/a> questa pagina viene creata in automatico da WordPress, ma come possiamo mostrare agli amministratori una pagina con una lista presa da una tabella custom del database?<\/p>\n\n\n\n<p>Possiamo trovare la classe WP_List_Table all&#8217;interno del file <strong><code>\/wp-admin\/includes\/class-wp-list-table.php<\/code><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"preparazione-dellambiente-di-sviluppo\">Preparazione dell&#8217;ambiente di sviluppo<\/h2>\n\n\n\n<p>Andiamo a creare la nostra tabella.<\/p>\n\n\n\n<p>Entriamo nel database usando un software come <a href=\"https:\/\/supporthost.com\/it\/phpmyadmin\/\" data-type=\"post\" data-id=\"18785\">phpMyAdmin<\/a>, <a href=\"https:\/\/supporthost.com\/it\/adminer\/\" data-type=\"post\" data-id=\"54245\">Adminer<\/a> (il software di default se usiamo <a href=\"https:\/\/supporthost.com\/it\/installare-wordpress-in-locale-local-by-flywheel\/\" data-type=\"post\" data-id=\"13271\">local<\/a>) o Sequel Ace a lanciamo questa query:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">CREATE TABLE `wp_supporthost_custom_table` (\n  `ID` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,\n  `name` text NOT NULL,\n  `description` longtext NOT NULL,\n  `status` varchar(20) NOT NULL,\n  `order` int NOT NULL\n);<\/pre>\n\n\n\n<p>Adesso che abbiamo creato la nostra tabella personalizzata andiamo ad inserire dei dati al suo interno con questa query:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">INSERT INTO `wp_supporthost_custom_table` (`name`, `description`, `status`, `order`)\nVALUES\n('joe', 'description', 'active', '1'),\n('mark', 'description', 'active', '2'),\n('john', 'description', 'pending', '4'),\n('jack', 'description', 'active', '7'),\n('bob', 'description', 'pending', '6'),\n('ryan', 'description', 'active', '8'),\n('max', 'description', 'pending', '3');<\/pre>\n\n\n\n<p>A questo punto abbiamo la nostra tabella custom nel database, e abbiamo dei dati al suo interno.<\/p>\n\n\n\n<p>Ricorda che in entrambe le query \u00e8 necessario modificare &#8220;wp_&#8221; col prefisso delle tue tabelle nel database.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"la-struttura-di-wp-list-table\">La struttura di WP List Table<\/h2>\n\n\n\n<p>In questo tutorial per WP List Table andiamo a creare una classe PHP che estende WP List Table.<\/p>\n\n\n\n<p>Vediamo quali elementi possiamo controllare con la classe WP_List_Table:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-possibilita-1024x558.png\" alt=\"Wp List Table Tutorial Possibilita\" class=\"wp-image-27985\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-possibilita-1024x558.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-possibilita-300x164.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-possibilita-768x419.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-possibilita-116x63.png 116w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-possibilita.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Possibilit\u00e0 di nascondere le colonne dalle impostazioni schermata;<\/li>\n\n\n\n<li>Possibilit\u00e0 di decidere il numero di elementi per pagina dalle impostazioni schermata;<\/li>\n\n\n\n<li>Form di ricerca;<\/li>\n\n\n\n<li>Paginazione;<\/li>\n\n\n\n<li>Colonne personalizzate;<\/li>\n\n\n\n<li>Ordinamento delle colonne in un click;<\/li>\n\n\n\n<li>Azioni di gruppo personalizzate.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"impostiamo-il-plugin\">Impostiamo il plugin<\/h2>\n\n\n\n<p>Il codice che scriveremo in questo tutorial per WP List Table pu\u00f2 essere inserito nel tuo sito in diversi modi.<\/p>\n\n\n\n<p>Puoi inserirlo all&#8217;interno del file functions.php del tuo tema, ma \u00e8 un&#8217;opzione sconsigliata per vari motivi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se cambi tema perdi questa funzionalit\u00e0;<\/li>\n\n\n\n<li>Rischi di avere un file functions.php troppo grande (con troppo codice) e diventerebbe difficile mantenerlo.<\/li>\n<\/ul>\n\n\n\n<p>L&#8217;ideale \u00e8 sempre cercare di separare il tutto per semplicit\u00e0, torner\u00e0 utile in futuro quando vorremo aggiungere una funzione o fare una modifica.<\/p>\n\n\n\n<p>Una seconda opzione \u00e8 quella di usare un plugin come <a href=\"https:\/\/wordpress.org\/plugins\/code-snippets\/\" rel=\"noopener\">code snippets<\/a> che ci permette di aggiungere del codice personalizzato al nostro sito senza creare un plugin apposito.<\/p>\n\n\n\n<p>In questo tutorial per WP_List_Table seguir\u00f2 la terza strada, ovvero andr\u00f2 a creare un plugin per aggiungere questa funzionalit\u00e0 a WordPress.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"creare-il-plugin\">Creare il plugin<\/h2>\n\n\n\n<p>Possiamo iniziare a scrivere il nostro <a href=\"https:\/\/supporthost.com\/it\/plugin-wordpress\/\" data-type=\"post\" data-id=\"16110\">plugin WordPress<\/a>. Andiamo nella cartella <strong>\/wp-content\/plugins<\/strong> e creiamo il file supporthost-admin-table.php (ovviamente puoi usare il nome che preferisci).<\/p>\n\n\n\n<p>All&#8217;interno del nostro nuovo file php aggiungiamo questo codice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;?php\n\n\/*\nPlugin Name:  SupportHost Admin Table\nDescription: It displays a table with custom data\nAuthor: SupportHost\nAuthor URI: https:\/\/supporthost.com\/\nLicense: GPLv2 or later\nLicense URI: https:\/\/www.gnu.org\/licenses\/gpl-2.0.html\nText Domain: supporthost-admin-table\nVersion: 1.0\n*\/\n\n\/\/ Loading WP_List_Table class file\n\/\/ We need to load it as it's not automatically loaded by WordPress\nif (!class_exists('WP_List_Table')) {\n      require_once(ABSPATH . 'wp-admin\/includes\/class-wp-list-table.php');\n}\n\n\/\/ Extending class\nclass Supporthost_List_Table extends WP_List_Table\n{\n    \/\/ Here we will add our code\n}\n\n\/\/ Adding menu\nfunction my_add_menu_items()\n{\n      add_menu_page('SupportHost List Table', 'SupportHost List Table', 'activate_plugins', 'supporthost_list_table', 'supporthost_list_init');\n}\nadd_action('admin_menu', 'my_add_menu_items');\n\n\/\/ Plugin menu callback function\nfunction supporthost_list_init()\n{\n      \/\/ Creating an instance\n      $table = new Supporthost_List_Table();\n\n      echo '&lt;div class=\"wrap\"&gt;&lt;h2&gt;SupportHost List Table&lt;\/h2&gt;';\n      \/\/ Prepare table\n      $table-&gt;prepare_items();\n      \/\/ Display table\n      $table-&gt;display();\n      echo '&lt;\/div&gt;';\n}<\/pre>\n\n\n\n<p>Dall&#8217;area amministratore di WordPress attiviamo il plugin che abbiamo appena creato:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"222\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/attivazione-plugin-supporthost-1024x222.png\" alt=\"Attivazione Plugin Supporthost\" class=\"wp-image-27960\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/attivazione-plugin-supporthost-1024x222.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/attivazione-plugin-supporthost-300x65.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/attivazione-plugin-supporthost-768x167.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/attivazione-plugin-supporthost-120x26.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/attivazione-plugin-supporthost.png 1479w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Una volta che il nostro plugin \u00e8 attivo vediamo una nuova voce nel men\u00f9 amministratore:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"166\" height=\"245\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/supporthost-plugin-menu-admin.png\" alt=\"Supporthost Plugin Menu Admin\" class=\"wp-image-27961\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/supporthost-plugin-menu-admin.png 166w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/supporthost-plugin-menu-admin-43x63.png 43w\" sizes=\"auto, (max-width: 166px) 100vw, 166px\" \/><\/figure>\n\n\n\n<p>Ovviamente se clicchiamo sul link otteniamo un errore dal momento che non abbiamo ancora nessun codice nella nostra classe Supporthost_List_Table.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"creare-lheader-della-nostra-tabella\">Creare l&#8217;header della nostra tabella<\/h3>\n\n\n\n<p>Il primo metodo che andiamo ad aggiungere alla nostra classe sar\u00e0 <strong>get_columns()<\/strong> che ci permette di creare le colonne della nostra tabella.<\/p>\n\n\n\n<p>Aggiungiamo quindi il metodo in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ Extending class\nclass Supporthost_List_Table extends WP_List_Table\n{\n    \/\/ Here we will add our code\n\n    \/\/ Define table columns\n    function get_columns()\n    {\n        $columns = array(\n                'cb'            =&gt; '&lt;input type=\"checkbox\" \/&gt;',\n                'name'          =&gt; __('Name', 'supporthost-cookie-consent'),\n                'description'         =&gt; __('Description', 'supporthost-cookie-consent'),\n                'status'   =&gt; __('Status', 'supporthost-cookie-consent'),\n                'order'        =&gt; __('Order', 'supporthost-cookie-consent')\n        );\n        return $columns;\n    }\n}<\/pre>\n\n\n\n<p>In pratica non facciamo altro che ritornare un array associativo, dove ogni elemento \u00e8 una colonna.<\/p>\n\n\n\n<p>Nota che la prima colonna la chiamiamo &#8220;cb&#8221; che sta per checkbox.<\/p>\n\n\n\n<p>Nota inoltre che per i nomi delle colonne uso la funzione __() nativa di WordPress, per poter tradurre in futuro le stringhe di testo in altre lingue.<\/p>\n\n\n\n<p>A questo punto se visitiamo la pagina del nostro plugin vediamo lo stesso errore:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"492\" height=\"78\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-plugin-error.png\" alt=\"Wp List Table Plugin Error\" class=\"wp-image-27964\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-plugin-error.png 492w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-plugin-error-300x48.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/07\/wp-list-table-plugin-error-120x19.png 120w\" sizes=\"auto, (max-width: 492px) 100vw, 492px\" \/><\/figure>\n\n\n\n<p>Vediamo come sistemare.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"collegare-la-tabelle-a-dati-e-colonne\">Collegare la tabelle a dati e colonne<\/h3>\n\n\n\n<p>Vediamo l&#8217;errore di sopra perch\u00e9 dobbiamo definire un metodo prepare_items() nella nostra sottoclasse per poter far funzionare il tutto.<\/p>\n\n\n\n<p>Aggiungiamo quindi il metodo all&#8217;interno della nostra classe:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ Bind table with columns, data and all\n    function prepare_items()\n    {\n        $columns = $this-&gt;get_columns();\n        $hidden = array();\n        $sortable = array();\n        $this-&gt;_column_headers = array($columns, $hidden, $sortable);\n        \n        $this-&gt;items = [];\n    }<\/pre>\n\n\n\n<p>Ricarichiamo la pagina e vediamo la nostra tabella, ovviamente senza alcun dato al suo interno.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"prendere-i-dati-dal-database\">Prendere i dati dal database<\/h3>\n\n\n\n<p>Adesso dobbiamo passare un array al metodo prepare_items(), al momento stiamo passando un array vuoto dove si vede:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$this-&gt;items = [];<\/pre>\n\n\n\n<p>Aggiungiamo un metodo alla nostra classe per prendere i dati dal database e passarli a $this-&gt;items.<\/p>\n\n\n\n<p>Possiamo inserire questo metodo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ Get table data\n    private function get_table_data() {\n        global $wpdb;\n\n        $table = $wpdb-&gt;prefix . 'supporthost_custom_table';\n\n        return $wpdb-&gt;get_results(\n            \"SELECT * from {$table}\",\n            ARRAY_A\n        );\n    }<\/pre>\n\n\n\n<p>Non facciamo altro che prelevare tutti i dati dalla nostra tabella custom e ritornarli in un array.<\/p>\n\n\n\n<p>Modifichiamo il metodo prepare_items() in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ Bind table with columns, data and all\n    function prepare_items()\n    {\n        \/\/data\n        $this-&gt;table_data = $this-&gt;get_table_data();\n\n        $columns = $this-&gt;get_columns();\n        $hidden = array();\n        $sortable = array();\n        $primary  = 'name';\n        $this-&gt;_column_headers = array($columns, $hidden, $sortable, $primary);\n        \n        $this-&gt;items = $this-&gt;table_data;\n    }<\/pre>\n\n\n\n<p>Nota che inseriamo l&#8217;array del nostro risultato in una propriet\u00e0 chiamata table_data, ci servir\u00e0 in seguito. Per fare in modo che funzioni dobbiamo definire la propriet\u00e0 nella nostra classe in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ define $table_data property\n    private $table_data;\n<\/pre>\n\n\n\n<p>Siamo quasi vicini al risultato finale, ma ancora manca un po&#8217;.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"mostrare-i-dati-nella-tabella\">Mostrare i dati nella tabella<\/h3>\n\n\n\n<p>Il motivo per cui ancora non vediamo i risultati, nonostante li stiamo prendendo dal database, \u00e8 che non abbiamo definito il metodo column_default() all&#8217;interno della nostra classe.<\/p>\n\n\n\n<p>In questo modo possiamo definire quale valore va in ogni colonna della nostra tabella.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    function column_default($item, $column_name)\n    {\n          switch ($column_name) {\n                case 'id':\n                case 'name':\n                case 'description':\n                case 'status':\n                case 'order':\n                default:\n                    return $item[$column_name];\n          }\n    }<\/pre>\n\n\n\n<p>Adesso vediamo la tabella, ma mancano i checkbox nella prima colonna:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"298\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tabella-admin-1024x298.png\" alt=\"Wp List Table Tabella Admin\" class=\"wp-image-27974\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tabella-admin-1024x298.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tabella-admin-300x87.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tabella-admin-768x224.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tabella-admin-120x35.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tabella-admin.png 1476w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Per sistemare aggiungiamo un nuovo metodo alla nostra classe in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    function column_cb($item)\n    {\n        return sprintf(\n                '&lt;input type=\"checkbox\" name=\"element[]\" value=\"%s\" \/&gt;',\n                $item['id']\n        );\n    }<\/pre>\n\n\n\n<p>Questo checkbox ci sar\u00e0 utile dopo quando dovremo creare delle azioni di gruppo alla nostra tabella.<\/p>\n\n\n\n<p>Adesso ci troviamo con una tabella usabile, anche se minimale. Da questo punto vediamo come aggiungere features alla nostra tabella usando la classe WP_List_Table in modo da renderla usabile.<\/p>\n\n\n\n<p>Nei prossimi paragrafi vediamo come aggiungere la paginazione, la ricerca, le impostazioni dello schermo, le azioni di gruppo e altro.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ordinamento\">Ordinamento<\/h2>\n\n\n\n<p>Probabilmente lavorando con l&#8217;area admin di WordPress hai notato che alcune colonne sono blu ed hanno una freccia.<\/p>\n\n\n\n<p>Cliccando sul link puoi ordinare i risultati in base a quel criterio.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"140\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-ordinamento-1024x140.png\" alt=\"Wp List Table Ordinamento\" class=\"wp-image-27976\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-ordinamento-1024x140.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-ordinamento-300x41.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-ordinamento-768x105.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-ordinamento-120x16.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-ordinamento.png 1472w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Vediamo come possiamo fare per la nostra tabella.<\/p>\n\n\n\n<p>Aggiungiamo un metodo alla nostra classe:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">protected function get_sortable_columns()\n{\n      $sortable_columns = array(\n            'name'  =&gt; array('name', false),\n            'status' =&gt; array('status', false),\n            'order'   =&gt; array('order', true)\n      );\n      return $sortable_columns;\n}<\/pre>\n\n\n\n<p>Usiamo questo metodo per creare un array di colonne che potremo usare per ordinare i nostri dati.<\/p>\n\n\n\n<p>Se una colonna non \u00e8 presente in questo array non sar\u00e0 possibile ordinarla. In questo WP List Table tutorial ho lasciato fuori volutamente la descrizione.<\/p>\n\n\n\n<p>L&#8217;indice del nostro array indica la colonna che vogliamo impostare come &#8220;sortable&#8221;.<\/p>\n\n\n\n<p>Il value del nostro array invece \u00e8 un array dove il primo valore \u00e8 la colonna che useremo per ordinare i dati, il secondo valore \u00e8 un boolean che funziona in questo modo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se impostato su <strong>false<\/strong> (che \u00e8 il valore di default), appena clicchiamo sul nome della colonna la freccia punter\u00e0 verso l&#8217;alto e i valori saranno ordinati in ordine ascendente;<\/li>\n\n\n\n<li>Se impostato su <strong>true<\/strong>, appena clicchiamo sul nome della colonna la freccia punter\u00e0 verso il basso e i valori saranno ordinati in modo discendente.<\/li>\n<\/ul>\n\n\n\n<p>Tieni presente che il secondo parametro (true\/false) \u00e8 opzionale e di default \u00e8 impostato su false.<\/p>\n\n\n\n<p>Ancora l&#8217;ordinamento non \u00e8 funzionante, dal momento che ci mancano due passaggi.<\/p>\n\n\n\n<p>Come prima cosa aggiungiamo un altro metodo che ci permetter\u00e0 di modifcare l&#8217;ordinamento dell&#8217;array che contiene tutti i dati della nostra tabella.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ Sorting function\n    function usort_reorder($a, $b)\n    {\n        \/\/ If no sort, default to user_login\n        $orderby = (!empty($_GET['orderby'])) ? $_GET['orderby'] : 'user_login';\n\n        \/\/ If no order, default to asc\n        $order = (!empty($_GET['order'])) ? $_GET['order'] : 'asc';\n\n        \/\/ Determine sort order\n        $result = strcmp($a[$orderby], $b[$orderby]);\n\n        \/\/ Send final sort direction to usort\n        return ($order === 'asc') ? $result : -$result;\n    }<\/pre>\n\n\n\n<p>Adesso che abbiamo aggiunto questi due metodi non ci resta che modificare il codice di prepare items per rendere le nostre colonne ordinabili.<\/p>\n\n\n\n<p>Come prima cosa modifichiamo la riga:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$sortable = array();<\/pre>\n\n\n\n<p>Con:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$sortable = $this-&gt;get_sortable_columns();<\/pre>\n\n\n\n<p>In modo da passare il nostro array in modo corretto a _column_headers due righe pi\u00f9 in basso.<\/p>\n\n\n\n<p>Aggiungiamo poi questa riga per riordinare il nostro array quando necessario:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">usort($this-&gt;table_data, array(&amp;$this, 'usort_reorder'));<\/pre>\n\n\n\n<p>Il nostro metodo diventa quindi:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ Bind table with columns, data and all\n    function prepare_items()\n    {\n        \/\/data\n        $this-&gt;table_data = $this-&gt;get_table_data();\n\n        $columns = $this-&gt;get_columns();\n        $hidden = array();\n        $sortable = $this-&gt;get_sortable_columns();\n        $primary  = 'name';\n        $this-&gt;_column_headers = array($columns, $hidden, $sortable, $primary);\n\n        usort($this-&gt;table_data, array(&amp;$this, 'usort_reorder'));\n        \n        $this-&gt;items = $this-&gt;table_data;\n    }<\/pre>\n\n\n\n<p>Adesso che siamo in grado di ordinare i dati della nostra tabella, passiamo ad una nuova feature: la paginazione.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aggiungere-la-paginazione-con-wp-list-table\">Aggiungere la paginazione con WP_List_Table<\/h2>\n\n\n\n<p>Se abbiamo un numero notevole di elementi la paginazione \u00e8 un elemento che non pu\u00f2 mancare.<\/p>\n\n\n\n<p>La classe WP List Table ci permette di mostrare una paginazione in modo semplice, vediamo come.<\/p>\n\n\n\n<p>Aggiungere la paginazione \u00e8 facilissimo!<\/p>\n\n\n\n<p>Non dobbiamo fare altro che inserire qualche riga di codice nel nostro metodo prepare_items().<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        \/* pagination *\/\n        $per_page = 3;\n        $current_page = $this-&gt;get_pagenum();\n        $total_items = count($this-&gt;table_data);\n\n        $this-&gt;table_data = array_slice($this-&gt;table_data, (($current_page - 1) * $per_page), $per_page);\n\n        $this-&gt;set_pagination_args(array(\n                'total_items' =&gt; $total_items, \/\/ total number of items\n                'per_page'    =&gt; $per_page, \/\/ items to show on a page\n                'total_pages' =&gt; ceil( $total_items \/ $per_page ) \/\/ use ceil to round up\n        ));<\/pre>\n\n\n\n<p>Che diventa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ Bind table with columns, data and all\n    function prepare_items()\n    {\n        \/\/data\n        $this-&gt;table_data = $this-&gt;get_table_data();\n\n        $columns = $this-&gt;get_columns();\n        $hidden = array();\n        $sortable = $this-&gt;get_sortable_columns();\n        $primary  = 'name';\n        $this-&gt;_column_headers = array($columns, $hidden, $sortable, $primary);\n\n        usort($this-&gt;table_data, array(&amp;$this, 'usort_reorder'));\n        \n        \/* pagination *\/\n        $per_page = 3;\n        $current_page = $this-&gt;get_pagenum();\n        $total_items = count($this-&gt;table_data);\n\n        $this-&gt;table_data = array_slice($this-&gt;table_data, (($current_page - 1) * $per_page), $per_page);\n\n        $this-&gt;set_pagination_args(array(\n                'total_items' =&gt; $total_items, \/\/ total number of items\n                'per_page'    =&gt; $per_page, \/\/ items to show on a page\n                'total_pages' =&gt; ceil( $total_items \/ $per_page ) \/\/ use ceil to round up\n        ));\n\n        $this-&gt;items = $this-&gt;table_data;\n    }<\/pre>\n\n\n\n<p id=\"note\">Una nota importante: le righe di codice per la paginazione devono essere inserite dopo la funzione per l&#8217;ordinamento. Se l&#8217;ordinamento viene inserito dopo la funzione array_slice, quando ordiniamo una colonna i risultati saranno ordinati solo per quella pagina, l&#8217;ordinamento non prender\u00e0 in considerazione tutti i risultati, ma soltanto quelli presenti nella schermata che vediamo.<br><br>Per capire meglio cosa intendo ti consiglio di spostare la riga che inizia con usort dopo il codice per la paginazione e ordinare per il campo order per vedere cosa succede.<\/p>\n\n\n\n<p>Nota che dove dice:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$per_page = 3;<\/pre>\n\n\n\n<p>Significa che mostriamo 3 elementi per pagina.<\/p>\n\n\n\n<p>Con queste poche righe possiamo inserire la paginazione nella nostra tabella ed ottenere un risultato come questo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"238\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-paginazione-1024x238.png\" alt=\"Wp List Table Paginazione\" class=\"wp-image-27977\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-paginazione-1024x238.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-paginazione-300x70.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-paginazione-768x178.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-paginazione-120x28.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-paginazione.png 1482w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Come avrai notato, se inserisci a mano il numero di pagina nel box e premi invio non succede niente. Questo perch\u00e9 la nostra tabella non \u00e8 un form.<\/p>\n\n\n\n<p>Per risolvere dobbiamo modificare il codice della nostra funzione in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ Plugin menu callback function\nfunction supporthost_list_init()\n{\n      \/\/ Creating an instance\n      $table = new Supporthost_List_Table();\n\n      echo '&lt;div class=\"wrap\"&gt;&lt;h2&gt;SupportHost Admin Table&lt;\/h2&gt;';\n      echo '&lt;form method=\"post\"&gt;';\n      \/\/ Prepare table\n      $table-&gt;prepare_items();\n      \/\/ Display table\n      $table-&gt;display();\n      echo '&lt;\/div&gt;&lt;\/form&gt;';\n}<\/pre>\n\n\n\n<p>In WordPress normalmente posso cliccare sulle impostazioni schermata in alto e decidere quali colonne mostrare e quanti risultati mostrare.<\/p>\n\n\n\n<p>\u00c8 proprio quello che stiamo per andare a vedere.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"impostazioni-schermata\">Impostazioni schermata<\/h2>\n\n\n\n<p>Per aggiungere le impostazioni della schermata non dobbiamo aggiungere un metodo alla nostra classe, dovremo invece modificare il codice al nostro <a href=\"https:\/\/supporthost.com\/it\/hook-wordpress\/\" data-type=\"post\" data-id=\"84714\">hook<\/a> &#8220;admin_menu&#8221;.<\/p>\n\n\n\n<p>Eliminiamo il codice iniziale e lo sostituiamo con questo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ Adding menu\nfunction my_add_menu_items() {\n \n\tglobal $supporthost_sample_page;\n \n\t\/\/ add settings page\n\t$supporthost_sample_page = add_menu_page(__('SupportHost List Table', 'supporthost-admin-table'), __('SupportHost List Table', 'supporthost-admin-table'), 'manage_options', 'supporthost_list_table', 'supporthost_list_init');\n \n\tadd_action(\"load-$supporthost_sample_page\", \"supporthost_sample_screen_options\");\n}\nadd_action('admin_menu', 'my_add_menu_items');\n\n\/\/ add screen options\nfunction supporthost_sample_screen_options() {\n \n\tglobal $supporthost_sample_page;\n        global $table;\n \n\t$screen = get_current_screen();\n \n\t\/\/ get out of here if we are not on our settings page\n\tif(!is_object($screen) || $screen-&gt;id != $supporthost_sample_page)\n\t\treturn;\n \n\t$args = array(\n\t\t'label' =&gt; __('Elements per page', 'supporthost-admin-table'),\n\t\t'default' =&gt; 2,\n\t\t'option' =&gt; 'elements_per_page'\n\t);\n\tadd_screen_option( 'per_page', $args );\n\n    $table = new Supporthost_List_Table();\n\n}<\/pre>\n\n\n\n<p>Nella prima funzione aggiungiamo un hook per caricare le impostazioni di schermata.<\/p>\n\n\n\n<p>Nella seconda funzione impostiamo $table come variabile globale, in questo modo WordPress prende la lista delle colonne e ci permette di decidere quali colonne mostrare o nascondere dalle impostazioni schermata.<\/p>\n\n\n\n<p>Inoltre aggiungiamo un&#8217;opzione chiamata elements_per_page che di permette di decidere quanti elementi visualizzare per pagina.<\/p>\n\n\n\n<p>Se hai provato sicuramente hai notato che se cambi il numero di elementi per pagina, questi non cambiano.<\/p>\n\n\n\n<p>Dobbiamo infatti andare a modificare una riga nel nostro metodo prepare_items():<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$per_page = 3;<\/pre>\n\n\n\n<p>Diventa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$per_page = $this-&gt;get_items_per_page('elements_per_page', 10);<\/pre>\n\n\n\n<p>In questo modo diciamo a WordPress di prendere il valore &#8216;elements_per_page&#8217; dalla tabella usermeta, infatti quando modifichiamo il numero di elementi per pagina WordPress salva il valore nel database, stessa cosa con la selezione delle colonne che vogliamo mostrare o nascondere.<\/p>\n\n\n\n<p>Il valore 10 che passiamo come secondo parametro \u00e8 il numero di default, se l&#8217;utente non ha deciso quanti elementi mostrare dalle impostazioni schermata. Questo valore \u00e8 opzionale, se non lo specifichiamo WordPress lo imposta a 20 di default.<\/p>\n\n\n\n<p>Avrai anche notato che se nascondi una colonna e ricarichi la pagina, tutte le colonne vengono mostrate.<\/p>\n\n\n\n<p>Come nel caso del numero di elementi per pagina, le preferenze relativa alle colonne nascoste vengono salvate nel database nella colonna usermeta.<\/p>\n\n\n\n<p>Modifichiamo la riga:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$hidden = array();<\/pre>\n\n\n\n<p>Con questo if\/else statement:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$hidden = ( is_array(get_user_meta( get_current_user_id(), 'managetoplevel_page_supporthost_list_tablecolumnshidden', true)) ) ? get_user_meta( get_current_user_id(), 'managetoplevel_page_supporthost_list_tablecolumnshidden', true) : array();<\/pre>\n\n\n\n<p>In questo modo se l&#8217;utente ha deciso di nascondere alcune colonne le nascondiamo, altrimenti passiamo un array vuoto senza nascondere nessuna colonna.<\/p>\n\n\n\n<p>A questo punto vogliamo poter cercare tra gli elementi che abbiamo nel database.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"il-form-di-ricerca\">Il form di ricerca<\/h2>\n\n\n\n<p>Per poter ricercare tra i vari elementi ci serve un form per la ricerca, e alcune modifiche al nostro codice per permettere una ricerca all&#8217;interno del database.<\/p>\n\n\n\n<p>Come prima cosa dobbiamo aggiungere il form alla nostra tabella, aggiungendo questa riga:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$table-&gt;search_box('search', 'search_id');<\/pre>\n\n\n\n<p>In questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ Plugin menu callback function\nfunction supporthost_list_init()\n{\n      \/\/ Creating an instance\n      $table = new Supporthost_List_Table();\n\n      echo '&lt;div class=\"wrap\"&gt;&lt;h2&gt;SupportHost Admin Table&lt;\/h2&gt;';\n      echo '&lt;form method=\"post\"&gt;';\n      \/\/ Prepare table\n      $table-&gt;prepare_items();\n      \/\/ Search form\n      $table-&gt;search_box('search', 'search_id');\n      \/\/ Display table\n      $table-&gt;display();\n      echo '&lt;\/div&gt;&lt;\/form&gt;';\n}<\/pre>\n\n\n\n<p>Adesso andiamo a modificare il nostro metodo prepare_items() in modo da prendere il parametro $_POST[&#8216;s&#8217;] e fare una ricerca nel database, in questo modo:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">        \/\/data\n        if ( isset($_POST['s']) ) {\n            $this-&gt;table_data = $this-&gt;get_table_data($_POST['s']);\n        } else {\n            $this-&gt;table_data = $this-&gt;get_table_data();\n        }<\/pre>\n\n\n\n<p>Quindi il metodo completo diventa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ Bind table with columns, data and all\n    function prepare_items()\n    {\n        \/\/data\n        if ( isset($_POST['s']) ) {\n            $this-&gt;table_data = $this-&gt;get_table_data($_POST['s']);\n        } else {\n            $this-&gt;table_data = $this-&gt;get_table_data();\n        }\n\n        $columns = $this-&gt;get_columns();\n        $hidden = ( is_array(get_user_meta( get_current_user_id(), 'managetoplevel_page_supporthost_list_tablecolumnshidden', true)) ) ? get_user_meta( get_current_user_id(), 'managetoplevel_page_supporthost_list_tablecolumnshidden', true) : array();\n        $sortable = $this-&gt;get_sortable_columns();\n        $primary  = 'name';\n        $this-&gt;_column_headers = array($columns, $hidden, $sortable, $primary);\n\n        usort($this-&gt;table_data, array(&amp;$this, 'usort_reorder'));\n\n        \/* pagination *\/\n        $per_page = $this-&gt;get_items_per_page('elements_per_page', 10);\n        $current_page = $this-&gt;get_pagenum();\n        $total_items = count($this-&gt;table_data);\n\n        $this-&gt;table_data = array_slice($this-&gt;table_data, (($current_page - 1) * $per_page), $per_page);\n\n        $this-&gt;set_pagination_args(array(\n                'total_items' =&gt; $total_items, \/\/ total number of items\n                'per_page'    =&gt; $per_page, \/\/ items to show on a page\n                'total_pages' =&gt; ceil( $total_items \/ $per_page ) \/\/ use ceil to round up\n        ));\n        \n        $this-&gt;items = $this-&gt;table_data;\n    }<\/pre>\n\n\n\n<p>Dobbiamo poi modificare il metodo get_table_data() in modo da eseguire una ricerca nel database:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ Get table data\n    private function get_table_data( $search = '' ) {\n        global $wpdb;\n\n        $table = $wpdb-&gt;prefix . 'supporthost_custom_table';\n\n        if ( !empty($search) ) {\n            return $wpdb-&gt;get_results(\n                \"SELECT * from {$table} WHERE name Like '%{$search}%' OR description Like '%{$search}%' OR status Like '%{$search}%'\",\n                ARRAY_A\n            );\n        } else {\n            return $wpdb-&gt;get_results(\n                \"SELECT * from {$table}\",\n                ARRAY_A\n            );\n        }\n    }<\/pre>\n\n\n\n<p>Adesso la ricerca funziona, cercando nei campi &#8220;name&#8221;, &#8220;description&#8221; e &#8220;status&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"action-links\">Action links<\/h2>\n\n\n\n<p>Hai presente quando passi col mouse sopra una riga e appaiono dei link che ti permettono di eseguire varie azioni, come ad esempio visualizzare il post\/pagina o spostarlo nel cestino?<\/p>\n\n\n\n<p>Vediamo come usare la classe WP List Table per aggiungere questi action links.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"254\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-action-links-1024x254.png\" alt=\"Wp List Table Action Links\" class=\"wp-image-27982\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-action-links-1024x254.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-action-links-300x75.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-action-links-768x191.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-action-links-120x30.png 120w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-action-links.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Semplicemente aggiungendo questo metodo alla nostra classe possiamo aggiungere degli action links:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ Adding action links to column\n    function column_name($item)\n    {\n        $actions = array(\n                'edit'      =&gt; sprintf('&lt;a href=\"?page=%s&amp;action=%s&amp;element=%s\"&gt;' . __('Edit', 'supporthost-admin-table') . '&lt;\/a&gt;', $_REQUEST['page'], 'edit', $item['ID']),\n                'delete'    =&gt; sprintf('&lt;a href=\"?page=%s&amp;action=%s&amp;element=%s\"&gt;' . __('Delete', 'supporthost-admin-table') . '&lt;\/a&gt;', $_REQUEST['page'], 'delete', $item['ID']),\n        );\n\n        return sprintf('%1$s %2$s', $item['name'], $this-&gt;row_actions($actions));\n    }<\/pre>\n\n\n\n<p>Il nome della funzione deve essere creato in questo formato: <strong>column_{column_identifier}<\/strong>. <\/p>\n\n\n\n<p>All&#8217;interno di questa funzione creiamo un array di link, in questo caso un link per la modifica e uno per eliminare l&#8217;elemento.<\/p>\n\n\n\n<p><strong>$item[\u2018ID\u2019]<\/strong>&nbsp;e&nbsp;<strong>$item[\u2018name\u2019]<\/strong>, ID e &#8220;name&#8221; sono gli identificativi delle nostre colonne come li abbiamo definiti nel metodo get_columns().<\/p>\n\n\n\n<p>In questo modo aggiungiamo soltanto i link alle funzionalit\u00e0. Se vuoi che questi link funzionino correttamente devi creare le funzionalit\u00e0.<\/p>\n\n\n\n<p>Abbiamo quasi finito, ci mancano soltanto le azioni di gruppo, vediamo come fare.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"aggiungere-le-azioni-di-gruppo\">Aggiungere le azioni di gruppo<\/h2>\n\n\n\n<p>Le azioni di gruppo sono quelle azioni che possiamo applicare a diversi elementi dopo averli selezionati:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"480\" height=\"593\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-azioni-di-gruppo.png\" alt=\"Wp List Table Azioni Di Gruppo\" class=\"wp-image-27983\" style=\"width:360px;height:445px\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-azioni-di-gruppo.png 480w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-azioni-di-gruppo-243x300.png 243w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-azioni-di-gruppo-51x63.png 51w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/figure>\n\n\n\n<p>Per aggiungere queste azioni non dobbiamo fare altro che aggiungere un metodo alla nostra classe:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">    \/\/ To show bulk action dropdown\n    function get_bulk_actions()\n    {\n            $actions = array(\n                    'delete_all'    =&gt; __('Delete', 'supporthost-admin-table'),\n                    'draft_all' =&gt; __('Move to Draft', 'supporthost-admin-table')\n            );\n            return $actions;\n    }<\/pre>\n\n\n\n<p>In pratica ritorniamo un array con le azioni. L&#8217;indice dell&#8217;array \u00e8 l&#8217;azione mentre il valore dell&#8217;array \u00e8 il nome che vediamo nel dropdown.<\/p>\n\n\n\n<p>Anche qui ho usato la funzione __() per poter poi tradurre queste stringhe.<\/p>\n\n\n\n<p>Come per gli action links, anche qui abbiamo aggiunto soltanto l&#8217;azione, non abbiamo creato la funzione per eseguire l&#8217;azione che andiamo a selezionare, infatti se selezioniamo una di queste azioni non succeder\u00e0 niente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusioni\">Conclusioni<\/h2>\n\n\n\n<p>In questo tutorial su WP_List_Table abbiamo visto come usare la classe WP List Table per creare una tabella nell&#8217;area admin prendendo i dati da una tabella custom.<\/p>\n\n\n\n<p>Per facilit\u00e0 ho aggiunto il file su GitHub, puoi trovare il codice completo di questo tutorial <a href=\"https:\/\/github.com\/supporthost-com\/WP_List_Table\/blob\/main\/supporthost-admin-table.php\" rel=\"noopener\">qui<\/a>.<\/p>\n\n\n\n<p>Ecco il risultato finito:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" src=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-1024x558.png\" alt=\"Wp List Table Tutorial Risultato Finale\" class=\"wp-image-27984\" srcset=\"https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-1024x558.png 1024w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-300x164.png 300w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-768x419.png 768w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale-116x63.png 116w, https:\/\/supporthost.com\/it\/wp-content\/uploads\/sites\/2\/2022\/08\/wp-list-table-tutorial-risultato-finale.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Questa classe pu\u00f2 essere usata per creare delle tabelle nell&#8217;area admin di WordPress usando delle classi gi\u00e0 esistenti in WordPress, senza dover reinventare la ruota.<\/p>\n\n\n\n<p>La guida ti \u00e8 stata utile? Ci sono stati dei passaggi non chiari? Hai dei dubbi? Fammelo sapere in un commento!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questi giorni stavo scrivendo un plugin e cercando in giro ho notato che non ci sono tutorial aggiornati e completi per la classe WP_List_Table di WordPress. Dal momento che mi sono dovuto studiare la classe per fare il plugin, ho pensato di scrivere un tutorial per WP List Table in modo da spiegarla meglio [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":63836,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[33],"tags":[],"class_list":["post-27951","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-wordpress"],"acf":[],"_links":{"self":[{"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/posts\/27951","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/comments?post=27951"}],"version-history":[{"count":5,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/posts\/27951\/revisions"}],"predecessor-version":[{"id":105527,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/posts\/27951\/revisions\/105527"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/media\/63836"}],"wp:attachment":[{"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/media?parent=27951"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/categories?post=27951"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/supporthost.com\/it\/wp-json\/wp\/v2\/tags?post=27951"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}