Come aggiungere una WP_List_Table a una pagina WordPress?
Ho una WP_List_Table e vorrei aggiungerla a una pagina, ma dopo aver cercato non ho trovato esempi su come farlo. Qualcuno ha uno snippet per realizzare questo?
<?php
/*
Plugin Name: Add Parl Plugin 2
Description: Per aggiungere parlamenti
Plugin URI:"http://www.ttparliaments.org"
Author URI: ""
Author: Napoleon Okunna
License: ""
Version: 1.0
*/
global $custom_table_example_db_version;
$custom_table_example_db_version = '1.1'; // versione cambiata da 1.0 a 1.1
global $wpdb;
global $custom_table_example_db_version;
$table_name = $wpdb->prefix . 'oop_parliamentary_info'; // non dimenticare il prefisso delle tabelle
/**
* PARTE 2. Definizione della Tabella Personalizzata
* ============================================================================
*
* In questa parte definirai una classe per la tabella personalizzata,
* che mostrerà i record del database in una tabella ben formattata
*
* http://codex.wordpress.org/Class_Reference/WP_List_Table
* http://wordpress.org/extend/plugins/custom-list-table-example/
*/
if (!class_exists('WP_List_Table')) {
require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
}
/**
* Classe Custom_Table_Example_List_Table che mostrerà i record
* della nostra tabella personalizzata
*/
class Custom_Table_Example_List_Table extends WP_List_Table
{
/**
* [OBBLIGATORIO] Devi dichiarare il costruttore e fornire alcuni parametri base
*/
function __construct()
{
global $status, $page;
parent::__construct(array(
'singular' => 'person',
'plural' => 'persons',
));
}
/**
* [OBBLIGATORIO] questo è il renderer di colonna predefinito
*
* @param $item - riga (array chiave, valore)
* @param $column_name - stringa (chiave)
* @return HTML
*/
function column_default($item, $column_name)
{
return $item[$column_name];
}
/**
* [OPZIONALE] questo è un esempio di come renderizzare una colonna specifica
*
* il nome del metodo deve essere così: "column_[nome_colonna]"
*
* @param $item - riga (array chiave, valore)
* @return HTML
*/
function column_age($item)
{
return '<em>' . $item['age'] . '</em>';
}
/**
* [OPZIONALE] questo è un esempio di come renderizzare una colonna con azioni,
* quando passi il mouse sulla riga vengono mostrati i link "Modifica | Elimina"
*
* @param $item - riga (array chiave, valore)
* @return HTML
*/
function column_name($item)
{
// i link puntano a /admin.php?page=[pagina_tuo_plugin][&altri_parametri]
// nota come usiamo $_REQUEST['page'], così l'azione verrà eseguita sulla pagina corrente
// nota anche come usiamo $this->_args['singular'] quindi in questo esempio sarà
// qualcosa come &person=2
$actions = array(
'edit' => sprintf('<a href="?page=%s&action=%s&book=%s">Modifica</a>',$_REQUEST['page'],'edit',$item['ParliamentaryID']),
'delete' => sprintf('<a href="?page=%s&action=%s&book=%s">Elimina</a>',$_REQUEST['page'],'delete',$item['ParliamentaryID']),
);
return sprintf('%1$s %2$s', $item['booktitle'], $this->row_actions($actions) );
}
/**
* [OBBLIGATORIO] questo è come viene renderizzata la colonna dei checkbox
*
* @param $item - riga (array chiave, valore)
* @return HTML
*/
function column_cb($item)
{
return sprintf(
'<input type="checkbox" name="id[]" value="%s" />',
$item['id']
);
}
/**
* [OBBLIGATORIO] Questo metodo restituisce le colonne da mostrare nella tabella
* puoi saltare le colonne che non vuoi mostrare
* come content o description
*
* @return array
*/
function get_columns()
{
$columns = array(
'cb' => '<input type="checkbox" />', // Renderizza un checkbox invece del testo
'Title' => __('Title', 'custom_table_example'),
'StartDate' => __('StartDate', 'custom_table_example'),
'EndDate' => __('EndDate', 'custom_table_example'),
'IsCurrent' => __('IsCurrent', 'custom_table_example'),
'ParliamentaryID' => '<a href="#">Modifica</a>',
);
return $columns;
}
/**
* [OPZIONALE] Questo metodo restituisce le colonne che possono essere usate per ordinare la tabella
* tutte le stringhe nell'array sono nomi di colonne
* nota che true sul nome della colonna significa che è l'ordinamento predefinito
*
* @return array
*/
function get_sortable_columns()
{
$sortable_columns = array(
'Title' => array('Title', true),
'StartDate' => array('StartDate', false),
'EndDate' => array('EndDate', false),
'IsCurrent' => __('IsCurrent', false),
'ParliamentaryID'=> __('ParliamentaryID', false),
);
return $sortable_columns;
}
/**
* [OPZIONALE] Restituisce un array di azioni bulk se presenti
*
* @return array
*/
function get_bulk_actions()
{
$actions = array(
'delete' => 'Elimina',
'edit' =>'Modifica'
);
return $actions;
}
/**
* [OPZIONALE] Questo metodo processa le azioni bulk
* può essere esterno alla classe
* non può usare wp_redirect perché c'è già output
* in questo esempio processiamo l'azione di eliminazione
* il messaggio di eliminazione avvenuta verrà mostrato nella pagina nella parte successiva
*/
function process_bulk_action()
{
global $wpdb;
$table_name = $wpdb->prefix . 'cte'; // non dimenticare il prefisso delle tabelle
if ('delete' === $this->current_action()) {
$ids = isset($_REQUEST['id']) ? $_REQUEST['id'] : array();
if (is_array($ids)) $ids = implode(',', $ids);
if (!empty($ids)) {
$wpdb->query("DELETE FROM $table_name WHERE id IN($ids)");
}
}
if ('Edit' === $this->current_action()) {
echo('Modifica');
}
}
/**
* [OBBLIGATORIO] Questo è il metodo più importante
*
* Prenderà le righe dal database e le preparerà per essere mostrate nella tabella
*/
function prepare_items()
{
global $wpdb;
$table_name = $wpdb->prefix . 'cte'; // non dimenticare il prefisso delle tabelle
$table_name='oop_parliamentary_info';
$per_page = 5; // costante, quanti record verranno mostrati per pagina
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
// qui configuriamo gli header della tabella, definiti nei nostri metodi
$this->_column_headers = array($columns, $hidden, $sortable);
// [OPZIONALE] processa le azioni bulk se presenti
$this->process_bulk_action();
// verrà usato nelle impostazioni di paginazione
$total_items = $wpdb->get_var("SELECT COUNT(ParliamentaryID) FROM $table_name");
// prepara i parametri della query, come solito pagina corrente, ordinamento e direzione
$paged = isset($_REQUEST['paged']) ? max(0, intval($_REQUEST['paged']) - 1) : 0;
$orderby = (isset($_REQUEST['orderby']) && in_array($_REQUEST['orderby'], array_keys($this->get_sortable_columns()))) ? $_REQUEST['orderby'] : 'name';
$order = (isset($_REQUEST['order']) && in_array($_REQUEST['order'], array('asc', 'desc'))) ? $_REQUEST['order'] : 'asc';
// [OBBLIGATORIO] definisci l'array $items
// nota che l'ultimo argomento è ARRAY_A, quindi recupereremo un array
$this->items = $wpdb->get_results($wpdb->prepare("SELECT Title,StartDate,EndDate,ParliamentaryID FROM oop_parliamentary_info ", $per_page, $paged), ARRAY_A);
// loop attraverso gli elementi e formatta
foreach ($this->items as $item ) {
static $row_class = '';
$row_class = ( $row_class == '' ? ' class="alternate"' : '' );
echo '<tr' . $row_class . '>';
echo '</tr>';
}
// [OBBLIGATORIO] configura la paginazione
$this->set_pagination_args(array(
'total_items' => $total_items, // totale elementi definito sopra
'per_page' => $per_page, // per pagina costante definita all'inizio del metodo
'total_pages' => ceil($total_items / $per_page) // calcola il numero di pagine
));
}
function single_row_columns($item) {
list($columns, $hidden) = $this->get_column_info();
foreach ($columns as $column_name => $column_display_name) {
$class = "class='$column_name column-$column_name'";
$style = '';
if (in_array($column_name, $hidden))
$style = ' style="display:none;"';
$attributes = "$class$style";
if ('cb' == $column_name) {
echo "<td $attributes>";
echo "</td>";
}
elseif ('ParliamentaryID' == $column_name) {
echo "<td $attributes>";
echo '<a href="#">', '';
echo "</a>";
echo "<div class='row-actions'><span class='edit'>";
echo sprintf('<a class="editParlRow" href="?page=%s&action=%s&gid=%s">Modifica</a>',$_REQUEST['page'],'edit',$item['ParliamentaryID']);
echo "</span> | <span class='trash'>";
echo sprintf('<a href="?page=%s&action=%s&gid=%s">Elimina</a>',$_REQUEST['page'],'delete',$item['ParliamentaryID']);
echo "</span></div></td>";
}
else {
echo "<td $attributes>";
echo $this->column_default( $item, $column_name );
echo "</td>";
}
}
}
}

