در این مقاله در مورد حل تعارض افزونه Netgsm و Wordfence Security صحبت خواهیم کرد. این تضاد زمانی رخ می دهد که قابلیت تایید شماره تلفن افزونه Netgsm از طریق پیامک به فرم ثبت نام Woocommerce اضافه شود و افزونه Wordfence Security همزمان فعال شود. پس دلیل این درگیری چیست؟ بیایید با هم بررسی و حل کنیم.

ورودی مخفی افزونه Wordfence و Netgsm

افزونه Wordfence یک ورودی پنهان با شناسه "wfls-email-verification" به فرم ثبت نام و ورود به سیستم Woocommerce برای عملکرد ویژگی recaptcha در بخش امنیت ورود به سیستم اضافه می کند. هنگامی که برای دریافت پیامک پس از پر کردن فرم ثبت نام بر روی دکمه "ارسال کد تایید" کلیک می کنیم، با هشداری در مرورگر مواجه می شویم که توسط افزونه Netgsm راه اندازی شده است. در این اخطار می گوید آدرس ایمیل وارد نشده است اما آدرس ایمیل را وارد کرده ایم. دلیل این امر این است که افزونه Netgsm نمی تواند داده ها را از جعبه ایمیل بازیابی کند در حالی که یک عنصر ورودی مخفی توسط Wordfence Security اضافه شده است. به همین دلیل هشداری مبنی بر وارد نشدن آدرس ایمیل برمی‌گرداند.

بیایید از فیلتر Wordfence با PHP استفاده کنیم

عنصر ورودی مخفی Wordfence به طور پیش فرض اضافه می شود، حتی اگر کلید recaptcha را در تنظیمات امنیتی ورود وارد نکنیم. اولین چیزی که برای حذف این مورد به ذهن ما می رسد این است که این ویژگی را با استفاده از فیلترهای Wordfence غیرفعال کنیم، درست است؟ بیایید آن را امتحان کنیم.

<?php add_filter( 'wordfence_ls_require_captcha', '__return_false' );

اگرچه این کد نیاز کپچا را برای امنیت ورود (ls: login security) در نسخه فعلی حذف می کند، اما ورودی پنهان را حذف نمی کند. در این مورد، راه حل ایده آل حذف ورودی از DOM با جاوا اسکریپت خواهد بود. در این مقاله در مورد راه حل جاوا اسکریپت صحبت خواهیم کرد. البته این تنها راه حل نیست. ما می‌توانیم کلاس و متد OOP را پیدا کنیم که افزونه Wordfence ورودی مربوطه را به آن اضافه می‌کند و با کدهایی که در قالب فرزند یا افزونه قطعه کد می‌نویسیم، آن را لغو کنیم.

بیایید ورودی پنهان را از DOM با جاوا اسکریپت حذف کنیم

ما می توانیم از روش زیر برای حذف ورودی مخفی کدها با جاوا اسکریپت استفاده کنیم. قبل از توضیح جزئیات رویکرد، اجازه دهید به یک موضوع مهم بپردازیم. اگر رویداد DOMContentLoaded در این رویکرد استفاده شود، ممکن است کدها در برخی از سایت‌ها تعریف نشده بازگردند. رویداد DOMContentLoaded زمانی که DOM تحت هر شرایطی بارگیری می شود اجرا نمی شود. برای اطمینان از موفقیت خود، کدهای خود را در رویداد window.onload نوشتیم. توصیه می کنیم این کدها را در بین تگ های اسکریپت، درست قبل از بسته شدن تگ بدنه در DOM اضافه کنید.

// Remove Wordfence Security hidden email input due to conflict with Netgsm plugin by Onur Özden Web Çözümleri
 window.addEventListener('load', () => {
    // used window.onload due to DOMContentLoaded not working properly for this codes
  const oowcRemoveWflsHiddenInput = [...document.querySelectorAll("input[name='wfls-email-verification']")];
  oowcRemoveWflsHiddenInput.forEach(hiddenInput => hiddenInput.remove());
});

پس با این کدها چه کردیم؟ هنگامی که DOM در صفحه بارگذاری می شود، افزونه Wordfence Security متغیری به نام oowcRemoveWflsHiddenInput را اضافه می کند. اگر عنصر در DOM وجود نداشته باشد (مثلاً اگر این کد در صفحه دیگری اجرا شود که فرم وجود ندارد)، وجود عنصر هدف را با بلوک if بررسی نکردیم زیرا forEach به هر حال کار نخواهد کرد. ما تمام عناصر هدف یافت شده با حلقه forEach را حذف کردیم. برای اطمینان از انطباق کدها با استانداردهای ES12، از روش گسترش استفاده می شود. NodeList'iما آن را مستقیماً به یک آرایه تبدیل کردیم. به این ترتیب NodeListما مستقیماً از forEach که یک متد Array است استفاده کردیم.