Come aggiungere una WP_List_Table a una pagina WordPress?

17 dic 2015, 22:30:59
Visualizzazioni: 18.3K
Voti: 8

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>";
            } 
        } 
    }
}
5
Commenti

A quale pagina stai aggiungendo questo elemento? Nella sezione di amministrazione del sito o su una pagina personalizzata? Vuoi poter filtrare i risultati o semplicemente elencare i contenuti? Puoi anche mostrare da dove stai ottenendo i dati per popolare le tue tabelle?

jgraup jgraup
17 dic 2015 22:42:55

Ho fatto funzionare su una pagina di amministrazione ma mi piacerebbe farlo funzionare su una pagina personalizzata o su qualsiasi pagina in generale

Napstar Napstar
17 dic 2015 22:47:46

Sembra una funzionalità interna - "Sebbene WP_List_Table sia stato progettato per uso interno e non abbia preso in considerazione molte personalizzazioni per le sottoclassi, riconosciamo che gli sviluppatori lo utilizzano e che una pulizia del codice sarebbe vantaggiosa sia per le implementazioni che per la manutenzione futura." - https://make.wordpress.org/core/2015/08/08/list-table-changes-in-4-3/ Stai semplicemente cercando di visualizzare dati in colonne sul front-end?

jgraup jgraup
17 dic 2015 22:52:38

Esistono diversi plugin jQuery per le tabelle http://www.unheap.com/section/user-interface/filter-sort/ e http://www.unheap.com/section/media/tables-graphs/ per esempio

jgraup jgraup
17 dic 2015 23:00:25

@jgraup sì, sto cercando di elencare i dati delle colonne sul front-end

Napstar Napstar
17 dic 2015 23:10:18
Tutte le risposte alla domanda 1
3
11

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>';
}
17 dic 2015 23:24:02
Commenti

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...

gmazzap gmazzap
19 dic 2015 02:30:33

Ottimo punto @gmazzap

jgraup jgraup
24 ago 2016 23:03:34

@jgraup Grazie per questo. Funziona. Tuttavia ricevo un notice di errore: Notice: Undefined index: hook_suffix in \wp-admin\includes\class-wp-screen.php on line 213

samjco-com samjco-com
15 set 2019 05:54:06