Как создать простой, но полноценный плагин WordPress

Как создать простой, но полноценный плагин WordPress

Прежде чем создавать плагин WordPress или программировать что-либо, мы должны определить цель нашего проекта. В данном случае цель — показать, как создать новый плагин WordPress с нуля.

Какие функции плагина мы будем изучать?

Наш плагин будет иметь возможность:

  • Быть установленным
  • Быть удаленным — в этой части мы удалим данные
  • Создавать таблицы в базе данных
  • Выполнить полный CRUD данных
  • Создайте полный CRUD собственных таблиц WordPress. В частности, таблица wp_posts, так как мы будем создавать собственный тип сообщений).

В качестве примера для этого NS Insight я научу вас создавать плагин для записи списка клиентов компании. Это можно легко использовать при перечислении клиентов на веб-сайте, как показано ниже, отображении спонсоров на веб-сайте мероприятия или просто для внутренних целей.

Да, да, да, я знаю, что существует множество плагинов с такими же функциями. Некоторые существующие плагины могут иметь даже больше функций, чем описано выше. Тем не менее, этот проект призван продемонстрировать, как создать плагин с нуля.

Тема против плагина

Если у вас есть опыт разработки пользовательских тем в WordPress, вы заметите, что некоторые функции и методы часто повторяются в плагине и теме. Эти два имеют схожие результаты, с той разницей, что функциональность ограничивается темой, а плагин независим.

Организация файлов

Не существует такой вещи, как уникальный шаблон для организации файлов плагинов. Программисты, как правило, управляют ими по своему усмотрению. Я обнаружил, что для меня лучший способ организовать проект, подобный тому, который мы будем создавать, заключается в следующем:

Первое, что нам нужно сделать, это создать папку и назвать ее в честь вашего проекта.Код нашего плагина будет внутри нее. Мы начнем с создания файла .php с тем же именем, что и папка нашего плагина (в данном случае, клиенты — ns.php). Этот файл является минимальным функциональным требованием для плагина.

В нашем плагине нам нужно будет добавить «Заголовок». Это комментарий на PHP, в котором следует найти плагин и данные разработчика.

Это поля нашего заголовка:

Клиент- ns.php

/**
* Plugin Name: Clients NicaSource
* Plugin URI: https://nicasource.com/
* Description: This plugin is for managing clients.
* Version: 1.0
* Requires at least: 5.2
* Requires PHP: 7.2
* Author: Alexander Sanchez
* Author URI: https://nicasource.com/
* License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
*/

Как только мы закончим настройку нашего заголовка, мы сможем увидеть плагин в списке и готовый к активации в «Разделе плагинов WordPress». Активация его на этом этапе не повлияет на нас, но мы вернемся к нему позже.

Приступаем к программированию.

Монтажные крючки

Принятие хороших практик с самого начала упростит вашу жизнь! Давайте определим наш файл через путь и сохраним его постоянным, чтобы мы могли получить к нему доступ, когда это необходимо.

Клиент- ns.php

define ( ‘NS_PATH’ , plugin_dir_path ( __FILE__ ));
define ( ‘NS_FILE’ , __FILE__ );

Теперь мы создадим папку с нашим кодом, организованным по файлам в соответствии с выполняемыми задачами. Эта папка будет называться «inc». И мы будем готовы сделать наш первый хук: хук установки и удаления.

Inc/install-uninstall.php

<?php
//installation and uninstallation hooks wordpress
register_activation_hook ( NS_FILE , ‘clients_ns_install’ );
register_deactivation_hook ( NS_FILE , ‘clients_ns_deactivate’ );
register_deactivation_hook ( NS_FILE , ‘clients_ns_uninstall’ ); //uninstall hook wordpress (delete all data)
function clients_ns_install(){
global $wpdb;
$table_name = $wpdb -> prefix . ‘clients_ns’ ;
$sql = “ CREATE TABLE $table_name (
id mediumint( 9 ) NOT NULL AUTO_INCREMENT,
yam varchar ( 255 ) NOT NULL ,
email varchar ( 255 ) NOT NULL ,
country varchar ( 255 ) NOT NULL ,
PRIMARY KEY (id)
); “ ;
require_once ( ABSPATH . ‘wp-admin/includes/upgrade.php’ );
dbDelta ($sql);
}
function clients_ns_uninstall(){
global $wpdb;
$table_name = $wpdb -> prefix . ‘clients_ns’ ;
$wpdb -> query( “DROP TABLE IF EXISTS $table_name “ );
}
function clients_ns_deactivate(){
//nothing
}