Il tuo WP_List_Table sarà diverso - questo è stato adattato da WP_List_Table – una guida passo passo e utilizzando il GIST: Plugin di esempio per l'uso della classe WP_List_Table (versione completa). Dovrai modificare i tuoi metodi per includere anche il CSS sul front-end (non incluso in questa risposta).
AVVISO :
Poiché questa classe è contrassegnata come privata, gli sviluppatori dovrebbero usarla solo a loro rischio in quanto questa classe è soggetta a modifiche nelle future versioni di WordPress. Si incoraggia vivamente tutti gli sviluppatori che utilizzano questa classe a testare i loro plugin con tutte le versioni beta/RC di WordPress per mantenere la compatibilità.
PREPARAZIONE DEL FRONT-END
add_action ('init', function(){
// Se non siamo nel back-end non ci aspettiamo di caricare questi elementi
if( ! is_admin() ){
require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
require_once( ABSPATH . 'wp-admin/includes/screen.php' );
require_once( ABSPATH . 'wp-admin/includes/class-wp-screen.php' );
require_once( ABSPATH . 'wp-admin/includes/template.php' );
global $myListTable;
$myListTable = new My_Example_List_Table();
}
});
RENDER
function my_render_list_page(){
global $myListTable;
echo '</pre><div class="wrap"><h2>Il mio test di List Table</h2>';
$myListTable->prepare_items();
?>
<form method="post">
<input type="hidden" name="page" value="ttest_list_table">
<?php
$myListTable->search_box( 'search', 'search_id' );
$myListTable->display();
echo '</form></div>';
}
NELLA TUA PAGINA
my_render_list_page();
VERSIONE CONDENSATA
function my_render_list_page(){
static $myListTable;
if( ! isset($myListTable)) {
require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
require_once(ABSPATH . 'wp-admin/includes/screen.php');
require_once(ABSPATH . 'wp-admin/includes/class-wp-screen.php');
require_once(ABSPATH . 'wp-admin/includes/template.php');
$myListTable = new My_Example_List_Table();
}
echo '</pre><div class="wrap"><h2>Il mio test di List Table</h2>';
$myListTable->prepare_items();
?>
<form method="post">
<input type="hidden" name="page" value="ttest_list_table">
<?php
$myListTable->search_box('search', 'search_id');
$myListTable->display();
echo '</form></div>';
}

In questo modo stai caricando (molto presto) i 4 file in tutte le richieste frontend, anche per le pagine che non utilizzano la funzione my_render_list_page()
. Perché non includi il file e istanzi la classe all'interno della funzione my_render_list_page()
? Questo renderebbe il codice più semplice, più leggibile e privo di variabili globali...
