Tabelas de banco de dados personalizadas no WordPress: Parte 2

Publicados: 2022-08-01

Na primeira parte de nossa série sobre Tabelas de banco de dados personalizadas no WordPress, vimos como você pode criar uma tabela de banco de dados personalizada de dentro do seu próprio plug-in personalizado. Na Parte 2, mostraremos como você pode modificar e modificar uma tabela personalizada do WordPress, incluindo como excluir a tabela de banco de dados personalizada após a exclusão do plug-in. Além disso, explicaremos como você pode adicionar itens de menu para o plug-in na área de administração, com opções para visualizar ou adicionar entradas em sua tabela de dados personalizada.

Como excluir sua tabela personalizada após a exclusão do plug-in

Para excluir a tabela quando o próprio plug-in é excluído, precisamos usar a função register_uninstall_hook() que o WordPress fornece para definir o gancho de desinstalação de um plug-in.

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

Se você desativar e excluir o plug-in agora, deverá ver que a tabela “alunos” no banco de dados foi excluída com sucesso.

Página e itens do menu de administração de tabela personalizada

Nesta seção, mostraremos como adicionar uma página de administração, juntamente com seus itens de menu, para a tabela personalizada “alunos”.

Itens do menu de administração

Aqui está o pedaço de código que você pode tentar - anexe-o ao arquivo PHP do plugin atual:

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

Agora na área de administração, você deve ver algo assim.

Como esperado, você verá que nada é exibido ao clicar em qualquer um dos ícones. Vamos definir o conteúdo da página na próxima seção, mas primeiro, vamos examinar as linhas de código acima para entender como elas funcionam.

Hospede seu site com a Pressidium

GARANTIA DE DEVOLUÇÃO DO DINHEIRO DE 60 DIAS

VEJA NOSSOS PLANOS

Como queremos criar um item de menu de nível superior e dois subitens, usamos a função add_menu_page() e a add_submenu_page() que o WordPress fornece. Essas funções aceitam os seguintes argumentos:

 add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position )
  • O $page_title deve ser definido e é basicamente a primeira parte das tags de título da página para a qual você é redirecionado ao selecionar este item de menu. No nosso caso, students_custom_table .
  • O $menu_title -também obrigatório- é o texto a ser usado para o menu. Escolhemos “Alunos” como texto.
  • $capability é a capacidade necessária para que este menu seja exibido pelo usuário. No nosso caso, escolhemos a permissão activate_plugins . Por padrão, ele é fornecido apenas a Superusuários e Administradores. Se você quiser entender qual função ou capacidade atende às suas necessidades, consulte a documentação oficial relacionada.
  • O $menu_slug é a string dos nossos students que vem logo após a permissão. Também é obrigatório e deve ser único. Ele usa apenas caracteres alfanuméricos minúsculos, traços e sublinhados que são compatíveis com higieniza_key().
  • O $icon_url é um argumento opcional e é a URL que vincula ao arquivo de ícone que será usado para o item de menu. Escolhemos um da biblioteca WordPress dashicons.
  • $position é onde você opcionalmente define a posição na ordem do menu em que este item deve aparecer.
 add_submenu_page( $parent_slug, $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position )

Além dos parâmetros que tem em comum com add_menu_page , também vemos

  • O parâmetro $parent_slug é a string necessária para o menu pai, em nosso caso, students .
  • O argumento $function é onde você define a função de retorno de chamada que criará o conteúdo da página de configurações. No nosso caso, é o students_custom_table_page_handler() , para a tabela de exibição dos alunos, e o students_custom_table_page_handler_add_form() , para o formulário que usaremos para adicionar alunos.
    Ainda não declaramos essas funções, mas o faremos em um tempo.

Exibição de registros de tabela personalizada

Vamos começar adicionando o código que exibirá a tabela de alunos no item de menu “Alunos”.

Para mostrar os dados das tabelas de administração, o WordPress estende a WP_List_Table . A classe WP_List_Table é introduzida como uma classe privada no arquivo wp-admin/includes/class-wp-list-table.php. As classes privadas são denominadas privadas, pois destinam-se apenas ao uso por outras classes e funções principais e não por desenvolvedores.

No entanto, o WordPress oferece a capacidade de redefinir essa classe estendendo-a. Então, o que faremos é criar uma classe customizada, onde redefiniremos as propriedades e métodos da classe WP_List_Table , para preencher a tabela admin com os dados que desejamos. Nomeamos a classe “Students_Custom_Table_List_Table” e as linhas de código que precisamos são as seguintes.

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

Se você examinar o código cuidadosamente, você notará como as colunas 'age' e 'ip_address' são definidas. Agora podemos prosseguir e também definir a função que finalmente nos dará o conteúdo da tela de administração “Alunos”.

 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 }

Resumindo, primeiro criamos uma instância da classe personalizada Students_Custom_Table_List_Table e, em seguida, os elementos html que incluirão os dados da tabela dos alunos. Você deve conseguir ver a tabela exibida agora, mas observe que ela estará vazia.

Agora que fizemos isso, vamos adicionar alguns alunos.!

Criando o formulário para adicionar nossos dados personalizados

Como mencionamos anteriormente, a função responsável por adicionar alunos será 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 }

Como você pode ver no código, primeiro definimos um array $default que será usado para nossos novos registros.

Em seguida, após verificarmos que a solicitação foi postada e temos o nonce correto, usamos o shortcode_atts(). Esta é uma função interna do WordPress muito útil que combina os parâmetros fornecidos e preenche os padrões quando necessário.

E por fim, adicionamos nossa meta box customizada e inserimos os dados na tabela customizada, recebendo uma mensagem informando que o processo foi bem sucedido.

Para os propósitos deste tutorial, ignoramos alguns elementos que, se usados ​​no mundo real, você gostaria de adicionar. Isso inclui validar as informações adicionadas ao banco de dados, fazendo coisas como definir o que acontece se um nome ou e-mail duplicado for adicionado.

Por último, mas não menos importante, devemos adicionar um manipulador para nossa meta box personalizada:

 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 }

E é isso. Agora temos um plugin personalizado que nos permite adicionar alunos, visualizar a lista de alunos ou excluir um aluno e armazenar os dados em uma tabela de banco de dados personalizada!