Niestandardowe tabele baz danych w WordPress: część 2

Opublikowany: 2022-08-01

W pierwszej części naszej serii poświęconej niestandardowym tabelom bazy danych w WordPressie przyjrzeliśmy się, jak można utworzyć niestandardową tabelę bazy danych z poziomu własnej niestandardowej wtyczki. W części 2 omówimy, jak zmodyfikować niestandardową tabelę WordPress, w tym jak usunąć niestandardową tabelę bazy danych po usunięciu wtyczki. Ponadto wyjaśnimy, w jaki sposób możesz dodawać elementy menu dla wtyczki w obszarze administracyjnym, z opcjami przeglądania lub dodawania wpisów w niestandardowej tabeli danych.

Jak usunąć niestandardową tabelę po usunięciu wtyczki?

Aby usunąć tabelę po usunięciu samej wtyczki, musimy użyć funkcji register_uninstall_hook() udostępnianej przez WordPress do ustawienia zaczepu dezinstalacji wtyczki.

 function uninstall_students_plugin(){ global $wpdb; $table_name = $wpdb->prefix . 'students'; $wpdb->query("DROP TABLE IF EXISTS $table_name"); } register_uninstall_hook(__FILE__,'uninstall_students_plugin');

Jeśli teraz dezaktywujesz i usuniesz wtyczkę, powinieneś zobaczyć, że tabela „students” w bazie danych została pomyślnie usunięta.

Pozycje i strona menu administratora tabeli niestandardowej

W tej sekcji pokażemy, jak dodać stronę administratora wraz z jej pozycjami menu dla niestandardowej tabeli „students”.

Pozycje menu administratora

Oto fragment kodu, który możesz wypróbować – dołącz go do bieżącego pliku PHP wtyczki:

 function students_custom_table_admin_menu() { add_menu_page(__('Students', 'students_custom_table'), __('Students', 'students_custom_table'), 'activate_plugins', 'students', 'students_custom_table_page_handler', 'dashicons-welcome-learn-more', '5'); add_submenu_page('students', __('Students', 'students_custom_table'), __('Students', 'students_custom_table'), 'activate_plugins', 'students', 'students_custom_table_page_handler'); add_submenu_page('students', __('Add new', 'students_custom_table'), __('Add new', 'students_custom_table'), 'activate_plugins', 'students_form', 'students_custom_table_page_handler_add_form'); } add_action('admin_menu', 'students_custom_table_admin_menu');

Teraz w panelu administracyjnym powinieneś zobaczyć coś takiego.

Zgodnie z oczekiwaniami zobaczysz, że po kliknięciu dowolnej ikony nic nie jest wyświetlane. Zdefiniujemy zawartość strony w następnej sekcji, ale najpierw przyjrzyjmy się powyższym wierszom kodu, aby zrozumieć, jak działają.

Hostuj swoją stronę internetową z Pressidium

60- DNIOWA GWARANCJA ZWROTU PIENIĘDZY

ZOBACZ NASZE PLANY

Ponieważ chcemy utworzyć pozycję menu najwyższego poziomu i dwa podpozycje, użyliśmy zarówno funkcji add_menu_page(), jak i add_submenu_page(), które zapewnia WordPress. Te funkcje akceptują następujące argumenty:

 add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position )
  • Wymagane jest zdefiniowanie $page_title i jest to w zasadzie pierwsza część tagów tytułu strony, do której zostaniesz przekierowany po wybraniu tej pozycji menu. W naszym przypadku students_custom_table .
  • $menu_title wymagane- to tekst, który ma być użyty w menu. Jako tekst wybraliśmy „Studenci”.
  • $capability to zdolność wymagana do wyświetlenia tego menu przez użytkownika. W naszym przypadku wybraliśmy uprawnienie activate_plugins . Domyślnie jest przyznawany tylko superużytkownikom i administratorom. Jeśli chcesz zrozumieć, która rola lub zdolność odpowiada Twoim potrzebom, możesz zapoznać się z odpowiednią oficjalną dokumentacją.
  • $menu_slug to ciąg naszych students , który pojawia się zaraz po uzyskaniu pozwolenia. Jest również wymagany i powinien być unikalny. Używa tylko małych znaków alfanumerycznych, myślników i znaków podkreślenia, które są kompatybilne z sanitize_key().
  • $icon_url jest opcjonalnym argumentem i jest adresem URL, który łączy się z plikiem ikony, który będzie używany dla elementu menu. Wybraliśmy jeden z biblioteki dashicons WordPress.
  • $position to miejsce, w którym można opcjonalnie ustawić pozycję w kolejności menu, w której ta pozycja powinna się pojawiać.
 add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position )

Oprócz parametrów, które ma wspólne z add_menu_page , widzimy również

  • Parametr $parent_slug jest wymaganym ciągiem dla menu nadrzędnego, w naszym przypadku students .
  • Argument $function służy do definiowania funkcji zwrotnej, która utworzy zawartość strony ustawień. W naszym przypadku jest to students_custom_table_page_handler() , dla wyświetlanej tabeli uczniów, oraz students_custom_table_page_handler_add_form() , dla formularza, którego będziemy używać do dodawania uczniów.
    Nie zadeklarowaliśmy jeszcze tych funkcji, ale za chwilę to zrobimy.

