V tomto článku budeme hovořit o řešení konfliktů zásuvných modulů Netgsm a Wordfence Security. K tomuto konfliktu dochází, když je do registračního formuláře Woocommerce přidána funkce ověření telefonního čísla pluginu Netgsm prostřednictvím SMS a zároveň je aktivován plugin Wordfence Security. Jaký je tedy důvod tohoto konfliktu? Pojďme to společně prozkoumat a vyřešit.

Wordfence Plugin Skrytý vstup a Netgsm

Plugin Wordfence přidává do registračního a přihlašovacího formuláře Woocommerce skrytý vstup s ID „wfls-email-verification“ pro funkčnost funkce recaptcha v sekci zabezpečení přihlášení. Když po vyplnění registračního formuláře klikneme na tlačítko „odeslat ověřovací kód“, abychom obdrželi SMS, narazíme v prohlížeči na varování spuštěné zásuvným modulem Netgsm. V tomto upozornění se píše, že e-mailová adresa nebyla zadána, ale zadali jsme e-mailovou adresu. Důvodem je to, že zásuvný modul Netgsm nemůže načíst data z e-mailové schránky, pokud je v aplikaci Wordfence Security přidán skrytý vstupní prvek. Proto vrací upozornění, že e-mailová adresa nebyla zadána.

Zkusme použít Wordfence Filter s PHP

Skrytý vstupní prvek Wordfence je standardně přidán, i když v nastavení zabezpečení přihlášení nezadáme klíč recaptcha. První věc, která nás napadne, abychom to odstranili, je deaktivace této funkce pomocí filtrů Wordfence, že? Zkusme to.

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

Ačkoli tento kód v aktuální verzi odstraňuje požadavek captcha na zabezpečení přihlášení (ls: zabezpečení přihlášení), neodstraní skrytý vstup. V tomto případě by bylo ideálním řešením odstranit vstup z DOM pomocí Javascriptu. V tomto článku budeme hovořit o řešení Javascript. Samozřejmě to není jediné řešení. Můžeme najít třídu a metodu OOP, do které plugin Wordfence přidá příslušný vstup, a přepíšeme je kódy, které zapíšeme v podřízeném motivu nebo pluginu pro úryvky kódu.

Pojďme odstranit skrytý vstup z DOM pomocí Javascriptu

K odstranění skrytého vstupu z kódů pomocí Javascriptu můžeme použít následující přístup. Než vysvětlíme podrobnosti přístupu, pojďme si projít důležitou otázku. Pokud se v tomto přístupu použije událost DOMContentLoaded, mohou se kódy na některých webech vrátit jako nedefinované. Událost DOMContentLoaded se nespustí, když je DOM načten za všech okolností. Abychom zajistili náš úspěch, napsali jsme naše kódy do události window.onload. Doporučujeme přidat tyto kódy mezi značky skriptu těsně před závěrečnou značku body v 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());
});

Co jsme tedy s těmito kódy udělali? Když se načte DOM na stránce, plugin Wordfence Security přidá proměnnou s názvem oowcRemoveWflsHiddenInput. Pokud prvek není přítomen v DOM (například pokud tento kód běžel na jiné stránce, kde formulář neexistuje), nekontrolovali jsme existenci cílového prvku pomocí bloku if, protože forEach stejně nebude fungovat. Odstranili jsme všechny cílové prvky nalezené pomocí smyčky forEach. Aby bylo zajištěno, že kódy odpovídají standardům ES12, používá se metoda šíření. NodeList'iPřevedli jsme to přímo na pole. Tímto způsobem NodeListPřímo jsme použili forEach, což je metoda Array.