۴ روش تشخیص فعال بودن یک پلاگین(افزونه) در وردپرس

نکات و ترفندهای برنامه نویسی وردپرس

در دنیای وردپرس هستند افزونه های کامل و حرفه ای که علاوه بر پاسخگویی به نیاز کاربران حواسشان به توسعه دهندگان وردپرس هم بوده است، به دیگر سخن افزونه هایی که Developer Friendly هستند و شما می توانید آنها را توسعه داده و امکانات جدیدی برایشان تعریف نمائید.

برای بررسی این موضوع کافی است پلاگین هایی که برای افزونه های (Easy Digital Downloads(EDD و WooCommerce نوشته شده است را گوگل کنید.

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

بنابراین اگر مدیر سایت فرضی ما EDD را غیرفعال یا حذف نماید افزونه اختصاصی ما با خطا مواجه خواهد شد و وب سایتش را با مشکلات جدی روبرو می کند.

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

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

  1. تابع ()is_plugin_active
  2. تابع ()function_exists
  3. تابع ()class_exists

۱- استفاده از تابع is_plugin_active در پنل وردپرس

اگر افزونه شما تغییراتش را در پنل مدیریتی وردپرس اعمال می کند از این ساختار استفاده کنید، در صورتی که پلاگین مربوطه فعال باشد تابع is_plugin_active مقدار true وگرنه false برگشت می دهد.

<?php
if ( is_plugin_active( 'plugin-directory/plugin-file.php' ) ) { 
	// plugin is active
}

قابل توضیح نیست که plugin-directory نام دایرکتوری پلاگین و plugin-file.php نام فایل اصلی پلاگین است، برای EDD قصه ما تغییرات اینگونه خواهد بود.

<?php
if( is_plugin_active( 'easy-digital-downloads/easy-digital-downloads.php' ) ) {
	// EDD is active
}

۲- استفاده از تابع is_plugin_active در فرانت سایت

ساختار و تعریف تابع is_plugin_active در مسیر wp-admin/includes/plugin.php وجود دارد، در واقع تابع فوق کدهای زیر را اجرا می کند.

function is_plugin_active( $plugin ) {
	return in_array( $plugin, 
		(array) get_option( 'active_plugins', array() ) ) || 
		 is_plugin_active_for_network( $plugin );
}

هر آنچه که در دایرکتوری wp-admin قرار دارد مربوط به پنل مدیریتی وردپرس است، فایل plugin.php هم از این قاعده مستثنی نیست، برای همین می توانیم مستقیما از تابع is_plugin_active استفاده کنیم.

اما برای بررسی وضعیت فعال بودن یک پلاگین در فرانت سایت لازم است ابتدا به صورت دستی فایل plugin.php را require کرده و سپس تابع is_plugin_acitve را فراخوانی کنید.

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

<?php
include_once( ABSPATH .'wp-admin/includes/plugin.php' );

if ( is_plugin_active( 'easy-digital-downloads/easy-digital-downloads.php' ) ) { 
	// EDD is active
}

۳- استفاده از تابع function_exists

ما می توانیم از توابع یک پلاگین در داخل افزونه یا قالب اختصاصی خودمان استفاده کنیم. به عنوان مثال در افزونه EDD برای نمایش قیمت یک محصول دانلودی از تابع ()edd_price استفاده می شود، با این حال اگر افزونه فوق غیرفعال شده باشد کد شما هم با خطا مواجه خواهد شد.

برای جلوگیری از بروز این گونه خطاها می توانید فعال بودن افزونه را با تابع function_exists چک کنید.

<?php
if( function_exists( 'edd_price' ) ) {
	// EDD is active
}

۴- استفاده از تابع class_exists

مشابه توضیحات قسمت قبل این امکان وجود دارد که فعال بودن یک افزونه را با کلاس های آن بررسی کنید، به عنوان مثال افزونه EDD را اینبار با class_exists چک می کنیم، در صورتی که افزونه فوق غیرفعال باشد کلاس Easy_Digital_Downloads در دسترس نخواهد بود و هیچ خطایی هم برای افزونه ما تولید نمی شود.

<?php
if( class_exists( 'Easy_Digital_Downloads' ) ) {
	// EDD is active
}

جمع بندی با یک نکته مهم

مهم است که توابع function_exists و class_exists بعد از لود شدن پلاگینی که به آن وابسته اید(در این سناریو EDD) فراخوانی شود، به عبارت دیگر لازم است ترتیب لود شدن پلاگین ها به درستی انجام شود.

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

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

در هر صورت برای حل این مشکل در افزونه سفارشی خود از اکشن هوک plugins_loaded استفاده کنید.

<?php
/*
 * Plugin Name: EDD Extends New Feature
*/
 
function eenf_plugins_loaded() {

	if( class_exists( 'Easy_Digital_Downloads' ) ) {
 
		// Your code ...
 
	}

}

add_action( 'plugins_loaded', 'eenf_plugins_loaded' );
برچسب ها
سعید یاورنیا 118 نوشته 130 دیدگاه

توسعه دهنده PHP و Wordpress
توسعه وب سایت یکی از کارهایی است که تلاش می کنم تخصصم رو در اون بالا ببرم، یادگیری تکنولوژی های جدید یکی از چالش هایی است که به شدت به آن علاقمند هستم.

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

نشانی ایمیل شما منتشر نخواهد شد، بخش‌های موردنیاز با * مشخص شده‌اند.