Tabel Database Kustom Di WordPress: Bagian 2

Diterbitkan: 2022-08-01

Di bagian pertama dari seri kami tentang Tabel Database Kustom di WordPress, kami melihat bagaimana Anda dapat membuat tabel database kustom dari dalam plugin kustom Anda sendiri. Di Bagian 2, kami akan memandu Anda melalui bagaimana Anda dapat memodifikasi tabel kustom WordPress, termasuk cara menghapus tabel database kustom setelah penghapusan plugin. Selain itu, kami akan menjelaskan bagaimana Anda dapat menambahkan item menu untuk plugin di area admin, dengan opsi untuk melihat atau menambahkan entri di tabel data kustom Anda.

Cara Menghapus Tabel Kustom Anda Setelah Penghapusan Plugin

Untuk menghapus tabel saat plugin itu sendiri dihapus, kita perlu menggunakan fungsi register_uninstall_hook() yang disediakan WordPress untuk mengatur pengait penghapusan untuk sebuah plugin.

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

Jika Anda menonaktifkan dan menghapus plugin sekarang, Anda sekarang akan melihat bahwa tabel "siswa" dalam database telah berhasil dihapus.

Item dan Halaman Menu Admin Tabel Kustom

Di bagian ini, kami akan menunjukkan cara menambahkan halaman admin, bersama dengan item menunya, untuk tabel kustom "siswa".

Item Menu Admin

Berikut adalah potongan kode yang dapat Anda coba – tambahkan ke file plugin PHP saat ini:

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

Sekarang di area admin, Anda akan melihat sesuatu seperti ini.

Seperti yang diharapkan, Anda akan melihat bahwa tidak ada yang ditampilkan saat Anda mengklik salah satu ikon. Kami akan mendefinisikan konten halaman di bagian berikutnya, tetapi pertama-tama, mari kita periksa baris kode di atas untuk memahami cara kerjanya.

Host situs web Anda dengan Pressidium

GARANSI UANG KEMBALI 60 HARI

LIHAT RENCANA KAMI

Karena kami ingin membuat item menu tingkat atas dan dua subitem, kami menggunakan fungsi add_menu_page() dan add_submenu_page() yang disediakan WordPress. Fungsi-fungsi ini menerima argumen berikut:

 add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position )
  • $page_title diperlukan untuk didefinisikan dan pada dasarnya ini adalah bagian pertama dari tag judul halaman yang Anda arahkan ketika memilih item menu ini. Dalam kasus kami, students_custom_table .
  • $menu_title -juga diperlukan- adalah teks yang akan digunakan untuk menu. Kami memilih "Siswa" sebagai teks.
  • $capability adalah kemampuan yang diperlukan agar menu ini dapat ditampilkan oleh pengguna. Dalam kasus kami, kami memilih izin activate_plugins . Secara default, ini hanya diberikan kepada Pengguna Super dan Administrator. Jika Anda ingin memahami peran atau kemampuan mana yang sesuai dengan kebutuhan Anda, Anda dapat berkonsultasi dengan dokumentasi resmi terkait.
  • $menu_slug adalah string students kami yang muncul tepat setelah izin. Itu juga wajib dan harus unik. Ini hanya menggunakan karakter alfanumerik huruf kecil, tanda hubung, dan garis bawah yang kompatibel dengan sanitize_key().
  • $icon_url adalah argumen opsional dan merupakan URL yang menautkan ke file ikon yang akan digunakan untuk item menu. Kami memilih satu dari pustaka WordPress dashicons.
  • $position adalah di mana Anda secara opsional mengatur posisi dalam urutan menu item ini akan muncul.
 add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position )

Terlepas dari parameter yang memiliki kesamaan dengan add_menu_page , kami juga melihat

  • Parameter $parent_slug adalah string yang diperlukan untuk menu induk, dalam kasus kami, students .
  • Argumen $function adalah tempat Anda mendefinisikan fungsi callback yang akan membuat konten halaman pengaturan. Dalam kasus kami, ini adalah students_custom_table_page_handler() , untuk tabel tampilan siswa, dan students_custom_table_page_handler_add_form() , untuk formulir yang akan kita gunakan untuk menambahkan siswa.
    Kami belum mendeklarasikan fungsi-fungsi ini, tetapi kami akan segera mendeklarasikannya.

Tampilan Catatan Tabel Kustom

Mari kita mulai dengan menambahkan kode yang akan menampilkan tabel siswa di bawah item menu “Siswa”.

Untuk menampilkan data tabel admin, WordPress memperluas WP_List_Table . Kelas WP_List_Table diperkenalkan sebagai kelas privat dalam file wp-admin/includes/class-wp-list-table.php. Kelas privat dinamai privat karena hanya dimaksudkan untuk digunakan oleh kelas dan fungsi inti lainnya dan bukan oleh pengembang.

Namun, WordPress menawarkan Anda kemampuan untuk mendefinisikan ulang kelas ini dengan memperluasnya. Jadi, yang akan kita lakukan adalah membuat kelas khusus, di mana kita akan mendefinisikan kembali properti dan metode kelas WP_List_Table , untuk mengisi tabel admin dengan data yang kita inginkan. Kami menamai kelas "Students_Custom_Table_List_Table" dan baris kode yang kami butuhkan adalah sebagai berikut.

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

Jika Anda memeriksa kode dengan cermat, Anda akan melihat bagaimana kolom 'umur' dan 'alamat_ip' didefinisikan. Sekarang kita dapat melanjutkan dan juga menentukan fungsi yang pada akhirnya akan memberi kita isi layar admin "Siswa".

 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 }

Singkatnya, pertama-tama kita membuat instance kelas Students_Custom_Table_List_Table kustom dan kemudian elemen html yang akan menyertakan data tabel siswa. Anda seharusnya dapat melihat tabel yang ditampilkan sekarang, tetapi perhatikan bahwa tabel tersebut akan kosong.

Sekarang kita telah melakukan ini, mari tambahkan beberapa siswa.!

Membuat Formulir Untuk Menambahkan Data Kustom Kami

Seperti yang kami sebutkan sebelumnya, fungsi yang bertanggung jawab untuk menambahkan siswa adalah 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 }

Seperti yang Anda lihat dalam kode, pertama-tama kita menetapkan array $default yang akan digunakan untuk record baru kita.

Selanjutnya, setelah kami memverifikasi bahwa permintaan telah diposting dan kami memiliki nonce yang benar, kami menggunakan shortcode_atts(). Ini adalah fungsi WordPress bawaan yang sangat berguna yang menggabungkan parameter yang diberikan dan mengisi default saat dibutuhkan.

Dan akhirnya, kami menambahkan kotak meta khusus kami dan memasukkan data ke dalam tabel khusus, menerima pesan yang memberi tahu kami bahwa prosesnya berhasil.

Untuk keperluan tutorial ini, kami melewatkan beberapa elemen yang, jika digunakan di dunia nyata, ingin Anda tambahkan. Ini termasuk memvalidasi informasi yang ditambahkan ke database dengan melakukan hal-hal seperti menentukan apa yang terjadi jika nama duplikat atau email ditambahkan.

Last but not least, kita harus menambahkan handler untuk kotak meta kustom kita:

 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 }

Dan itu saja. Sekarang kami memiliki plugin khusus yang memungkinkan kami untuk menambahkan siswa, melihat daftar siswa atau menghapus siswa, dan menyimpan data dalam tabel database khusus!