افزونه های وردپرس و قالب ها ، دو بخش اصلی برای توسعه هسته ی وردپرس می باشند. آقای Brian Messenlehner (توسعه دهنده وردپرس) در کتاب Building Web Apps with WordPress بیان نموده است که می بایست سیستم WordPress را همانند یک فریم ورک زبان PHP نگاه کرد ، ن فقط یک سیستم مدیریت محتوا (CMS) که وظیفه ی انتشار محتوا را دارد.
اگر بخواهیم مدل صحیح MVC را در وردپرس پیاده سازی کنیم:
یکی از بزرگترین نقد هایی که بنده به توسعه دهنگان وردپرس می کنم آن هست که ساختار MVC را در کدنویسی افزونه و قالب وردپرس نادیده می گیرند و گاها تمام برنامه نویسی وردپرس و هوک ها را در قالب وردپرس انجام می دهند. این امر کاملا اشتباه هست و می بایست این اعمال در افزونه های وردپرس پیاده سازی شوند. زیرا قالب وردپرس تنها وظیفه ی نمایش را دارد ن نبایست کدهای تحلیلی پروژه را در این بخش قرار داد.
حال با توجه به اهمیت افزونه های وردپرس در این مقاله به بررسی انواع افزونه وردپرس از نظر ساختار ، در هسته ی وردپرس می پردازیم تا با امکاناتی که در این باره در اختیار توسعه دهندگان وردپرس قرار گرفت کاملا آشنا شویم.
طبق تعریف رسمی مخزن وردپرس افزونه ها ،پکیج ها یا بسته هایی هستند که می توانیم توسط آن ها امکانات وردپرس را گسترش دهیم.این افزونه ها توسط زبان PHP برنامه نویسی می شوند و برای ساختاری قوی می توان کدهای جاوا اسکریپ (JavaScript) و یا Css را نیز به آن ها ضمیمه کرد. اگر بخواهیم در یک کلمه بگوییم وظیفه اصلی گسترش در هسته رودپرس چیست قطعا میتوان آن را هوک های وردپرس نامید.
حتما بخوانید : هوک وردپرس و استفاده از اکشن و فیلتر در توسعه پذیری وردپرس
اما سوال اینجاست واقعا می توان تمامی امکانات وردپرس را به دلخواه گسترش دهیم؟ اگر با انواع افزونه وردپرس آشنا باشید پاسخ این سوال قطعا بله می باشد.
بطور کلی 3 مدل افزونه در ساختار وردپرس تعبیه شده است ، نکته ی بسیار کلیدی که در این باره وجود دارد ترتیب لود شدن افزونه های وردپرس در صفحات وب سایت هست.
همان طور که می دانید هر افزونه ها ای که در وردپرس زودتر بارگزاری شود قابلیت این را دارد که همانند ابرهای آسمان که بر تمام آسمان زمین تسلط دارند ، بر بارگزاری افزونه های دیگر تاثیر بگذارد یا حتی مانع از لود شدن آن ها در برخی از درخواست های وردپرس شود.من در زیر به تشریح هر یک از این 3 مدل انواع افزونه وردپرس ، طبق ترتیب لود شدن آن ها می پردازم.
افزونه های Drop-ins شامل افزونه های پیشرفته ای هستند که به شما این امکان را می دهد قابلیت های اصلی وردپرس را تغییر دهید. اگر تابع get_dropins را در هسته ی وردپرس بررسی کنید خواهید دید که در حال حاضر 12 افزونه Drop-ins در وردپرس تعبیه شده است. که 4 مورد آن تنها مرتبط با حالت وردپرس شبکه ای یا Network می باشد.
افزونه های Drop-ins در پوشه wp-content در وردپرس قرار میگرند. و تنها شامل یک فایل PHP می باشند که با توجه به نیاز خود می بایست آن فایل را ایجاد کنید و در پوسه wp-content وردپرس خود قرار دهید.
افزونه های Drop-ins قابلیت غیر فعال سازی در وردپرس را ندارند و اگر می خواهید قابلیت آن را در وردپرس حذف کنید تنها راه کار حذف فایل مربوطه از روی هاست یا پوشه wp-content می باشد.
بانک اطلاعاتی در وردپرس به صورت پیش فرض MYSQL می باشد. شما توسط این افزونه می توانید کلاس اصلی بانک اطلاعاتی در وردپرس که همان WPDB می باشد را کاملا تغییر دهید. یعنی طبق خواسته خود آن را متصل به انواع بانک اطلاعاتی مثل اوراکل ، Access یا SQL کنید. و یا حتی این امکان را دارید برای پروژه های بزرگ وردپرسی خود از چند دیتابیس به صورت هم زمان استفاده کنید.
پکیج stuttter/ludicrousdb یکی از معروف ترین پکیج های وردپرس می باشد که توسط آن می توانید وب سایت وردپرس خود را به چند دیتابیس هم زمان متصل کنید.فقط دقت داشته باشید که این تقسیم بندی برای جداول بانک اطلاعاتی ضورت میگیرد.یعنی شما میتوانید جدول wp_posts را در یک بانک اطلاعاتی و جدول wp_users را در بانک اطلاعاتی دیگری قرار دهید. اما نمیتوانید داده های یک جدول را بین دو دیتابیس تقسیم بندی کنید که اصلا هم این امر استاندارد و پذیرفته نیست.
اگر وردپرس در اتصال به بانک اطلاعاتی دچار مشکلی شود و یا این که شما وارد فایل wp-config.php شوید و یکی از پارامتر هایی که مرتبط با دیتابیس وردپرس هست را مقدار آن را دست کاری کنید خواهید دید که در وردپرس ، با خطای اتصال به بانک اطلاعاتی با عبارت “Error establishing a database connection” مواجه می شوید:
بوسیله افزونه db-error.php می توانید این صفحه را تغییر دهید. بیایید با هم یک نمونه از آن را ایجاد کنیم.
ابتدا در پوشه wp-content یک فایل به نام db-error.php ایجاد کنید.
و کدهای زیر را در آن کپی کنید:
<!DOCTYPE html>
<html lang="fa-IR">
<head>
<style>
body {
font:12px tahoma;
}
.alert {
width: 500px;
height: 100px;
background-color: #ffffff;
margin: 25px auto;
text-align: center;
line-height: 10px;
padding-top: 40px;
box-shadow: 1px 1px 16px #f3e4e4;
border-radius: 15px;
}
</style>
<meta charset="UTF-8">
<title>ِDatabase Error!</title>
</head>
<body>
<div class="alert">
<p>خطای اتصال با بانک اطلاعاتی رخ داده است</p>
<p>لطفا دقایقی دیگر وارد سایت شوید</p>
<div>
</body>
</html>
حال اگر پارامتر های بانک اطلاعاتی مثل DB_HOST را در فایل wp-config.php دستکاری کنید. در وب سایت وردپرس خطا به شکل زیر برای عدم برقراری با دیتابیس نمایش داده خواهد شد:
اگر در مدیریت وردپرس به بخش افزونه ها بروید ، خواهید دید که یک سربرگ به نام افزونه های جایگزین اضافه شده است:
چندین فایل در مجموعه افزونه های Drop-ins در وردپرس وظیفه تغییر در ظاهر نمایش خطاها در وردپرس را دارند که در زیر لیست شده است:
| نام فایل | وظیفه افزونه |
| db-error.php | در زمان خطای بانک اطلاعاتی وررپرس |
| maintenance.php | در زمان این که وردپرس در حالت تعمیر قرار گرفته باشد. |
| php-error.php | زمانی که وردپرس با خطای اجرای PHP برخورد کرده باشد. |
| fatal-error-handler.php | زمانی که وردپرس در اجرای اسکریپ خطای Error Handler گرفته باشد |
| blog-deleted.php | زمانی که در وردپرس شبکه یک بلاگ یا سایت را حذف کنید. |
| blog-inactive.php | زمانی که در وردپرس شبکه یک بلاگ یا سایت را غیر فعال کنید. |
| blog-suspended.php | زمانی که در وردپرس شبکه یک بلاگ یا سایت را کاملا ساسپند یا مسدود کنید. |
تا بحال اگر یک افزونه کش وردپرس (WordPress Cache) نصب کرده باشید مثل WP Rocket و یا Redis Object Cache . خواهید دید که این افزونه ها دقیقا بعد از فعال سازی این فایل ها را در پوشه wp-content شما ایجاد میکنند.
بوسیله این دو فایل شما قادر خواهید بود موتور کش وردپرس را به سیستم دل خواه خود تغییر دهید. مثلا افزونه های کش Redis ، این موتور را کاملا استاندارد و مبتی بر سیستم ردیس قرار می دهند.اگر شما قصد دارید یک سیستم کش قدرتمند برای استارتاپ وردپرس خود ایجاد کنید توسط این دو فایل کاملا این امر شدنی و امکان پذیر هست.
فک نکنم به شخصه پروژه ای بوده باشد که از سیستم کش ، مخصوصا Redis در آن ها استفاده نکرده باشم. چون برای استارتاپ های بزرگ در بستر وردپرس یک امر کاملا الزامی تلقی می شود.فقط دقت کنید حتما می بایست متغیر ثابت WP_CACHE در فایل wp-config.php شما با مقدار true قرار داده شده باشد تا وردپرس به شما اجازه استفاده از این دو فایل را بدهد.
define('WP_CACHE', true);
قابلیت اجرای دستورات PHP خاص در زمان نصب سیستم وردپرس یکی از قابلیت های جالب به شمار می آید.مخصوصا زمانی که شما بخواهید وردپرس را با سیستم های دیگر در ارتباط قرار دهید.توسط فایل install.php شما قادر خواهید بود اسکریپ های خود را برای انجام عملیات خاص در زمان نصب اجرا کنید.
افزونه های لازم وردپرس یا mu-plugins ، افزونه هایی هستند که به توسعه دهندگان این قابلیت را می دهند تا افزونه هایی را ایجاد کنند که بصورت پیش فرض فعال هستند و کاربران اجاره حذف یا غیر فعال سازی آن را ندارند.
افزونه های لازم در وردپرس به صورت پیش فرض در پوشه wp-content/mu-plugins واقع می شوند. اگر شما هم سایت وردپرسی دارید احتما اینکه این پوشه وجود داشته باشد کم هست اما میتوانید خودتان این فولدر را ایجاد کنید.
همچنین اگر میخواهید آدرس مسیر پوشه افزونه های ضروری وردپرس را تغییر دهید از متغیر های ثابت WPMU_PLUGIN_DIR و WPMU_PLUGIN_URL استفاده کنید.
define( 'WPMU_PLUGIN_URL', 'https://realwp.net/config' );
define( 'WPMU_PLUGIN_DIR', ABSPATH . 'config' );
من در وب سایت وردپرس واقعی با قرار دادن کدهای بالا ، مسیر افزونه های ضروری را از پوشه wp-content/mu-plugins به config تغییر دادم.
اصلی ترین دلیل آن این است که افزونه های ضروری mu-plugins قبل از تمامی افزونه های معمولی یا Regular وردپرس بارگزاری و فراخوانی می شوند. و همین امر باعث می شود که شما بتوانید در بسیاری از پردازش ها و عملیات ها دخالت مستقیم انجام دهید و آن را بهینه تر کنید.به عنوان مثال من بسیاری از هوک های وردپرس که مباحث امنیت یا ساختاری مربوط می شوند را در mu-plugins قرار میدهم. تا قبل از همه ی افزونه ها بارگزاری شود.
یک مثلا خیلی ساده آن این است که اگر شما قابلیتی را در وردپرس در بخش mu-plugins غیر فعال کنید ، دیگر پردازش های مرتبط با آن بخش در لابه لای کد های افزونه ها انجام نمی شود. و این یعنی سرعت بالاتر در سیستم.مثلا ویرایش گر Gutenberg را در همان ابتدا غیر فعال میکنم.
دلیل دوم آن فراگیر بودن افزونه های ضروری می باشد.یعنی دیگر مهم نیست که شما یک وردپرس شبکه (Network) دارید یا یک وب سایت معمولی (Single). افزونه های mu-plugins در هر دو حالت بدون دخالت کاربران سیستم فعال می باشد و هیچ کسی نمی تواند آن را غیر فعال کند مگر اینکه فایل مربوطه از هاست شما حذف شود.
وارد پوشه wp-content شوید و یک فولدر به نام mu-plugins بسازید. می خواهیم افزونه ای را طراحی کنیم که مسیر پیش فرض REST API وردپرس را از site.com/wp-json به site.com/api تغییر دهیم.
یک فایل با نام change-rest-api-prefix.php ایجاد کنید و کدهای زیر را در آن قرار دهید:
<?php
/**
* Plugin Name: Change WordPress REST APi Prefix Url
* Plugin URI: https://realwp.net
* Author: Mehrshad Darzi
*/
add_filter( 'rest_url_prefix', 'change_wordpress_rest_api_prefix');
function change_wordpress_rest_api_prefix( $slug ) {
return 'api';
}
اگر در مدیریت وردپرس ، وارد بخش افزونه ها شوید خواهید دید که سربرگ جدید به نام افزونه های لازم در آن ایجاد شده است.
دقیقا مشابه افزونه های جایگزین ، در شکل بالا همان طور که می بینید کاربر اجازه غیر فعال کردن این افزونه را ندارد. حالا اگر به قسمت تظیمات ، پیوند های یکتا بروید و آن را flush rewrite یا روی ذخیره تنظیمات کلیک کنید خواهید که آدرس REST API وردپرس شما به site.com/api تغییر یافته است.
حتما بخوانید : چگونه در REST API وردپرس ، دسترسی Token برای گسترش استارتاپ ایجاد کنیم ؟
سوال، اگر چند افزونه لازم mu-plugins در فولدر قرار داده باشیم باز بین آن ها اولویت بارگزاری کدام هست، یعنی کدام یک زود تر لود می شوند در سیستم وردپرس ؟
افزونه های لازم بر اساس حروف الفبا انگلیسی بارگزاری می شوند یعنی اگر دو افزونه mu-plugins داشته باشید به نام های backup.php و import.php ابتدا فایل backup.php خوانده می شود و سپس فایل impoert.php.
اگر تابع get_mu_plugins را در هسته ی وردپرس مشاهده کنید خواهید دید که در آخر توسط تابع uasort بر اساس حروف الفبا فایل ها را لیست و بارگزاری می کند.
افزونه های عمومی (Regular) وردپرس ، همان افزونه هایی است که در مخزن افزونه وردپرس قرار دارد و کاربران می توانند براحتی آن ها در وردپرس نصب و استفاده نمایند.این افزونه ها در مرحله ی آخر یعنی بعد از افزونه های جایگزین (Drop-ins) و لازم (mu-plugins) بارگزاری می شوند. و کاربر حداکثر حق دسترسی برای فعال سازی یا غیر فعال کردن و یا حتی حذف آن ها را دارد.
برای نصب افزونه وردپرس می توان از سه روش استفاده نمود:
افزونه های عمومی وردپرس بصورت پیش فرض در پوشه wp-content/plugins قرار دارند. این مقدار توسط ثابت های WP_PLUGIN_DIR و WP_PLUGIN_URL در هسته ی وردپرس تعریف شده است. برای تغییر آدرس پیش فرض افزونه های عمومی وردپرس ، کافیست کد زیر را در فایل wp-config.php قرار دهید:
define ('WP_PLUGIN_URL', 'https://realwp.net/addons');
define ('WP_PLUGIN_DIR', ABSPATH . 'addons');
define ('PLUGINDIR', ABSPATH . 'addons' );
توسط کدهای بالا مکان افزونه های وردپرس را از wp-content/plugins به پوشه addons تغییر دادیم. فقط دقت کنید فایل ها را حتما انتقال دهید تا با خطا مواجه نشوید.
برخلاف افزونه های ضروری و جایگزین در وردپرس ، افزونه های عمومی هر یک در یک فولدر اختصاصی قرار میگیرند که به آن ها plugin-name گفته می شود. درون هر فولدر نیز یک فایل به نام آن پوشه قرار دارد و وردپرس با شناسایی آن فایل متوجه خواهد شد که این یک افزونه هست و می بایست در لیست افزونه های وردپرس در مدیریت نمایش دهد.
تابع get_plugins در هسته ی وردپرس وظیفه شناسایی افزونه ها در این پوشه را بر عهده دارد.
اگر فایل اصلی PHP هر یک افزونه ها را باز کنید. خواهید دید که دارای سربرگ با فرمت یکسان هستند. این همان اطلاعاتی است که از افزونه ها در صفحه مدیریت افزونه ها نمایش داده می شود.
به عنوان مثال سربرگ افزونه ووکامرس (WooCommerce) بصورت زیر هست:
<?php
/**
* Plugin Name: WooCommerce
* Plugin URI: https://woocommerce.com/
* Description: An eCommerce toolkit that helps you sell anything. Beautifully.
* Version: 4.4.0-dev
* Author: Automattic
* Author URI: https://woocommerce.com
* Text Domain: woocommerce
* Domain Path: /i18n/languages/
* Requires at least: 5.2
* Requires PHP: 7.0
*/
همان طور که می دانید افزونه های عمومی وردپرس می توانند حضور داشته باشند اما توسط کاربر غیر فعال باشند. اما وردپرس دقیقا از کجا تشخیص می دهد که چه افزونه هایی فعال هستند تا در زمان بارگزاری صفحه آن ها را لود کند ؟
پاسخ در جدول options وردپرس قرار دارد. یک option_name با نام active_plugins وجود دارد که در آن لیست افزونه هایی که فعال هستند ، بصورت آرایه قرار داده است.
همچنین می توانید توسط تابع get_option این لیست را در وردپرس خود مشاهده کنید:
add_action('init, 'show_active_plugins');
function show_active_plugins(){
$active_plugins = get_option('active_plugins');
var_dump($active_plugins);
exit;
}
گاهی مواقع بدلیل خطایی که در یکی از افزونه های وردپرس ایجاد می شود . ما امکان وارد شدن به بخش مدیریت را نداریم که آن را غیر فعال کنیم.
برای غیر فعال کردن افزونه های عمومی در این مواقع می توان از همان فیلد active_plugins استفاده نمود. به عنوان مثال اگر می خواهید تمامی افزونه ها را غیر فعال کنید کافی است ابتدا وارد PHPMyAdmin هاست شوید. سپس از جدول wp_options مقدار option_value را برای active_plugins به صورت زیر تغییر دهید:
a:0:{}
و یا راه حل ساده تر آن هست که نام فولدر افزونه را تغییر نام دهید. با این کار وردپرس آن را ناشناخته تشخیص داده و از لود صفحه خارج می کند. مثلا اگر خطایی از افزونه ی woocommerce دریافت کرده اید، کافی است وارد فایل منجر هاست شوید سپس از پوشه ی wp-content/plugins نام فولدر woocommerce را به woocommer1 تغییر دهید. براحتی افزونه غیر فعال می شود.
با توجه به راحتی نصب و کار با افزونه های عمومی (Regular) تقریبا تمامی توسعه دهندگان ، برنامه نویسی افزونه وردپرس و محصولات خود را در قالب این نوع افزونه تولید و منتشر می کنند. افزونه های جایگزین و Mu-Plugins ها اکثرا برای سیستم سازی و راهبرد پروژه های استارتاپ وردپرس استفاده می شوند که هر کدام دارای تنظیمات خاص منطبق با نوع پروژه می باشد.
از آن جا که اقبال افزونه های regular برای کاربران عادی بسیار بیش تر بوده مارکت ها و توسعه دهندگان نیز به سمت آن ها در حرکت هستند.
حتما بخوانید : اصول اولیه برنامه نویسی افزونه وردپرس برای تولید یک محصول استاندارد
با یادگیری و تسلط بر افزونه های عمومی (Regular) شما یک وردپرس کار و توسعه دهنده وردپرس خوب می شوید. اما با تسلط بر Mu-Plugins ها و Drop-ins ها شما به یک متخصص تمام عیار تبدیل شد.
همان طور که می دانید افزونه ووکامرس درنسخه های اخیر یک تغییر عمده در سفارشات…
در زمان تهیه افزونه های وردپرس برای اتصال نرم افزار حسابداری به سیستم فروشگاهی ووکامرس…
بالاخره در نسخه ی وردپرس 7.0 سرویس اتصال به سرویس هی خارجی مانند هوش مصنوعی…
تا به حال شده با دلنگرانی در داشبورد سایت وردپرسیتان بنشینید، چون بخشی از سایت…
شاید شما هم این صحنه را دیده باشید که تیم محتوا با شوق فراوان مقالهای…
صبح زود از خواب بیدار میشوید، قهوهتان را برمیدارید و مثل همیشه سری به سرچ…