ساختن جدول در دیتابیس وردپرس هنگام فعال کردن افزونه

تاریخ: 10 آبان 1397

بیشتر افزونه هایی که ساخته شده و یا قرار هست بسازیم، اطلاعاتی دارند که لازم است در پایگاه داده ذخیره شوند. افزونه های حرفه ای مانند ووکامرس بسیار استاندارد و کاملا منطبق با سیستم مدیریت محتوای وردپرس برنامه نویسی شده اند و سعی شده است در بخش ذخیره اطلاعات تا جایی که ممکن است از جدول های از پیش تعیین شده مثل جدول های comments, posts, options و … استفاده شود و اگر نیاز بود جدول های جدیدی هم اضافه گردد.

در هنگام طراحی افزونه وردپرس باید در نظر داشته باشیم تا جایی که می شود جدول اضافی به وجود نیاوریم چون لازم می شود کوئری های مختلف ایجاد کنیم و تعدد جدول ها استفاده ترکیبی از آن ها را نیز سخت می کند.

فرض کنید برای افزونه ای که میخواهیم بنویسیم سه جدول در نظر گرفته شده است. چنانچه در مطلب آشنایی با تابع register_activation_hook بیان کردیم، وردپرس به ما پیشنهاد می کند که با استفاده از این تابع می توانیم جدول های خودمان را هنگام فعال کردن افزونه به دیتابیس اضافه کنیم.

بدین ترتیب دیگر نیاز نیست مدیر سایت برای ایجاد جدول ها به دیتابیس رفته و مثلا کوئری ایجاد جدول را وارد نماید. چون در بیشتر موارد افزونه ما منتشر شده و ممکن است بدست افرادی برسد که هیچ دانشی در مورد برنامه نویسی و پایگاه داده ندارند و ممکن است با یک اشتباه اطلاعات موجود پایگاه داده خود را حذف کنند و یا تغییر دهند.

از طرف دیگر در برنامه نویسی حرفه ای باید تا جایی که ممکن است توابعی ساخته شود که کارها را به صورت اتوماتیک انجام دهند و از کار دستی جلوگیری شود. چنانچه گفتیم وردپرس نیز با تابع register_activation_hook این امکان را برای ما فراهم کرده است.

برای ایجاد جدول در دیتابیس به صورت مستقیم از دستورات sql استفاده می شود و تابع خاصی برای این کار وجود ندارد.

دستورات مورد نیاز را در زیر مشاهده می نمایید:

 
global $wpdb, $charset_collate; 
$table = $wpdb->prefix . "novintech"; 

$query = "CREATE TABLE $table ( 
id int(11) NOT NULL AUTO_INCREMENT, 
name varchar(255) CHARACTER SET utf8 NOT NULL, 
family varchar(255) CHARACTER SET utf8 NOT NULL, 
age int(11) NOT NULL, PRIMARY KEY (id) 
) $charset_collate;"; 

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); 
dbDelta( $query ); 

شی wpdb$ چیست و چه کار می کند؟

با استفاده از شی wpdb$ بیش از 99 درصد کارهای مربوط به دیتابیس را انجام می دهیم. در واقع گاهی اوقات نیاز می شود مستقیما با دیتابیس ارتباط برقرار کرده و کوئری را به صورت کامل نوشته و اجرا نماییم.

برای ایجاد جدول با استفاده از کوئری، به نام جدول هم نیاز داریم و از طرفی پیشوند جدول ها هم در دیتابیس های مختلف وردپرسی می تواند متفاوت باشد (در هنگام نصب وردپرس توسط کاربر تعیین می شود)، پس نیاز به دانستن پیشوند جدول ها داریم که در وردپرس با استفاده از این شی و خصوصیت prefix می توانیم پیشوند جدول ها را خوانده و به نام جدول اضافه کنیم.


$table = $wpdb->prefix . "novintech";

پس اگر پیشوند جدول وردپرس ما _wp باشد، متغیر table$ برابر wp_novintech خواهد بود!

 

ارسال کوئری به تابع dbDelta

بعد از نوشتن کوئری مورد نظر باید برای اجرا آن را به تابع dbDelta ارسال نماییم. این تابع عموما در ساخت جدول های وردپرس استفاده می شود و کمک می کند تغییر ساختار دیتابیس در آینده توسط کاربر، روی عملکرد دستورات و افزونه ما تاثیر نداشته باشد. همچنین با استفاده از این تابع می توانیم بیش از یک دستور را به آن فرستاده و آن ها را با هم اجرا نماییم. این تابع توسط جامعه وردپرس ساخته و توسعه داده شده است لذا سعی شده است تمام موارد امنیتی برای ارتباط با دیتابیس رعایت شود. لذا تابع قابل اعتمادی است!

این تابع در فایل upgrade.php تعریف شده است و چون به صورت پیشفرض اینکلود نشده است، لازم است این فایل را در صفحه فراخوانی نماییم.


require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );

باید دقت کنیم که این تابع به فاصله موجود در کوئری ها حساس هست و باعث شکست عملکرد آن می شود. همچنین وجود کلید برای جدول مورد نیاز می باشد. جالب است که می توانیم بیش از یک جدول را با یک dbDelta بسازیم و لازم نیست برای هر کوئری تابع دیگری اجرا کنیم:

$table_name = 'test1';
$sql = "CREATE TABLE " . $table_name . " (
id mediumint(9) NOT NULL AUTO_INCREMENT ,
time bigint(11) DEFAULT '0' NOT NULL ,
name tinytext NOT NULL ,
text text NOT NULL ,
url VARCHAR(55) NOT NULL ,
UNIQUE KEY id (id, time)
);";

$table_name = 'test2';
$sql .= "CREATE TABLE " . $table_name . " (
id mediumint(9) NOT NULL AUTO_INCREMENT ,
time bigint(11) DEFAULT '0' NOT NULL ,
name tinytext NOT NULL ,
text text NOT NULL ,
url VARCHAR(55) NOT NULL ,
UNIQUE KEY id (id, time)
);";

$table_name = 'test3';
$sql .= "CREATE TABLE " . $table_name . " (
id mediumint(9) NOT NULL AUTO_INCREMENT ,
time bigint(11) DEFAULT '0' NOT NULL ,
name tinytext NOT NULL ,
text text NOT NULL ,
url VARCHAR(55) NOT NULL ,
UNIQUE KEY id (id, time)
);";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);

اکنون می توانیم این دستورات را در تابع register_activation_hook قرار داده و وردپرس را مجاز کنیم تا در هنگام فعال شدن افزونه ما، این دستورات را اجرا کرده و جدول های موردنیاز افزونه ما را به صورت خودکار ایجاد نماید.

class activation{

public static function activate(){
//create new table when plugin activate
global $wpdb, $charset_collate;
$table = $wpdb->prefix . "novintech";
$query = "CREATE TABLE $table (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(255) CHARACTER SET utf8 NOT NULL,
family varchar(255) CHARACTER SET utf8 NOT NULL,
age int(11) NOT NULL, PRIMARY KEY (id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $query );
}

public function __construct(){
$this->init_hook();
}

private function init_hook(){
register_activation_hook( plugin_dir_path(__FILE__) , array( $this, 'activate' ) );
}

}
new activation();

دیدگاهتان را بنویسید

طراحی افزونه وردپرس