Cum să adaug un tabel WP_List_Table în pagină WordPress

17 dec. 2015, 22:30:59
Vizualizări: 18.3K
Voturi: 8

Am o clasă WP_List_Table și aș dori să o adaug pe o pagină, dar după ce am căutat nu am găsit exemple concrete despre cum să fac asta. Are cineva un fragment de cod care să mă ajute să realizez acest lucru?

<?php
/*
Plugin Name: Add Parl Plugin 2
Description: Pentru adăugarea parlamentelor
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'; // versiune schimbată de la 1.0 la 1.1
  global $wpdb;
    global $custom_table_example_db_version;

    $table_name = $wpdb->prefix . 'oop_parliamentary_info'; // nu uita de prefixul tabelelor


/**
 * PARTEA 2. Definirea Listei cu Tabel Personalizat
 * ============================================================================
 *
 * În această parte vei defini o clasă pentru lista tabelului personalizat,
 * care va afișa înregistrările din baza de date într-un tabel atractiv
 *
 * 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');
}
/**
 * Clasa Custom_Table_Example_List_Table care va afișa înregistrările
 * din tabelul nostru personalizat într-un tabel organizat
 */
class Custom_Table_Example_List_Table extends WP_List_Table
{
    /**
     * [OBLIGATORIU] Trebuie să declari constructorul și să oferi câțiva parametri de bază
     */
    function __construct()
    {
        global $status, $page;

        parent::__construct(array(
            'singular' => 'persoană',
            'plural' => 'persoane',
        ));
    }

    /**
     * [OBLIGATORIU] aceasta este funcția implicită de randare a coloanei
     *
     * @param $item - rând (array cheie, valoare)
     * @param $column_name - string (cheie)
     * @return HTML
     */
    function column_default($item, $column_name)
    {
        return $item[$column_name];
    }

    /**
     * [OPȚIONAL] acesta este un exemplu despre cum să randăm o coloană specifică
     *
     * numele metodei trebuie să fie de forma: "column_[nume_coloană]"
     *
     * @param $item - rând (array cheie, valoare)
     * @return HTML
     */
    function column_age($item)
    {
        return '<em>' . $item['age'] . '</em>';
    }

    /**
     * [OPȚIONAL] exemplu despre cum să randăm coloana cu acțiuni,
     * când treci cu mouse-ul peste rând apar linkurile "Editare | Ștergere"
     *
     * @param $item - rând (array cheie, valoare)
     * @return HTML
     */
    function column_name($item)
    {
        // linkuri care merg către /admin.php?page=[pagina_pluginului][&alți_parametri]
        // observă cum am folosit $_REQUEST['page'], deci acțiunea se va întâmpla pe pagina curentă
        // de asemenea, observă cum folosim $this->_args['singular'] așa că în acest exemplu va fi
        // ceva de genul &persoană=2
        /*$actions = array(
            'edit' => sprintf('<a href="?page=persons_form&id=%s">%s</a>', $item['id'], __('Editare', 'custom_table_example')),
            'delete' => sprintf('<a href="?page=%s&action=delete&id=%s">%s</a>', $_REQUEST['page'], $item['id'], __('Ștergere', 'custom_table_example')),
        );

        return sprintf('%s %s',
            $item['Title'],
            $this->row_actions($actions)
        );
        */

  $actions = array(
            'edit'      => sprintf('<a href="?page=%s&action=%s&book=%s">Editare</a>',$_REQUEST['page'],'edit',$item['ParliamentaryID']),
            'delete'    => sprintf('<a href="?page=%s&action=%s&book=%s">Ștergere</a>',$_REQUEST['page'],'delete',$item['ParliamentaryID']),
        );

  return sprintf('%1$s %2$s', $item['booktitle'], $this->row_actions($actions) );
    }