Wyświetlanie rekordów tabeli niestandardowej

Zacznijmy od dodania kodu, który wyświetli tabelę studentów pod pozycją menu „Studenci”.

Aby wyświetlić dane z tabel administracyjnych, WordPress rozszerza wbudowaną WP_List_Table . Klasa WP_List_Table jest wprowadzona jako klasa prywatna w pliku wp-admin/includes/class-wp-list-table.php. Klasy prywatne są nazywane prywatnymi, ponieważ są przeznaczone tylko do użytku przez inne podstawowe klasy i funkcje, a nie przez programistów.

Jednak WordPress oferuje możliwość przedefiniowania tej klasy poprzez jej rozszerzenie. Tak więc stworzymy niestandardową klasę, w której przedefiniujemy właściwości i metody klasy WP_List_Table , aby zapełnić tabelę administracyjną żądanymi danymi. Nazwaliśmy klasę „Students_Custom_Table_List_Table”, a potrzebne nam wiersze kodu są następujące.

 if (!class_exists('WP_List_Table')) { require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php'); } class Students_Custom_Table_List_Table extends WP_List_Table { function __construct() { global $status, $page; parent::__construct(array( 'singular' => 'person', 'plural' => 'persons', )); } function column_default($item, $column_name) { return $item[$column_name]; } function column_age($item) { return '<em>' . $item['age'] . '</em>'; } function column_ip($item) { return '<em>' . $item['ip_address'] . '</em>'; } function column_name($item) { $actions = array( 'edit' => sprintf('<a href="?page=students_form&id=%s">%s</a>', $item['id'], __('Edit', 'students_custom_table')), 'delete' => sprintf('<a href="?page=%s&action=delete&id=%s">%s</a>', $_REQUEST['page'], $item['id'], __('Delete', 'students_custom_table')), ); return sprintf('%s %s', $item['name'], $this->row_actions($actions) ); } function column_cb($item) { return sprintf( '<input type="checkbox" name="id[]" value="%s" />', $item['id'] ); } function get_columns() { $columns = array( 'cb' => '<input type="checkbox" />', //Render a checkbox instead of text 'name' => __('Name', 'students_custom_table'), 'email' => __('E-Mail', 'students_custom_table'), 'age' => __('Age', 'students_custom_table'), 'ip_address' => __('IP address', 'students_custom_table'), ); return $columns; } function get_sortable_columns() { $sortable_columns = array( 'name' => array('name', true), 'email' => array('email', false), 'age' => array('age', false), 'ip_address' => array('ip_address', false), ); return $sortable_columns; } function get_bulk_actions() { $actions = array( 'delete' => 'Delete' ); return $actions; } function process_bulk_action() { global $wpdb; $table_name = $wpdb->prefix . 'students'; // do not forget about tables prefix 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)"); } } } function prepare_items() { global $wpdb; $table_name = $wpdb->prefix . 'students'; $per_page = 5; $columns = $this->get_columns(); $hidden = array(); $sortable = $this->get_sortable_columns(); $this->_column_headers = array($columns, $hidden, $sortable); $this->process_bulk_action(); $total_items = $wpdb->get_var("SELECT COUNT(id) FROM $table_name"); $paged = isset($_REQUEST['paged']) ? ($per_page * 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'; $this->items = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name ORDER BY $orderby $order LIMIT %d OFFSET %d", $per_page, $paged), ARRAY_A); $this->set_pagination_args(array( 'total_items' => $total_items, 'per_page' => $per_page, 'total_pages' => ceil($total_items / $per_page) )); } }

Jeśli dokładnie przyjrzysz się kodowi, zauważysz, jak zdefiniowane są kolumny 'age' i 'ip_address'. Teraz możemy kontynuować, a także zdefiniować funkcję, która w końcu dostarczy nam zawartość ekranu administratora „Uczniowie”.

 function students_custom_table_page_handler() { global $wpdb; $table = new Students_Custom_Table_List_Table(); $table->prepare_items(); $message = ''; if ('delete' === $table->current_action()) { $message = '<div class="updated below-h2"><p>' . sprintf(__('Items deleted: %d', 'students_custom_table'), count($_REQUEST['id'])) . '</p></div>'; } ?> <div class="wrap"> <div class="icon32 icon32-posts-post"><br></div> <h2><?php _e('Students', 'students_custom_table')?> <a class="add-new-h2" href="<?php echo get_admin_url(get_current_blog_id(), 'admin.php?page=students_form');?>"><?php _e('Add new', 'students_custom_table')?></a> </h2> <?php echo $message; ?> <form method="GET"> <input type="hidden" name="page" value="<?php echo $_REQUEST['page'] ?>"/> <?php $table->display() ?> </form> </div> <?php }

Krótko mówiąc, najpierw utworzyliśmy instancję niestandardowej klasy Students_Custom_Table_List_Table , a następnie elementy html, które będą zawierać dane tabeli uczniów. Powinieneś widzieć teraz wyświetlaną tabelę, ale pamiętaj, że będzie ona pusta.

Teraz to zrobiliśmy, dodajmy kilku uczniów!

Tworzenie formularza w celu dodania naszych niestandardowych danych

Jak wspomnieliśmy wcześniej, funkcją odpowiedzialną za dodawanie uczniów będzie students_custom_table_page_handler_add_form() .

 function students_custom_table_page_handler_add_form() { global $wpdb; $table_name = $wpdb->prefix . 'students'; $message = ''; $notice = ''; $default = array( 'id' => 0, 'name' => '', 'email' => '', 'age' => null, 'ip_address' => null, ); if (wp_verify_nonce($_REQUEST['nonce'], basename(__FILE__))) { $item = shortcode_atts($default, $_REQUEST); $result = $wpdb->insert($table_name, $item); $item['id'] = $wpdb->insert_id; if ($result) { $message = __('Item was successfully saved', 'students_custom_table'); } else { $notice = __('There was an error while saving item', 'students_custom_table'); } } add_meta_box('students_form_meta_box', 'Student data', 'students_custom_table_students_form_meta_box_handler', 'student', 'normal', 'default'); ?> <div class="wrap"> <div class="icon32 icon32-posts-post"><br></div> <h2><?php _e('Student', 'students_custom_table')?> <a class="add-new-h2" href="<?php echo get_admin_url(get_current_blog_id(), 'admin.php?page=students');?>"><?php _e('back to list', 'students_custom_table')?></a> </h2> <?php if (!empty($notice)): ?> <div class="error"><p><?php echo $notice ?></p></div> <?php endif;?> <?php if (!empty($message)): ?> <div class="updated"><p><?php echo $message ?></p></div> <?php endif;?> <form method="POST"> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce(basename(__FILE__))?>"/> <input type="hidden" name="id" value="<?php echo $item['id'] ?>"/> <div class="metabox-holder"> <div> <div> <?php do_meta_boxes('student', 'normal', $item); ?> <input type="submit" value="<?php _e('Save', 'students_custom_table')?>" class="button-primary" name="submit"> </div> </div> </div> </form> </div> <?php }

Jak widać w kodzie, najpierw ustawiliśmy tablicę $default , która będzie używana dla naszych nowych rekordów.

Następnie, po sprawdzeniu, że żądanie zostało wysłane i mamy poprawny numer jednorazowy, używamy funkcji shortcode_atts(). Jest to bardzo przydatna wbudowana funkcja WordPress, która łączy podane parametry i w razie potrzeby uzupełnia wartości domyślne.

Na koniec dodajemy nasze niestandardowe pole meta i wstawiamy dane do tabeli niestandardowej, otrzymując wiadomość informującą nas, że proces się powiódł.

Na potrzeby tego samouczka pominęliśmy kilka elementów, które, jeśli są używane w prawdziwym świecie, chciałbyś dodać. Obejmują one weryfikację informacji dodanych do bazy danych, na przykład określenie, co się stanie, jeśli zostanie dodana zduplikowana nazwa lub adres e-mail.

Na koniec powinniśmy dodać procedurę obsługi dla naszego niestandardowego pola meta:

 function students_custom_table_students_form_meta_box_handler($item) { ?> <table cellspacing="2" cellpadding="5" class="form-table"> <tbody> <tr class="form-field"> <th valign="top" scope="row"> <label for="name"><?php _e('Name', 'students_custom_table')?></label> </th> <td> <input name="name" type="text" value="<?php echo esc_attr($item['name'])?>" size="50" class="code" placeholder="<?php _e('Your name', 'students_custom_table')?>" required> </td> </tr> <tr class="form-field"> <th valign="top" scope="row"> <label for="email"><?php _e('E-Mail', 'students_custom_table')?></label> </th> <td> <input name="email" type="email" value="<?php echo esc_attr($item['email'])?>" size="50" class="code" placeholder="<?php _e('Your E-Mail', 'students_custom_table')?>" required> </td> </tr> <tr class="form-field"> <th valign="top" scope="row"> <label for="age"><?php _e('Age', 'students_custom_table')?></label> </th> <td> <input name="age" type="number" value="<?php echo esc_attr($item['age'])?>" size="50" class="code" placeholder="<?php _e('Your age', 'students_custom_table')?>" required> </td> </tr> <tr class="form-field"> <th valign="top" scope="row"> <label for="ip_address"><?php _e('IP', 'students_custom_table')?></label> </th> <td> <input name="ip_address" type="number" value="<?php echo esc_attr($item['ip_address'])?>" size="50" class="code" placeholder="<?php _e('Your IP address', 'students_custom_table')?>" required> </td> </tr> </tbody> </table> <?php }

I to wszystko. Teraz mamy niestandardową wtyczkę, która pozwala nam dodawać uczniów, przeglądać listę uczniów lub usuwać uczniów i przechowywać dane w niestandardowej tabeli bazy danych!