Эти функции создают таблицу с полями, когда мы устанавливаем наш плагин. И он удалит таблицу, как только мы ее удалим.

Если вы хотите перепроверить успешность установки, вы можете убедиться, что таблица была создана в базе данных ниже.

Создайте класс для регистрации данных

Затем мы создадим класс под названием client с методами CRUD, следуя принципам объектно-ориентированного программирования. У нас будет что-то вроде этого:

<?php
//create class clients with CRUD methods
class clients {
//create a function to insert a new client
public function insert_client($name, $email, $country) {
global $wpdb;
$table_name = $wpdb -> prefix . ‘clients_ns’ ;
$wpdb -> insert($table_name, array(
‘name’ => $name,
‘email’ => $email,
country => $country
));
}
//create a function to get all clients
public function get_clients() {
global $wpdb;
$table_name = $wpdb -> prefix . ‘clients_ns’ ;
$clients = $wpdb -> get_results( “ SELECT * FROM $table_name “ );
return $clients;
}
//create a function to get a client by id
public function get_client_by_id($id) {
global $wpdb;
$table_name = $wpdb -> prefix . ‘clients_ns’ ;
$client = $wpdb -> get_row( “ SELECT * FROM $table_name WHERE id = $id “ );
return $client;
}
//create a function to update a client
public function update_client($id, $name, $email, $country) {
global $wpdb;
$table_name = $wpdb -> prefix . ‘clients_ns’ ;
$wpdb -> update($table_name, array(
‘name’ => $name,
‘email’ => $email,
country => $country
), array(
go => $id
));
}
//create a function to delete a client
public function delete_client($id) {
global $wpdb;
$table_name = $wpdb -> prefix . ‘clients_ns’ ;
$wpdb -> delete($table_name, array(
go => $id
));
}
}

В этом классе мы определили четыре метода для CRUD.

Создать представление для администратора

Теперь в корне нашего проекта мы создадим папку с именем «admin», где мы будем регистрировать представления и функции «панели администрирования WordPress».

Но сначала мы должны создать хук, который разрешает просмотры из панели администратора, с помощью следующего кода:

Inc/admin.php

<?php
// hooks wordpress for create admin menu
add_action ( ‘admin_menu’ , ‘clients_ns_menu’ );
function clients_ns_menu()
{
add_menu_page (
‘NicaSource Clients’ ,
‘Clients NS’ ,
‘manage_options’ ,
‘clients_ns’ ,
‘clients_ns_admin_page’ ,
‘dashicons-admin-users’ ,
6 );
}
function clients_ns_admin_page()
{
//include admin file
include_once NS_PATH . ‘admin/index.php’ ;
}

В файле admin/index.php мы создадим код, показанный в разделе администратора, и форму для добавления новых клиентов. Хотя мы можем создавать свои собственные классы и стили CSS, в этом примере мы будем использовать WordPress.

Админ/список-client.php

