В этой статье мы поговорим о разрешении конфликтов плагинов Netgsm и Wordfence Security. Этот конфликт возникает, когда в форму регистрации Woocommerce добавляется функция проверки номера телефона через SMS подключаемого модуля Netgsm и одновременно активируется подключаемый модуль Wordfence Security. Так в чем же причина этого конфликта? Давайте рассмотрим и решим ее вместе.

Плагин Wordfence, скрытый ввод и Netgsm

Плагин Wordfence добавляет скрытый ввод с идентификатором «wfls-email-verification» в форму регистрации и входа Woocommerce для функциональности функции рекапчи в разделе безопасности входа. Когда мы нажимаем кнопку «отправить код подтверждения» для получения SMS после заполнения регистрационной формы, мы сталкиваемся с предупреждением в браузере, вызванным плагином Netgsm. В этом предупреждении написано, что адрес электронной почты не был введен, но мы ввели адрес электронной почты. Причина этого в том, что плагин Netgsm не может получить данные из почтового ящика, пока Wordfence Security добавляет скрытый элемент ввода. Вот почему он возвращает предупреждение о том, что адрес электронной почты не был введен.

Давайте попробуем использовать фильтр Wordfence с PHP

Скрытый элемент ввода Wordfence добавляется по умолчанию, даже если мы не вводим ключ рекапчи в настройках безопасности входа в систему. Первое, что приходит нам в голову, чтобы убрать это, — это отключить эту функцию с помощью фильтров Wordfence, верно? Давайте попробуем.

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

Хотя этот код удаляет требование проверки подлинности при входе в систему (ls: вход в систему) в текущей версии, он не удаляет скрытый ввод. В этом случае идеальным решением было бы удалить ввод из DOM с помощью Javascript. В этой статье мы поговорим о решении Javascript. Конечно, это не единственное решение. Мы можем найти класс и метод ООП, к которым плагин Wordfence добавляет соответствующие входные данные, и переопределить их с помощью кодов, которые мы пишем в дочерней теме или плагине фрагмента кода.

Давайте удалим скрытый ввод из DOM с помощью Javascript

Мы можем использовать следующий подход для удаления скрытого ввода из кодов с помощью Javascript. Прежде чем объяснить детали подхода, давайте рассмотрим важный вопрос. Если в этом подходе используется событие DOMContentLoaded, коды могут возвращать неопределенное значение на некоторых сайтах. Событие DOMContentLoaded не запускается при загрузке DOM ни при каких обстоятельствах. Чтобы гарантировать успех, мы написали код в событии window.onload. Мы рекомендуем добавлять эти коды в теги скрипта непосредственно перед закрывающим тегом body в 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.