Cum să adaug un tabel WP_List_Table în pagină WordPress
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';

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).
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>';
}

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