Sử dụng Eloquent trong phát triển plugin WordPress
WordPress rất tuyệt nhưng tôi thực sự ghét nó khi phải viết các truy vấn SQL. Hầu hết các nhà phát triển tôi đã thấy không thực sự thích viết Truy vấn SQL. WordPress Đi kèm với lớp $ wpdb nhưng bạn vẫn phải viết các truy vấn sql. $ wpdb vẫn ổn khi bạn có số lượng truy vấn nhỏ để thực hiện nhưng Nếu bạn đã từng gặp phải trường hợp bạn phải làm việc với rất nhiều bảng cơ sở dữ liệu tùy chỉnh và phải nối chúng với các bảng khác nhau, bạn biết điều đó.
Tôi đã gặp trường hợp tương tự và thay vì viết các truy vấn sql xấu xí, tôi đã đưa ra một giải pháp bằng cách sử dụng Eloquent. Eloquent là ORM được phát triển bởi Laravel framework. Điều này rất dễ thực hiện và bạn vẫn có thể viết các truy vấn sql với Eloquent nếu muốn. Tôi sẽ không nói về các tính năng của Eloquent trong bài viết này. Bạn có thể xem tài liệu hùng biện chính thức để biết thêm thông tin về Eloquent.
Hãy bắt đầu thiết lập plugin của chúng tôi.
Tôi giả sử bạn có một bản cài đặt WordPress đang hoạt động và Bạn đã cài đặt trình soạn nhạc trong máy của mình. Nếu bạn không chắc trình soạn nhạc là gì, Trình soạn nhạc là trình quản lý phụ thuộc cho php. Bạn có thể truy cập trang chính thức của nhà soạn nhạc để biết thêm thông tin và tải xuống.
Hãy điều hướng đến thư mục plugin của WordPress và tạo một thư mục cho plugin của chúng tôi, tôi sẽ đặt tên cho plugin của mình là _ “wpdrift-client” _.
Tôi đã cài đặt trình soạn nhạc toàn cầu trong máy của mình, nếu trình soạn nhạc của bạn không phải là trình soạn nhạc toàn cầu, bạn có thể muốn sao chép tệp composer.phar vào thư mục plugin của mình và sử dụng “ composer.phar ” thay vì “ composer ” khi thực hiện các lệnh trình soạn nhạc. cho phép yêu cầu gói cơ sở dữ liệu chiếu sáng \ từ trình soạn nhạc. Mở cửa sổ terminal và cd của bạn vào thư mục plugin (tức là wordpress-install / wp-content / plugins / wpdrift-client) và nhập lệnh sau:
composer require illuminate/database
Bây giờ thư mục plugin của bạn sẽ trông giống như sau:
Composer đã tạo thư mục nhà cung cấp bao gồm gói, tệp composer.json và tệp composer.lock . Hãy mở composer.json và thiết lập không gian tên của chúng tôi. Hãy chỉnh sửa nó để trông giống như mã sau:
{ "require": { "illuminate/database": "^5.4" }, "autoload": { "psr-4": { "Models\\": "app/models", "Controllers\\": "app/controllers" } } }
Chạy lệnh trình soạn nhạc từ thiết bị đầu cuối của bạn
composer dump-autoload
Chúng tôi đã thiết lập không gian tên cho các mô hình và bộ điều khiển của chúng tôi bây giờ cho phép tạo các thư mục này. Chúng tôi sẽ tạo một thư mục có tên _ “ứng dụng” _ và bên trong chúng tôi sẽ tạo hai thư mục _ “mô hình” _ và _ “bộ điều khiển” _ sẽ lưu trữ Mô hình và Bộ điều khiển của chúng tôi tương ứng. Bạn có thể đặt tên cho không gian tên của mình bất cứ thứ gì bạn thích.
Chúng tôi đã cài đặt Eloquent thành công, hãy tiếp tục và tạo các tệp khác cho plugin. Chúng tôi sẽ tạo một tệp plugin chính “wpdrift-client.php” , một tệp “index.php” trống , thư mục “asset ” sẽ lưu trữ css, js, hình ảnh và phông chữ của chúng tôi, chúng tôi cũng sẽ tạo một thư mục có tên là views sẽ lưu trữ lượt xem cho plugin của chúng tôi. Chúng tôi cũng sẽ tạo một thư mục có tên “core” sẽ chịu trách nhiệm lưu trữ các tệp khác như móc kích hoạt plugin, kết nối hùng hồn với cơ sở dữ liệu và trình trợ giúp.
Sau khi tạo các tệp và thư mục này, thư mục plugin của bạn sẽ trông giống như sau:
Hãy để tôi giải thích những gì tôi đã làm ở đây:
Chúng tôi đang tạo một bảng cơ sở dữ liệu có tên “client” (với tiền tố), core / create_db_tables.php bao gồm mã để tạo cơ sở dữ liệu, core / class-enqueue.php chịu trách nhiệm về các kiểu và tập lệnh cần thiết cho plugin. helpers.php bao gồm các chức năng trợ giúp. Hầu hết mọi thứ đều được bao gồm trong core / init.php
Đây là mã cho các tệp này:
Tệp plugin chính: wpdrift-client.php
/\* Plugin Name: WpDrift Clients Plugin URI: http://wpdrift.com Description: Custom plugin using Eloquent Version: 1.0 Author: WPDrift Author URI: http://wpdrift.com License: GPL2 License URI: https://www.gnu.org/licenses/gpl-2.0.html Text Domain: wpdrift-clients Domain Path: /languages \*/ if(! defined('ABSPATH')) exit; if( ! defined('WPDRIFT\_CLIENTS\_URl')){ define('WPDRIFT\_CLIENTS\_URl',plugin\_dir\_url(\_\_FILE\_\_)); } if( ! defined('WPDRIFT\_CLIENTS\_PATH')){ define('WPDRIFT\_CLIENTS\_PATH',plugin\_dir\_path(\_\_FILE\_\_)); } require WPDRIFT\_CLIENTS\_PATH.'/core/create\_db\_tables.php'; register\_activation\_hook(\_\_FILE\_\_,'wpdrift\_clients\_custom\_tables'); if(! class\_exists('Wpdrift\_Clients')){ class Wpdrift\_Clients { function \_\_construct(){ add\_action('plugins\_loaded',[$this,'include\_dependencies']); } function include\_dependencies() { include WPDRIFT\_CLIENTS\_PATH.'/core/init.php'; } } } new Wpdrift\_Clients();
core / init.php
require WPDRIFT\_CLIENTS\_PATH.'/vendor/autoload.php'; /\*database connection\*/ $capsule = new Illuminate\Database\Capsule\Manager; $capsule-\>addConnection(['driver' =\> 'mysql', 'host' =\> DB\_HOST, 'database' =\> DB\_NAME, 'username' =\> DB\_USER, 'password' =\> DB\_PASSWORD, 'charset' =\> 'utf8', 'collation' =\> 'utf8\_unicode\_ci', 'prefix' =\> '',]); $capsule-\>setAsGlobal(); $capsule-\>bootEloquent(); // enqueue styles and scripts with class-enqueue.php // helper functions helper.php include\_once WPDRIFT\_CLIENTS\_PATH.'/core/helpers.php'; include\_once WPDRIFT\_CLIENTS\_PATH.'/core/class-enqueue.php'; // add ajax actions $actions = new Controllers\ActionController(); add\_action('wp\_ajax\_create\_client',[$actions,'create']); add\_action('wp\_ajax\_delete\_client',[$actions,'delete']); // shortcode add\_shortcode('wpdrift\_clients',function(){ wpdrift\_clients\_load\_view('clients',['title'=\>'Clients list']); });
core / class-enqueue.php
if(! class\_exists('Wpdrift\_Clients\_Enqueue')){ class Wpdrift\_Clients\_Enqueue { function \_\_construct(){ add\_action('wp\_enqueue\_scripts',array($this,'enqueue')); } function enqueue() { wp\_enqueue\_style('wpdrift-clients',WPDRIFT\_CLIENTS\_URl.'assets/css/wpdrift-clients.css'); wp\_enqueue\_script('jquery'); wp\_enqueue\_script('wpdrift-clients',WPDRIFT\_CLIENTS\_URl.'assets/js/wpdrift-clients.js',array('jquery'),'1.0',true); } } new Wpdrift\_Clients\_Enqueue(); }
core / helpers.php
function wpdrift\_clients\_load\_view($file,$data=[]){ if(! empty($data)){ extract($data); } if(file\_exists(WPDRIFT\_CLIENTS\_PATH.'views/'.$file.'.php')){ include\_once WPDRIFT\_CLIENTS\_PATH.'views/'.$file.'.php'; } else{ echo 'File not found in '.WPDRIFT\_CLIENTS\_PATH.'views/'.$file.'.php'; } } function get\_clients(){ $clients = Models\Client::all(); return $clients; }
Về cơ bản, chúng tôi chỉ hiển thị một chế độ xem bằng shortcode. Shortcode sẽ kích hoạt một hàm wpdrift_clients_load_view () (Location: core / helpers.php) , hàm này sẽ trích xuất đối số mảng và bao gồm một chế độ xem từ thư mục views .
File View bao gồm một bảng đang hiển thị dữ liệu động với hàm get_clients () (Location: core / helpers.php) , hàm này lấy dữ liệu từ Client Model.
mỗi dữ liệu động có một nút xóa là một biểu mẫu có hành động ajax, ( Hành động được xác định trên core / init.php ), lệnh gọi lại cho các hành động này được lưu trữ trong app / controllers / ActionController.php , bộ điều khiển này đang sử dụng app / models /Clinet.php để tương tác với bảng khách hàng.
app / controllers / ActionController.php
namespace Controllers; use Models\Client as Client; class ActionController { function create(){ $name = $\_POST['name']; $email = $\_POST['email']; $phone = $\_POST['phone']; $purchased\_service = $\_POST['service']; $client = new Client; $client-\>name = $name; $client-\>email = $email; $client-\>phone = $phone; $client-\>purchased\_service = $purchased\_service; $client-\>save(); $response = ['response\_type' =\> 'success', 'response\_data' =\> [ 'name' =\> $clinet-\>name, 'email' =\> $clinet-\>email, 'phone' =\> $clinet-\>phone, 'service' =\> $clinet-\>purchased\_service,] ]; return $response; die(); } function delete(){ $client\_id = $\_POST['client\_id']; $client = Client::find($client\_id); if($client){ $client-\>delete(); return 'success'; die(); } return false; die(); } }
app / models / Client.php
namespace Models; use Illuminate\Database\Eloquent\Model as Model; class Client extends Model { protected $table; public $timestamps = false; function \_\_construct() { parent::\_\_construct(); $this-\>table = $this-\>get\_table\_name('clients'); } private function get\_table\_name($name) { global $wpdb; return $wpdb-\>prefix.$name; } }
Như Bạn có thể thấy, chúng tôi không có nhiều mã trên mô hình của mình, tất cả những gì chúng tôi đang nói với mô hình là sử dụng bảng prefix_clients , Eloquent theo mặc định mong đợi bảng có cột create_at và updated_at . Vì vậy, bằng cách xác định public $ timestamps = false; chúng tôi đang tắt tính năng đó. Eloquent giả sử bạn có một bảng khóa chính với tên id , nếu bạn đang nghĩ đến việc sử dụng một số tên khác, bạn sẽ phải xác định thêm một thuộc tính gọi là $ primaryKey . Ví dụ: nếu bạn đang tạo một mô hình cho bảng Người dùng gốc WordPress , nó sẽ trông giống như sau:
namespace Models; use Illuminate\Database\Eloquent\Model as Model; class User extends Model { protected $table; public $timestamps = false; protected $primaryKey = 'ID'; function \_\_construct() { parent::\_\_construct(); $this-\>table = 'wp\_users'; $this-\>table = $this-\>get\_table\_name('users'); } private function get\_table\_name($name) { global $wpdb; return $wpdb-\>prefix.$name; } function meta() { return $this-\>hasMany('App\Usermeta'); } function posts() { return $this-\>hasMany('App\Post'); } }
Trong ví dụ trên , phương thức meta và posts xác định mối quan hệ với các Mô hình khác “Usermeta và Post”, có thể sử dụng bảng usermeta và posts.
Chúng tôi đã xây dựng một plugin rất cơ bản bằng cách sử dụng eloquent orm. Nhưng bài viết này không nói về độ lớn của plugin mà là cấu trúc plugin của bạn để sử dụng kiến trúc MVC và sử dụng Eloquent orm với plugin của bạn. Bài viết này chỉ tập trung vào việc sử dụng MVC và Eloquent, bạn sẽ phải triển khai bảo mật khi xây dựng plugin thực của mình.
Do đó, nếu bạn đang sử dụng tạo một plugin tùy chỉnh lớn với nhiều bảng tùy chỉnh, tôi tin rằng cách tiếp cận này sẽ rất dễ quản lý và dễ dàng, vì tôi sẽ không đề xuất bạn sử dụng cách tiếp cận này để xuất bản plugin của bạn trong wordpress.org vì nó làm thêm kết nối cơ sở dữ liệu và người dùng đang sử dụng 5 plugin với cách tiếp cận tương tự, họ sẽ có 6 kết nối cơ sở dữ liệu.