مجتبی درویشی

یک طراح وب هستم

استفاده از چند دیتابیس برای وردپرس

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

طی این مدت اخیر که بر روی ژاکت و همیار وردپرس کار می‌کنم، یکی از مشکلاتی که همیشه باهاش سر و کار داشتیم و داریم سرعت سایت هست. اخیرا ویژگی جدیدی به سایت ژاکت اضافه کردم که باعث میشه در زمان کوتاهی حجم بسیار زیادی از اطلاعات در دیتابیس ذخیره بشه (البته هنوز رونمایی شده از این ویژگی 🙂 ) در نتیجه مجبور شدم که راهکاری برای اتصال وردپرس به چند دیتابیس مختلف پیدا کنم. روش‌های مختلفی وجود داره برای این کار، که توی این نوشته قراره روشی که خودم استفاده کردم و نتیجه خوبی هم ازش گرفتم رو توضیح بدم.

 

HyperDB

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

LudicrousDB

بعد از کلی جستجو و تست افزونه‌های مختلف سرانجام به افزونه LudicrousDB رسیدم. طبق گفته نویسنده افزونه،‌ LudicrousDB رابط دیتابیس پیشرفته‌ایه برای وردپرس که عملیات‌های replication، fail-over، load balancing و partitioning را بر اساس افزونه HyperDB انجام می‌دهد. همون طور که از توضیحات خود افزونه مشخصه عملیات‌های مختلف رو میشه با این افزونه بر روی دیتابیس وردپرس انجام داد. چیزی که من نیاز داشتم عمل partitioning بود که بهم اجازه می‌داد چند جدول از دیتابیس اصلی رو به یک دیتابیس دیگه منتقل کنم تا حجم دیتابیس اصلی سایت رو کم کنم.

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

برای شروع آخرین نسخه افزونه رو از https://github.com/stuttter/ludicrousdb/releases دانلود می‌کنیم. فایل دانلود شده رو اکسترکت می‌کنیم و فولدرش رو توی فولدر افزونه‌های وردپرس قرار میدیم. برای استفاده از افزونه نیازی نیست که از پنل وردپرس فعالش کنیم و تنها با کپی کردن فولدرش میشه ازش استفاده کرد 🙂

بعد از کپی کردن فولدر پلاگین،  فایل db.php رو از مسیر /wp-content/plugins/ludicrousdb/ludicrousdb/drop-ins/ کپی می‌کنیم و داخل فولدر wp-content سایت‌مون قرار میدیم.

در مرحله بعدی از همون مسیر /wp-content/plugins/ludicrousdb/ludicrousdb/drop-ins/  فایل db-config.php رو توی روت سایت کپی می‌کنیم.

تا اینجا فایل‌های مورد نیاز رو توی مسیر‌های مناسب قرار دادیم. حالا نوبت تنظیم دیتابیس جدید برای سایت مون رسید. فایل db-config.php که توی روت سایت هست رو باز می‌کنیم. آخر این فایل این تیکه کد رو می‌بینیم:

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

host: آدرس سرور دیتابیس جدید، اگر دیتابیس بر روی سرور فعلی مون قرار داره که از localhost استفاده می‌کنیم اگر هم سرور دیتابیس مجزا هست می‌تونیم از آدرس آی پیش استفاده کنیم. اگر پورت سرور 3306 نیست می‌تونیم به صورت IP.ADDRESS:PORT آدرس سرور رو وارد کنیم.

user: نام کاربری دیتابیس

password: کلمه عبور دیتابیس

name: نام دیتابیس جدید

write: قابلیت نوشتن روی دیتابیس جدید

read: قابلیت خواندن از دیتابیس جدید

dataset: این مقدار تعیین کننده گروهی از جدول‌هاست که در یک دیتابیس قرار گرفته‌اند.

timeout: زمان تایم اوت اتصال

نکته ای که وجود داره اینه حتما باید اول دیتابیس فعلی سایت رو به شکل زیر توی همین فایل اضافه کنیم و سپس دیتابیس‌های بعدی رو اضافه کنیم.