    /**
     * [OBLIGATORIU] cum este randată coloana cu checkbox
     *
     * @param $item - rând (array cheie, valoare)
     * @return HTML
     */
    function column_cb($item)
    {
        return sprintf(
            '<input type="checkbox" name="id[]" value="%s" />',
            $item['id']
        );
    }

    /**
     * [OBLIGATORIU] Această metodă returnează coloanele de afișat în tabel
     * poți sări peste coloanele pe care nu vrei să le afișezi
     * cum ar fi conținutul sau descrierea
     *
     * @return array
     */
    function get_columns()
    {
        $columns = array(
            'cb' => '<input type="checkbox" />', //Randare checkbox în loc de text
            'Title' => __('Titlu', 'custom_table_example'),
            'StartDate' => __('Data început', 'custom_table_example'),
            'EndDate' => __('Data sfârșit', 'custom_table_example'),
             'IsCurrent' => __('Este curent', 'custom_table_example'),
            // 'ParliamentaryID' => __('Editare', 'custom_table_example','<input type="checkbox" />'),
             ParliamentaryID =>'<a href=#>Editare</a>',

        );
        return $columns;
    }

    /**
     * [OPȚIONAL] Această metodă returnează coloanele care pot fi folosite pentru sortare
     * toate stringurile din array - sunt nume de coloane
     * observă că true pe coloana name înseamnă că este sortarea implicită
     *
     * @return array
     */
    function get_sortable_columns()
    {
        $sortable_columns = array(
            'Title' => array('Titlu', true),
            'StartDate' => array('Data început', false),
            'EndDate' => array('Data sfârșit', false),
             'IsCurrent' => __('Este curent', false),
             'ParliamentaryID'=> __('ID Parlamentar', false),

        );
        return $sortable_columns;
    }

    /**
     * [OPȚIONAL] Returnează array cu acțiuni în masă dacă există
     *
     * @return array
     */
    function get_bulk_actions()
    {
        $actions = array(
            'delete' => 'Ștergere',
            'edit' =>'Editare'
        );
        return $actions;
    }

    /**
     * [OPȚIONAL] Această metodă procesează acțiunile în masă
     * poate fi în afara clasei
     * nu poate folosi wp_redirect deoarece există deja output
     * în acest exemplu procesăm acțiunea de ștergere
     * mesajul despre ștergerea reușită va fi afișat pe pagină în partea următoare
     */
    function process_bulk_action()
    {
        global $wpdb;
        $table_name = $wpdb->prefix . 'cte'; // nu uita de prefixul tabelelor

        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 ('Editare' === $this->current_action()) {
            echo('Editare');
        }
    }