< div class = “wrap” >
< h1 >NicaSource Clients</ h1 >
< table class = “wp-list-table widefat fixed striped” >
< thead >
< tr >
< th class = “manage-column” >Name</ th >
< th class = “manage-column” >Email</ th >
< th class = “manage-column” >Country</ th >
< th class = “manage-column” >Actions</ th >
</ tr >
</ thead >
< tbody >
<?php
//get all clients
$clients = new clients();
$clients = $clients -> get_clients();
//loop clients
foreach ($clients as $client) {
?>
< tr >
< td > <?php echo $client -> name; ?> </ td >
< td > <?php echo $client -> email; ?> </ td >
< td > <?php echo $client -> country; ?> </ td >
< td >
< to href = “ <?php echo admin_url ( ‘admin.php?page=clients_ns&action=edit&id=’ . $client- > id); ?> “ >Edit</ a >
< to href = “ <?php echo admin_url ( ‘admin.php?page=clients_ns&action=delete&id=’ . $client- > id); ?> “ >Delete</ a >
</ td >
</ tr >
<?php
}
?>
</ tbody >
</ table >
< h2 >Add New Client</ h2 >
< form action = “ <?php echo admin_url ( ‘admin.php?page=clients_ns&action=add’ ); ?> “ method = “post” >
< table class = “form-table” >
< tr >
< th scope = “row” >< label for = “name” >Name</ label ></ th >
< td >< input type = “text” name = “name” id = “name” class = “regular-text” ></ td >
</ tr >
< tr >
< th scope = “row” >< label for = “email” >Email</ label ></ th >
< td >< input type = “text” name = “email” id = “email” class = “regular-text” ></ td >
</ tr >
< tr >
< th scope = “row” >< label for = “country” >Country</ label ></ th >
< td >< input type = “text” name = “country” id = “country” class = “regular-text” ></ td >
</ tr >
</ table >
< p class = “submit” >< input type = “submit” name = “submit” id = “submit” class = “button button-primary” value = “Add Client” ></ p >
</ form >
</ div >
<?php

Мы начнем с создания экземпляра нашего клиентского класса и применения метода «get_all» для извлечения всех записей из базы данных. После этого мы создадим форму, в которой у нас есть входные данные для регистрации нового клиента, и у нас будет представление, подобное приведенному ниже:

В форме Добавить нового клиента, когда мы нажимаем кнопку «Добавить клиента», он отправляет нам данные «POST» на тот же URL-адрес, но с переменной с именем to action и со значением add,которое мы должны проверить, чтобы получить данные и зарегистрировать их в базе данных.

Теперь мы представим случай переключения, чтобы захватить все запросы, сделанные для написания немного более динамичного кода. Мы также покажем код по мере необходимости, как показано ниже:

<?php
//create UI for list clients and add new client in html file
if ( isset ($_GET[ ‘action’ ])){
switch ($_GET[ ‘action’ ]){
case ‘add’ :
include_once NS_PATH . ‘admin/add-client.php’ ;
include_once NS_PATH . ‘admin/list-clients.php’ ;
break ;
case ‘delete’ :
$client = newClients ();
$client -> delete_client($_GET[ ‘id’ ]);
include_once NS_PATH . ‘admin/list-clients.php’ ;
break ;
case ‘edit’ :
$client = newClients ();
$clietToedit = $client -> get_client_by_id($_GET[ ‘id’ ]);
include_once NS_PATH . ‘admin/list-clients.php’ ;
break ;
case ‘update’ : //update client
$client = newClients ();
$client -> update_client($_GET[ ‘id’ ], $_POST[ ‘name’ ], $_POST[ ‘email’ ], $_POST[ ‘country’ ]);
include_once NS_PATH . ‘admin/list-clients.php’ ;
break ;
default :
$client = newClients ();
$clients = $client -> get_clients();
include_once NS_PATH . ‘admin/list-clients.php’ ;
break ;
}
} else {
include_once NS_PATH . ‘admin/list-clients.php’ ;
}
?>
<?php

Чтобы добавить клиента, мы должны вызвать файл add-clien.php. В этом файле находится скрипт для регистрации клиента. После этого мы сможем показать список.

Админ/добавить-client.php

//register client on database
if ( isset ($_POST[ ‘name’ ]) && isset ($_POST[ ‘email’ ]) && isset ($_POST[ ‘country’ ])) {
$name = $_POST[ ‘name’ ];
$email = $_POST[ ‘email’ ];
$country = $_POST[ ‘country’ ];
$client = newClients ();
$client -> insert_client($name, $email, $country);
}

Теперь мы готовы зарегистрировать нового клиента в форме.

И когда мы нажмем кнопку «Добавить клиент», клиент сохранится корректно.

Вы уверены, что хотите удалить этого клиента?

Чтобы продолжить наш CRUD, мы попросим пользователя подтвердить, хотят ли они удалить эту запись. Мы можем использовать Javascript для этой цели:

Когда этот процесс завершен, мы видим, что кнопка «Удалить» перенаправляет на себя, но также отправляет действия двух переменных и идентификатор с их соответствующим значением.

$ клиент = новые клиенты ();

$client -> delete_client($_GET[ ‘id’ ]);