خب تا اینجا دیتابیس‌های جدید رو به وردپرس مون معرفی کردیم. حالا تنها کافیه که به وردپرس بفهمونیم که کدوم جدول‌ها رو از کدوم دیتابیس بخونه. برای این کار نیاز هست که متد add_callback رو کال کنیم. پارامتر ورودی این متد یک تابع هست که توی وردپرس باید تعریف شده باشه که اون تابع هم دو تا پارامتر ورودی داره که به ما اجازه میده درخواست‌های دیتابیس رو فیلتر کنیم و هر درخواست رو به دیتابیس مورد نظرمون ارسال کنیم.

برای نمونه می‌تونیم از کدی شبیه به کد زیر استفاده کنیم:

توی کد ساده بالا گفتیم که اگر جدول درخواستی posts و یا postmeta بود از جدول‌های با دیتاست newdb استفاده کنیم.  از این به بعد اطلاعات جدول های posts و postmeta از دیتابیس دوم خوانده و نوشته خواهد شد.

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

پ . ن : من این روش رو روی وردپرس ۴.۸.۲ ، دیتابیس MariaDB و PHP 7.0.22 تست کردم و به خوبی جواب گرفتم

 

هماهنگ سازی وردپرس و mailerlite

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

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

برای انتشار نسخه‌ی اول امکانات و قابلیت‌های زیادی مد نظرم نبود. فقط در این حد که مدیر وبسایت گروه مورد نظرش رو از میلرلایت انتخاب کنه و با عضویت کاربران به هر طریقی در وبسایت (هر افزونه‌ای، دستی، ووکامرسی و …) ایمیل‌ آن‌ها توی گروه انتخاب شده‌ی میلرلایت هم اضافه شود.

خوشبختانه انتشار نسخه اول با این امکانات کار ساده‌ای بود. تنها کافی بود API از مدیرسایت دریافت بشه، گروه‌های ساخته شده توی سایت میلرلایت رو لود کنم و گروه انتخابی توسط کاربر رو توی دیتابیس ذخیره کنم. که همه این موارد به سادگی انجام شد. برای بخش هماهنگ سازی عضویت در وبسایت و میلرلایت هم با یه جستجوی ساده به اکشن user_register وردپرس رسیدم. اکشنی که با هر بار اضافه شدن کاربری به جدول users وردپرس اصطلاحا فایر میشه و شناسه‌ی کاربر اضافه شده را در اختیار ما قرار میده، در نتیجه به یه هوک ساده تونستم اطلاعات کاربر ثبت نام کرده رو بگیرم و با استفاده از API میلرلایت، ایمیل کاربر را به لیست مورد نظر مدیر وبسایت اضافه کنم.

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

wpmlr-widget

 

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

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

wpmlrwoocommerce

بعد از انتشار این نسخه،  چند نفر از دوستانی که از افزونه استفاده می‌کردند، پیشنهادی دادند مبنی بر اینکه بتونن محصولات را به صورت چند تایی ویرایش کنند و گروه مورد نظرشون رو قرار دهند. حرف‌شون هم منطقی بود، در صورتی که یه وبسایت محصولات زیادی داشته باشه، اضافه کردن لیست خبرنامه به مصحولات به صورت تکی، پروسه‌ی سخت و طاقت فرسایی میشد. در نتیجه نسخه‌ی 1.2.0 افزونه رو منتشر کردم. که توی این نسخه، در قسمت تنظیمات افزونه، تب جدیدی به نام تنظیمات محصولات اضافه شد، که کاربر لیست محصولات خودش رو می‌بینه و می‌تونه از همین بخش به سادگی، گروه مورد نظر برای یک محصول رو اضافه یا حذف کنه:

wpmlr-screensshot

 

در صورتی که سایت وردپرسی دارید و  از میلرلایت به عنوان سرویس دهنده‌ی ایمیل مارکتینگ استفاده می‌کنید،  احتمالا این افزونه کمک بزرگی به فروش سایت‌تون می‌کنه 🙂

برای خرید می‌تونید از لینک زیر استفاده کنید:

 

خرید افزونه‌ی هماهنگ ساز میلرلایت و وردپرس