    /**
     * [OBLIGATORIU] Aceasta este cea mai importantă metodă
     *
     * Va prelua rânduri din baza de date și le va pregăti pentru afișare în tabel
     */
    function prepare_items()
    {
        global $wpdb;
        $table_name = $wpdb->prefix . 'cte'; // nu uita de prefixul tabelelor
         $table_name='oop_parliamentary_info';

        $per_page = 5; // constantă, câte înregistrări vor fi afișate pe pagină

        $columns = $this->get_columns();
        $hidden = array();
        $sortable = $this->get_sortable_columns();

        // aici configurăm antetele tabelului, definite în metodele noastre
        $this->_column_headers = array($columns, $hidden, $sortable);

        // [OPȚIONAL] procesează acțiunile în masă dacă există
        $this->process_bulk_action();

        // va fi folosit pentru setările de paginare
        $total_items = $wpdb->get_var("SELECT COUNT(ParliamentaryID) FROM $table_name");

        // pregătește parametrii query, ca de obicei pagina curentă, ordonare după și direcția de ordonare
        $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'] : 'nume';
        $order = (isset($_REQUEST['order']) && in_array($_REQUEST['order'], array('asc', 'desc'))) ? $_REQUEST['order'] : 'asc';
5
Comentarii

La ce pagină adaugi asta? În secțiunea de administrare a site-ului sau pe o pagină personalizată? Dorești să poți filtra rezultatele sau doar să listezi conținutul? Poți să arăți și de unde obții datele pentru a popula tabelele tale?

jgraup jgraup
17 dec. 2015 22:42:55

Am reușit să funcționeze pe o pagină de administrare, dar aș dori să fac asta să funcționeze pe o pagină personalizată sau pe orice pagină în general.

Napstar Napstar
17 dec. 2015 22:47:46

Aceasta pare a fi o caracteristică internă - "În timp ce WP_List_Table a fost proiectat pentru uz intern și nu a făcut multe considerații pentru subclase personalizate, recunoaștem că dezvoltatorii le folosesc și că o curățare ar beneficia atât implementările, cât și întreținerea viitoare." - https://make.wordpress.org/core/2015/08/08/list-table-changes-in-4-3/ Încerci doar să listezi date în coloane pe partea de front-end?

jgraup jgraup
17 dec. 2015 22:52:38

Există destul de multe plugin-uri jQuery pentru tabele http://www.unheap.com/section/user-interface/filter-sort/ & http://www.unheap.com/section/media/tables-graphs/ de exemplu

jgraup jgraup
17 dec. 2015 23:00:25

@jgraup da, încerc să afișez datele coloanelor în front-end

Napstar Napstar
17 dec. 2015 23:10:18
Toate răspunsurile la întrebare 1
3
11

Tabelul tău WP_List_Table va fi diferit - acesta a fost adaptat din WP_List_Table – un ghid pas cu pas și folosind GIST-ul: Plugin de exemplu pentru utilizarea clasei WP_List_Table (versiune completă). Vei dori să ajustezi metodele tale pentru a include și CSS pe front-end (neincluse în acest răspuns).

AVERTIZARE :

Deoarece această clasă este marcată ca privată, dezvoltatorii ar trebui să o folosească doar pe propriul risc, deoarece această clasă este supusă modificărilor în viitoarele versiuni de WordPress. Oricare dezvoltatori care folosesc această clasă sunt puternic încurajați să testeze plugin-urile lor cu toate versiunile beta/RC de WordPress pentru a menține compatibilitatea.

PREGĂTIREA FRONT-END-ULUI

add_action ('init', function(){

   // Dacă nu suntem în back-end, nu ne așteptăm să încărcăm aceste lucruri

   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();
   }
});

RANDAJ

function my_render_list_page(){

    global $myListTable;

    echo '</pre><div class="wrap"><h2>Testul Meu de Tabel Listă</h2>';
    $myListTable->prepare_items();

    ?>
    <form method="post">
        <input type="hidden" name="page" value="ttest_list_table">
    <?php

        $myListTable->search_box( 'căutare', 'search_id' );
        $myListTable->display();

    echo '</form></div>';
}

PE PAGINA TA

my_render_list_page();

VERSIUNE CONDENSATĂ

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>Testul Meu de Tabel Listă</h2>';
    $myListTable->prepare_items();

?>
<form method="post">
    <input type="hidden" name="page" value="ttest_list_table">
<?php

    $myListTable->search_box('căutare', 'search_id');
    $myListTable->display();

    echo '</form></div>';
}
17 dec. 2015 23:24:02
Comentarii

În acest fel încarci (foarte devreme) cele 4 fișiere în toate cererile frontend, chiar și pentru paginile care nu folosesc funcția my_render_list_page(). De ce nu încarci fișierul și instantiezi clasa în interiorul funcției my_render_list_page()? Asta ar face codul mai simplu, mai lizibil și fără globale...

gmazzap gmazzap
19 dec. 2015 02:30:33

Bun punct @gmazzap

jgraup jgraup
24 aug. 2016 23:03:34

@jgraup Mulțumesc pentru asta. Funcționează. Totuși, primesc o notificare de eroare: Notice: Undefined index: hook_suffix in \wp-admin\includes\class-wp-screen.php on line 213

samjco-com samjco-com
15 sept. 2019 05:54:06