آشنایی با تابع register_activation_hook در توسعه وردپرس

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

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

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

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

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

تابعی که وردپرس برای این کار در نظر گرفته است، تابع register_activation_hook می باشد. این تابع در مسیر wp-includes/plugin.php تعریف شده است.


function register_activation_hook($file, $function) {
$file = plugin_basename($file);
add_action('activate_' . $file, $function);
}

همانطور که مشاهده می کنید این تابع در واقع با یک اکشن با نام activate_PLUGINNAME کار می کند. بخش PLUGINNAME در واقع آدرس دایرکتوری افزونه به همراه نام فایل اصلی افزونه می باشد. مثلا فرض کنید مسیر افزونه به صورت زیر باشد:


wp-content/plugins/plugin-folder/sample.php

در اینصورت نام اکشن مورد نظر ما، activate_plugin-folder/sample.php می شود. همچنین می توانیم بدون استفاده از خود تابع register_activation_hook و صرفا با این اکشن، به هدف مورنظر خود برسیم.

فرض کنید می خواهیم به همراه فعال کردن افزونه sample با آدرس فوق، یک جدول با نام wp_novintech و ستون های مورد نظر به وجود آید. بدین ترتیب اکشن موردنظر و تابع آن بدینصورت تعریف می شود:


add_action( 'activate_plugin-folder/sample.php' , 'NT_activate_plugin' );

function NT_activate_plugin(){
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 );

}

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

تابع register_activation_hook چگونه کار می کند؟

این تابع دو پارامتر اصلی می گیرد که هر دوی آنها اجباری (required) می باشد. اولین پارامتر آدرس فایل اصلی افزونه فعلی ما می باشد و دومین پارامتر نام تابعی است که قرار است دستورات موردنظر را در آن وارد کنیم تا به هنگام فعال کردن افزونه اعمال شود.


register_activation_hook( string $file, callable $function );

اگر این تابع را مستقیما درون فایل اصلی افزونه قرار دهیم، برای پارامتر اول که آدرس فایل اصلی افزونه یعنی فایل جاری می باشد، می توانیم از ثابت __FILE__ استفاده کنیم که به مکان فعلی اشاره می کند:


register_activation_hook( __FILE__ , $function_name );

function $function_name(){
//statements
}

اکنون اکشن قبل را با تابع register_activation_hook بازنویسی می کنیم:


register_activation_hook( __FILE__ , 'NT_function_name' );

function NT_function_name(){

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

}

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

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

class activation{ 
public static function activate(){ 
//statements 
} 
public function __construct(){
$this->init_hook();
}
private function init_hook(){
register_activation_hook( plugin_dir_path(__FILE__) , array( $this, 'activate' ) );
}
} 
new activation();

چنانچه می بینیم تفاوت تعریف این تابع با قبل این است که اولا چون این کد در فایلی جدا از فایل اصلی افزونه تعریف می شود، نمی توانیم از __FILE__ در پارامتر اول تابع استفاده کنیم. در اینجا ما از تابع plugin_dir_path برای دادن آدرس فایل اصلی افزونه استفاده کرده ایم.

ثانیا چون تابع ما در یک کلاس تعریف شده است، پارامتر دوم این تابع یک آرایه است که مقدار اول آن نام کلاس فعلی و مقدار دوم آن نام تابع موجود در این کلاس می باشد که دستورات موردنظر در آن خواهد آمد.

در زیر می توانید برخی از کارهایی که هنگام فعال کردن افزونه می توانیم در وردپرس اعمال کنیم را مشاهده کنید. در پست های بعدی به صورت مفصل در مورد این کارها توضیح خواهیم داد:

 

1- اضافه کردن جدول جدید با ستون های اختصاصی

2- اضافه کردن برگه جدید

3- اضافه کردن کاستوم پیج جدید

4- اضافه کردن پست تایپ جدید با دسترسی های دلخواه

5- اضافه کردن نقش کاربری جدید

6- اضافه کردن تنظیمات جدید

 

 

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

  • اصغر صادقیان گفت:

    سلام و عرض ادب

    Notice: Function register_uninstall_hook was called incorrectly. Only a static class method or function can be used in an uninstall hook. Please see Debugging in WordPress for more information. (This message was added in version 3.1.0.) in /home/mersadc3/domains/syaaq.com/public_html/wp-includes/functions.php on line 5865

    سایتم با خطا روبرو شد و قسمت define( ‘WP_DEBUG’, true ); را که فعال کردم این خطای بالا را نشان داد.

    لطفا راهنمایی بفرمایید چطوری این خطا را میتونم برطرف کنم.

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