Ожидает идентификатор и вызывает метод delete_client, который мы создали в классе.

Пришло время обновить клиент!

Обновление записи необходимо, и мы хотим предоставить нашим пользователям такую ​​возможность. Если пользователь нажмет кнопку «Редактировать», он должен увидеть форму с данными для редактирования.

Ниже вы найдете код, который мы будем использовать для выполнения этой задачи. Если мы посмотрим на случай переключения, мы заметим, что запрос сделан и сохранен в переменной с именем $clientToedit, которая является объектом с данными клиента для редактирования:

<?php
if ( isset ($clietToedit) && $clietToedit != null ){
$client = $clietToedit;
?>
< h2 >Edit Client</ h2 >
< form action = “ <?php echo admin_url ( ‘admin.php?page=clients_ns&action=update&id=’ . $client -> id); ?> “ method = “post” >
< table class = “form-table” >
< tr >
< th scope = “row” >< label for = “name” >Name</ label ></ th >
< td >< input type = “text” name = “name” id = “name” class = “regular-text” value = “ <?php echo $client -> name; ?> “ ></ td >
</ tr >
< tr >
< th scope = “row” >< label for = “email” >Email</ label ></ th >
< td >< input type = “text” name = “email” id = “email” class = “regular-text” value = “ <?php echo $client -> email; ?> “ ></ td >
</ tr >
< tr >
< th scope = “row” >< label for = “country” >Country</ label ></ th >
< td >< input type = “text” name = “country” id = “country” class = “regular-text” value = “ <?php echo $client -> country; ?> “ ></ td >
</ tr >
</ table >
< p class = “submit” >< input type = “submit” name = “submit” id = “submit” class = “button button-primary” value = “Edit Client” ></ p >
<?php
}

В результате данные будут загружаться во ввод при нажатии на кнопку «Редактировать».

Теперь мы можем изменить данные и отправить обновленную информацию в функцию. Функция ниже обновит данные в базе данных.

$ клиент = новые клиенты ();

$client -> update_client($_GET[ ‘id’], $_POST[ ‘имя’], $_POST[ ‘email’], $_POST[ ‘страна’]);

Эврика!

Мы готовы регистрировать, читать, редактировать и удалять записи. Пришло время отобразить данные на веб-сайте. Мы сделаем это с помощью «Шорткода», который позволяет нам распечатать список клиентов на экране. Мы создадим файл с именем shortcode.php в папке inc и включим его в client-ns.php в нашем основном файле. Код с шорткодом будет примерно таким:

<?php
//create shortcode for clients
add_shortcode ( ‘clients_ns’ , ‘clients_ns_shortcode’ );
function clients_ns_shortcode(){
//generate html for list clients
$client = newClients ();
$clients = $client -> get_clients();
$html = ‘<div class=”clients-ns”>’ ;
$html .= ‘<h2>NicaSource Clients</h2>’ ;
//generate html table for list clients
$html .= ‘<table class=”table table-striped”>’ ;
$html .= ‘<thead>’ ;
$html .= ‘<tr>’ ;
$html .= ‘<th>Name</th>’ ;
$html .= ‘<th>Email</th>’ ;
$html .= ‘<th>Country</th>’ ;
$html .= ‘</tr>’ ;
$html .= ‘</thead>’ ;
$html .= ‘<tbody>’ ;
//loop clients
foreach ($clients as $client) {
$html .= ‘<tr>’ ;
$html .= ‘<td>’ . $client -> name . ‘</td>’ ;
$html .= ‘<td>’ . $client -> email . ‘</td>’ ;
$html .= ‘<td>’ . $client -> country . ‘</td>’ ;
$html .= ‘</tr>’ ;
}
$html .= ‘</tbody>’ ;
$html .= ‘</table>’ ;
$html .= ‘</div>’ ;
return $html;
}

С помощью этого ярлыка мы можем поместить наш раздел «clients_ns» в любое место на нашем сайте, и он отобразит таблицу списка клиентов, как показано ниже.

Наконец-то мы завершили наш проект. Это простой проект, но он научил нас всему, что нужно для создания плагина WordPress. Главное соблюдать порядок действий. Вы также можете проверить весь проект в ZIP-файле, если вам это нужно.

Спасибо, что проверили это, и до скорой встречи!