مجتبی درویشی

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

وردپرس نسخه ۵ – همه چیزهایی که یک برنامه‌نویس باید بداند

بالاخره بعد از بیش از یک سال کار کردن بر روی نسخه جدید وردپرس، دو روز پیش نسخه ۵ منتشر شد. 

از شماره نسخه کاملا می‌تونیم متوجه بشیم که این نسخه یک نسخه‌ی انقلابی هست 🙂 
توی این نوشته تصمیم دارم تغییراتی که توی این نسخه اعمال شده و تاثیر اون‌ها بر روی کار ما به عنوان یک برنامه‌نویس وردپرس رو  مرور کنم. 

صدای من رو از گوتنبرگ می‌شنوید!

مهم‌ترین تغییری که از مدت‌ها پیش مشخص بود و تا پیش از این می‌شد با استفاده از یک افزونه بهش دسترسی داشت، ویرایشگر جدید وردپرس: گوتنبرگ بود. این ویرایشگر جدید به طور کامل صفحه افزودن نوشته‌ها (یا هر نوع post type دیگه‌ای) رو تغییر میده که در نتیجه دیگه متاباکس‌ها در دسترس نخواهند بود. 

فیلتر‌های ویرایشگر بلاک‌ها

در وردپرس ۵ ویرایشگر بلاک‌ها (گوتنبرگ) برای همه پست تایپ‌هایی که دو شرط زیر رو داشته باشند فعال خواهد بود:

  • هنگام رجیستر شدن ( یا استفاده از add_post_type_support()) ویژگی editor برای آن‌ها فعال شده باشد
  • هنگام رجیستر شدن مقدار show_in_rest برابر با true تعیین شده باشد (مقدار پیش‌فرض برابر false است)

در پلاگین گوتنبرگ دو فیلتر برای فعال یا غیرفعال کردن ویرایشگر بلاک‌ها برای نوشته‌ها و پست‌تایپ‌ها وجود داشت به نام‌های gutenberg_can_edit_post و gutenberg_can_edit_post_type که در وردپرس ۵ معادل این دو فیلترهای use_block_editor_for_post و use_block_editor_for_post_type هستند.

با استفاده از فیلتر use_block_editor_for_post می‌تونیم گوتنبرگ رو برای ویرایش نوشته‌های سایت غیرفعال کنیم، مثلا توی کد زیر گوتنبرگ برای کاربر با نام کاربری mojtaba گوتنبرگ غیرفعال خواهد بود:

همچنین با استفاده از فیلتر use_block_editor_for_post_type می‌تونیم گوتنبرگ رو برای یک پست تایپ غیرفعال کنیم، در مثال زیر گوتنبرگ برای پست تایپ my_custom_post_type غیرفعال خواهد بود: 

فلگ‌های سازگاری برای متاباکس‌ها

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

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

فلگ __block_editor_compatible_meta_box

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

فلگ __back_compat_meta_box

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

طریقه استفاده

فلگ‌ها باید به صورت کلید‌های یک آرایه به عنوان پارامتر آخر تابع add_meta_box ارسال شوند:

جاوا اسکریپت و محلی سازی

یکی از جذاب‌ترین ویژگی‌هایی که به نسخه ۵ اضافه شده، قابلیت ترجمه متن‌های داخل فایل‌های js است. قبلا برای اینکه بتونیم متن‌های داخل فایل‌های js رو ترجمه کنیم از روش‌هایی مثل زیر استفاده می‌کردیم:

حالا در نسخه ۵ کار بسیار ساده‌تر و اصولی تر شده که در ادامه می‌بینیم که چطوری از این ویژگی جذاب استفاده کنیم.

هنگامی که یک فایل js رو برای لود شدن رجیستر می‌کنیم،  wp-i18n رو در لیست وابستگی‌ها فایل‌مون تعیین می‌کنیم:

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

همون طور که می‌بینید سینتکس توابع کاملا شبیه به توابع php هستند و استفاده ازشون بسیار ساده است. 

قدم نهایی اینه که به وردپرس بگیم فایل جی اس ما دارای رشته‌های ترجمه است و همچنین باید text domain رو هم تعیین کنیم. این کار برای این هست که وردپرس ترجمه‌ها رو به صورت انتخاب شده لود کند و در نتیجه سرعت بیشتری داشته باشد:

برچسب‌های جدید برای Post type‌های دلخواه

در نسخه جدید ۵ برچسب جدید برای پست‌ تایپ‌های دلخواه اضافه شده است:

  • item_published – این برچسب پس از انتشار یک پست در بالای داشبورد نمایش داده می‌شود. قبل از این عبارت‌های نوشته منتشر شد یا برگه منتشر شد نمایش داده می‌شد. 
  • item_published_privately – این برچسب هم مشابه قبلی است اما با این تفاوت که برای نوشته‌های خصوصی استفاده خواهد شد. 
  • item_reverted_to_draft – از این برچسب برای نمایش پیغام داشبورد هنگام بازگرداندن نوشته به پیش‌نویس مورد استفاده قرار می‌گیرد.
  • item_scheduled – این برچسب به منظور نمایش پیام هنگام زمان‌بندی کردن یک نوشته برای انتشار در آینده استفاده می‌شود.
  • item_updated – این برچسب هم برای نمایش پیام بعد از به روز رسانی نوشته استفاده می‌شود.

Rest API در نسخه ۵

Rest API در نسخه جدید برای هماهنگی با ویرایشگر جدید تغییراتی رو داشته است. لیست کامل تغییرات Rest API رو می‌تونید اینجا مشاهده کنید.

این مهم‌ترین تغییرات نسخه ۵ وردپرس بود که باید به عنوان یک برنامه‌نویس وردپرس بهشون توجه کنیم 🙂
تجربه شما از نسخه ۵ چه طور بوده؟ 

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

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

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

 

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

 

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

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

 

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