Skip to content
Merged

Beta #745

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
069aec3
Upd. Code. SFW Update. HTTP multi request refactored.
svfcode Dec 27, 2025
07d1b68
Merge branch 'dev' into upd-sfw-upd.ag
alexandergull Jan 19, 2026
2b3416e
Test codecov. #1
alexandergull Jan 19, 2026
258380c
Test codecov - master. #2
alexandergull Jan 19, 2026
6b63bc9
Fix. Codecov.
alexandergull Jan 19, 2026
7bca548
New. ShadowrootProtection. Implementation of form protection in Shado…
AntonV1211 Jan 21, 2026
d003cf9
Fix. ShadowrootProtection. Removed the comment from the line
AntonV1211 Jan 21, 2026
f1ca027
Fix. ShadowrootProtection. Removed unnecessary hook usage
AntonV1211 Jan 21, 2026
876c2ab
Merge branch 'dev' of https://github.com/CleanTalk/wordpress-antispam…
AntonV1211 Feb 2, 2026
61bf6e4
Fix. CurlMulti. Editing implementation comments
AntonV1211 Feb 3, 2026
e255921
Fix. Tests. Editing tests for phpunit 8.5 version
AntonV1211 Feb 3, 2026
e433087
Fix. Tests. Added verification of the argument type
AntonV1211 Feb 3, 2026
605d87d
Merge dev
AntonV1211 Feb 3, 2026
e9f0f70
Merge dev
AntonV1211 Feb 3, 2026
33bdf7c
Merge dev
AntonV1211 Feb 3, 2026
3f063e9
Mod. ShadowrootPrt. Architectural changes in logic, the addition of s…
AntonV1211 Feb 4, 2026
416b85c
Merge dev
AntonV1211 Feb 4, 2026
d99d984
ESLint fix
AntonV1211 Feb 4, 2026
62ec39e
New. Tests. Test TestMailChimpShadowRoot
AntonV1211 Feb 4, 2026
8fde590
Version: 6.72.99-dev.
Glomberg Feb 5, 2026
0e32e8d
Version: 6.72.99-fix.
Glomberg Feb 5, 2026
bb7ca8d
Fix. Integration. Ninja forms. Filter NF common fields before process…
alexandergull Feb 5, 2026
2251022
Fix. Exclusions. "woocommerce-abandoned-cart"
alexandergull Feb 5, 2026
dda9b08
Fix. Exclusions. "woo-abandoned-cart-recovery"
alexandergull Feb 5, 2026
b1c9938
Fix. Exclusions. "abandoned-cart-capture"
alexandergull Feb 5, 2026
f568e73
Merge dev
AntonV1211 Feb 6, 2026
b717fa3
Fix. Code. Returned the lost code during the merge
AntonV1211 Feb 6, 2026
29b67de
Fix. Code. Returned the lost code during the merge
AntonV1211 Feb 6, 2026
fa9aac6
Fix. FluentForm. Vendor integration compliance fixed.
alexandergull Feb 6, 2026
8743ccd
Code. PHP Unit. TestDbColumnCreator fixed.
alexandergull Feb 6, 2026
08b8c00
Upd. Integrations. Elementor UltimateAddons Register integration hand…
svfcode Feb 9, 2026
2e552d8
Merge pull request #715 from CleanTalk/upd-sfw-upd.ag
AntonV1211 Feb 9, 2026
0b94422
Fix. IntegMailChimp. Clearing all fields except for the field whose n…
AntonV1211 Feb 9, 2026
5dd04e0
Merge dev
AntonV1211 Feb 9, 2026
535adb9
Merge pull request #720 from CleanTalk/shadowroot_av
AntonV1211 Feb 9, 2026
9b2e12a
Fix. Code. Edit Remote Calls
AntonV1211 Feb 10, 2026
ac1c76e
Fix. AdminActions. Checking permissions for Actions
AntonV1211 Feb 10, 2026
e8a2ec3
Rebuild js
AntonV1211 Feb 10, 2026
8767989
Fix phpunits errors
AntonV1211 Feb 10, 2026
272f0e0
Upd. Exclusions. Ajax. Plugin "wp-multi-step-checkout".
alexandergull Feb 11, 2026
759b262
Fix. Exclusions. Ajax. Plugin "woo-abandoned-cart-recovery". Fixed co…
alexandergull Feb 11, 2026
99626d3
Code. Unit tests for apbct_is_skip_request() refactored.
alexandergull Feb 11, 2026
b2cdc5c
Upd. Unit tests for apbct_is_skip_request().
alexandergull Feb 11, 2026
ccace56
Fix. Code. Escaping woocommerce order data
AntonV1211 Feb 11, 2026
54a95a5
Tests phpunits
AntonV1211 Feb 11, 2026
e125f08
Tests phpunits
AntonV1211 Feb 11, 2026
6a4dead
Tests phpunits
AntonV1211 Feb 11, 2026
f32425b
Tests phpunits
AntonV1211 Feb 11, 2026
a51f011
Revert edits test phpunits
AntonV1211 Feb 11, 2026
cb6744b
Edit phpunits
AntonV1211 Feb 12, 2026
d34f33e
Merge pull request #741 from CleanTalk/wc_blk_ord_xss_av
AntonV1211 Feb 12, 2026
4a34190
Merge pull request #737 from CleanTalk/rc_inst_plg_av
AntonV1211 Feb 12, 2026
1179b5c
Merge pull request #738 from CleanTalk/auth_sub_vuln_av
AntonV1211 Feb 12, 2026
355051d
Fix. Code. Edits ip resolving
AntonV1211 Feb 12, 2026
2c600a2
Fix phpuints error
AntonV1211 Feb 12, 2026
4dbf269
Upd. Exclusions. Ajax. Plugin "woocommerce-sendinblue-newsletter-subs…
alexandergull Feb 12, 2026
54419d5
Phpunit tests
AntonV1211 Feb 12, 2026
57b1c1e
Merge pull request #742 from CleanTalk/ipv6_resolve_av
AntonV1211 Feb 12, 2026
bc59b61
Fix. Remote Calls. Skip check if no sign of RC action provided in Req…
alexandergull Feb 12, 2026
5997749
Fix. Exclusion. Added path invoice4u/v1/callback.
alexandergull Feb 12, 2026
3348397
Fix. Contact Encoder. Every hook that has actions BEFORE modify now h…
alexandergull Feb 12, 2026
ffc5c55
Fix. Enqueue. Script individual-disable-comments.js renamed to cleant…
alexandergull Feb 13, 2026
b44c42e
Upd. CommentsCheck. Improve statement.
svfcode Feb 16, 2026
72d8d7f
add testt
svfcode Feb 16, 2026
4b93921
fix test
svfcode Feb 16, 2026
70a874b
add test
svfcode Feb 16, 2026
449c2ee
Upd. JS parameters. Gathering dynamic lod implemented. (#739)
Glomberg Feb 17, 2026
71f14cf
upd flow
svfcode Feb 17, 2026
f3da2f9
Fix. Connection reports. Email for reports fixed. (#736)
Glomberg Feb 17, 2026
17bdd9e
Merge pull request #743 from CleanTalk/upd-check
AntonV1211 Feb 17, 2026
8816c6a
Fix. Integration. SmartQuizBuilder integration fixed. (#735)
Glomberg Feb 17, 2026
2835bf5
upd veersion 6.73
AntonV1211 Feb 17, 2026
7c09a8e
Merge branch 'master' of https://github.com/CleanTalk/wordpress-antis…
AntonV1211 Feb 17, 2026
94b37d6
upd changelog
AntonV1211 Feb 17, 2026
b02cf3d
Fix. ContentEncoder. Editing the data type in the 3rd str_replace arg…
AntonV1211 Feb 18, 2026
630da0f
Upd changelog
AntonV1211 Feb 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 35 additions & 85 deletions cleantalk.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
Plugin Name: Anti-Spam by CleanTalk
Plugin URI: https://cleantalk.org
Description: Max power, all-in-one, no Captcha, premium anti-spam plugin. No comment spam, no registration spam, no contact spam, protects any WordPress forms.
Version: 6.72
Version: 6.73
Author: CleanTalk - Anti-Spam Protection <welcome@cleantalk.org>
Author URI: https://cleantalk.org
Text Domain: cleantalk-spam-protect
Expand Down Expand Up @@ -1519,92 +1519,13 @@ function apbct_sfw_update__get_multifiles_of_type(array $params)

/**
* Queue stage. Do load multifiles with networks on their urls.
* @param $urls
* @return array|array[]|bool|string|string[]
* @param $all_urls
* @return array|true
*/
function apbct_sfw_update__download_files($urls, $direct_update = false)
function apbct_sfw_update__download_files($all_urls, $direct_update = false)
{
global $apbct;

sleep(3);

if ( ! is_writable($apbct->fw_stats['updating_folder']) ) {
return array('error' => 'SFW update folder is not writable.');
}

//Reset keys
$urls = array_values(array_unique($urls));

$results = array();
$batch_size = 10;

/**
* Reduce batch size of curl multi instanced
*/
if (defined('APBCT_SERVICE__SFW_UPDATE_CURL_MULTI_BATCH_SIZE')) {
if (
is_int(APBCT_SERVICE__SFW_UPDATE_CURL_MULTI_BATCH_SIZE) &&
APBCT_SERVICE__SFW_UPDATE_CURL_MULTI_BATCH_SIZE > 0 &&
APBCT_SERVICE__SFW_UPDATE_CURL_MULTI_BATCH_SIZE < 10
) {
$batch_size = APBCT_SERVICE__SFW_UPDATE_CURL_MULTI_BATCH_SIZE;
};
}

$total_urls = count($urls);
$batches = ceil($total_urls / $batch_size);

for ($i = 0; $i < $batches; $i++) {
$batch_urls = array_slice($urls, $i * $batch_size, $batch_size);
if (!empty($batch_urls)) {
$http_results = Helper::httpMultiRequest($batch_urls, $apbct->fw_stats['updating_folder']);
if (is_array($http_results)) {
$results = array_merge($results, $http_results);
}
// to handle case if we request only one url, then Helper::httpMultiRequest returns string 'success' instead of array
if (count($batch_urls) === 1 && $http_results === 'success') {
$results = array_merge($results, $batch_urls);
}
}
}

$results = TT::toArray($results);
$count_urls = count($urls);
$count_results = count($results);

if ( empty($results['error']) && ($count_urls === $count_results) ) {
if ( $direct_update ) {
return true;
}
$download_again = array();
$results = array_values($results);
for ( $i = 0; $i < $count_results; $i++ ) {
if ( $results[$i] === 'error' ) {
$download_again[] = $urls[$i];
}
}

if ( count($download_again) !== 0 ) {
return array(
'error' => 'Files download not completed.',
'update_args' => array(
'args' => $download_again
)
);
}

return array(
'next_stage' => array(
'name' => 'apbct_sfw_update__create_tables'
)
);
}

if ( ! empty($results['error']) ) {
return $results;
}

return array('error' => 'Files download not completed.');
$downloader = new \Cleantalk\ApbctWP\Firewall\SFWFilesDownloader();
return $downloader->downloadFiles($all_urls, $direct_update);
}

/**
Expand Down Expand Up @@ -2175,6 +2096,11 @@ function apbct_rc__install_plugin($_wp = null, $plugin = null)
$plugin = Get::get('plugin') ? Get::get('plugin') : '';
}

$allowed_plugin = 'security-malware-firewall/security-malware-firewall.php';
if ( !empty($plugin) && TT::toString($plugin) !== $allowed_plugin ) {
die('FAIL ' . json_encode(array('error' => 'PLUGIN_NOT_ALLOWED')));
}

if ( !empty($plugin) ) {
$plugin = TT::toString($plugin);
if ( preg_match('/[a-zA-Z-\d]+[\/\\][a-zA-Z-\d]+\.php/', $plugin) ) {
Expand Down Expand Up @@ -2238,6 +2164,12 @@ function apbct_rc__activate_plugin($plugin)
$plugin = Get::get('plugin') ? TT::toString(Get::get('plugin')) : null;
}

// Only allow activation of Security by CleanTalk plugin via remote call
$allowed_plugin = 'security-malware-firewall/security-malware-firewall.php';
if ( $plugin && $plugin !== $allowed_plugin ) {
return array('error' => 'PLUGIN_NOT_ALLOWED');
}

if ( $plugin ) {
if ( preg_match('@[a-zA-Z-\d]+[\\\/][a-zA-Z-\d]+\.php@', $plugin) ) {
require_once(ABSPATH . '/wp-admin/includes/plugin.php');
Expand Down Expand Up @@ -2278,6 +2210,15 @@ function apbct_rc__deactivate_plugin($plugin = null)
$plugin = Get::get('plugin') ? TT::toString(Get::get('plugin')) : null;
}

// Only allow deactivation of CleanTalk plugins via remote call
$allowed_plugins = array(
'cleantalk-spam-protect/cleantalk.php',
'security-malware-firewall/security-malware-firewall.php',
);
if ( $plugin && !in_array($plugin, $allowed_plugins, true) ) {
die('FAIL ' . json_encode(array('error' => 'PLUGIN_NOT_ALLOWED')));
}

if ( $plugin ) {
// Switching complete deactivation for security
if ( $plugin === 'security-malware-firewall/security-malware-firewall.php' && ! empty(Get::get('misc__complete_deactivation')) ) {
Expand Down Expand Up @@ -2324,6 +2265,15 @@ function apbct_rc__uninstall_plugin($plugin = null)
$plugin = Get::get('plugin') ? TT::toString(Get::get('plugin')) : null;
}

// Only allow uninstallation of CleanTalk plugins via remote call
$allowed_plugins = array(
'cleantalk-spam-protect/cleantalk.php',
'security-malware-firewall/security-malware-firewall.php',
);
if ( $plugin && !in_array($plugin, $allowed_plugins, true) ) {
die('FAIL ' . json_encode(array('error' => 'PLUGIN_NOT_ALLOWED')));
}

if ( $plugin ) {
// Switching complete deactivation for security
if ( $plugin === 'security-malware-firewall/security-malware-firewall.php' && ! empty(Get::get('misc__complete_deactivation')) ) {
Expand Down
25 changes: 25 additions & 0 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ function minify_all_js_files_except_already_bundled() {
'!js/src/cleantalk-admin.js',
'!js/src/common-decoder.js',
'js/src/public-3-trp.js',
'js/src/public-2-gathering-data.js',
])
.pipe(sourcemaps.init())
.pipe(uglify())
Expand Down Expand Up @@ -67,6 +68,9 @@ function bundle_public_default() {
'js/src/common-decoder.js',
'js/src/common-cleantalk-modal.js',
'js/src/public-0*.js',
'js/src/ShadowrootProtection/ApbctShadowRootCallbacks.js',
'js/src/ShadowrootProtection/ApbctShadowRootConfig.js',
'js/src/ShadowrootProtection/ApbctShadowRootProtection.js',
'js/src/public-1*.js',
'js/src/public-3*.js',
])
Expand All @@ -82,6 +86,9 @@ function bundle_public_default_with_gathering() {
'js/src/common-decoder.js',
'js/src/common-cleantalk-modal.js',
'js/src/public-0*.js',
'js/src/ShadowrootProtection/ApbctShadowRootCallbacks.js',
'js/src/ShadowrootProtection/ApbctShadowRootConfig.js',
'js/src/ShadowrootProtection/ApbctShadowRootProtection.js',
'js/src/public-1*.js',
'js/src/public-2-gathering-data.js',
'js/src/public-3*.js',
Expand All @@ -98,6 +105,9 @@ function bundle_public_external_protection() {
'js/src/common-decoder.js',
'js/src/common-cleantalk-modal.js',
'js/src/public-0*.js',
'js/src/ShadowrootProtection/ApbctShadowRootCallbacks.js',
'js/src/ShadowrootProtection/ApbctShadowRootConfig.js',
'js/src/ShadowrootProtection/ApbctShadowRootProtection.js',
'js/src/public-1*.js',
'js/src/public-2-external-forms.js',
'!js/src/public-2-gathering-data.js',
Expand All @@ -115,6 +125,9 @@ function bundle_public_external_protection_with_gathering() {
'js/src/common-decoder.js',
'js/src/common-cleantalk-modal.js',
'js/src/public-0*.js',
'js/src/ShadowrootProtection/ApbctShadowRootCallbacks.js',
'js/src/ShadowrootProtection/ApbctShadowRootConfig.js',
'js/src/ShadowrootProtection/ApbctShadowRootProtection.js',
'js/src/public-1*.js',
'js/src/public-2-external-forms.js',
'js/src/public-2-gathering-data.js',
Expand All @@ -132,6 +145,9 @@ function bundle_public_internal_protection() {
'js/src/common-decoder.js',
'js/src/common-cleantalk-modal.js',
'js/src/public-0*.js',
'js/src/ShadowrootProtection/ApbctShadowRootCallbacks.js',
'js/src/ShadowrootProtection/ApbctShadowRootConfig.js',
'js/src/ShadowrootProtection/ApbctShadowRootProtection.js',
'js/src/public-1*.js',
'js/src/public-2-internal-forms.js',
'js/src/public-3*.js',
Expand All @@ -148,6 +164,9 @@ function bundle_public_internal_protection_with_gathering() {
'js/src/common-decoder.js',
'js/src/common-cleantalk-modal.js',
'js/src/public-0*.js',
'js/src/ShadowrootProtection/ApbctShadowRootCallbacks.js',
'js/src/ShadowrootProtection/ApbctShadowRootConfig.js',
'js/src/ShadowrootProtection/ApbctShadowRootProtection.js',
'js/src/public-1*.js',
'js/src/public-2-internal-forms.js',
'js/src/public-2-gathering-data.js',
Expand All @@ -165,6 +184,9 @@ function bundle_public_full_protection() {
'js/src/common-decoder.js',
'js/src/common-cleantalk-modal.js',
'js/src/public-0*.js',
'js/src/ShadowrootProtection/ApbctShadowRootCallbacks.js',
'js/src/ShadowrootProtection/ApbctShadowRootConfig.js',
'js/src/ShadowrootProtection/ApbctShadowRootProtection.js',
'js/src/public-1*.js',
'js/src/public-2*.js',
'!js/src/public-2-gathering-data.js',
Expand All @@ -182,6 +204,9 @@ function bundle_public_full_protection_with_gathering() {
'js/src/common-decoder.js',
'js/src/common-cleantalk-modal.js',
'js/src/public-0*.js',
'js/src/ShadowrootProtection/ApbctShadowRootCallbacks.js',
'js/src/ShadowrootProtection/ApbctShadowRootConfig.js',
'js/src/ShadowrootProtection/ApbctShadowRootProtection.js',
'js/src/public-1*.js',
'js/src/public-2*.js',
'js/src/public-3*.js',
Expand Down
12 changes: 12 additions & 0 deletions inc/cleantalk-admin.php
Original file line number Diff line number Diff line change
Expand Up @@ -1551,6 +1551,10 @@ function apbct_action_adjust_change()
{
AJAXService::checkAdminNonce();

if (!current_user_can('activate_plugins')) {
wp_send_json_error('Permission denied');
}

if (in_array(Post::get('adjust'), array_keys(AdjustToEnvironmentHandler::SET_OF_ADJUST))) {
try {
$adjust = Post::getString('adjust');
Expand All @@ -1570,6 +1574,10 @@ function apbct_action_adjust_reverse()
{
AJAXService::checkAdminNonce();

if (!current_user_can('activate_plugins')) {
wp_send_json_error('Permission denied');
}

if (in_array(Post::getString('adjust'), array_keys(AdjustToEnvironmentHandler::SET_OF_ADJUST))) {
$adjust = Post::getString('adjust');
try {
Expand All @@ -1586,6 +1594,10 @@ function apbct_action_adjust_reverse()

function apbct_action__create_support_user()
{
if (!current_user_can('activate_plugins')) {
wp_send_json_error('Permission denied');
}

$support_user = new SupportUser();
$result = $support_user->ajaxProcess();
wp_send_json($result);
Expand Down
1 change: 1 addition & 0 deletions inc/cleantalk-common.php
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,7 @@ function apbct_get_sender_info()
'bot_detector_prepared_form_exclusions' => apbct__bot_detector_get_prepared_exclusion(),
'bot_detector_frontend_data_log' => apbct__bot_detector_get_fd_log(),
'submit_time_calculation_enabled' => SubmitTimeHandler::isCalculationDisabled() ? 0 : 1,
'ct_gathering_loaded' => Cookie::getBool('ct_gathering_loaded'),
);

// Unset cookies_enabled from sender_info if cookies_type === none
Expand Down
5 changes: 5 additions & 0 deletions inc/cleantalk-integrations-by-hook.php
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,11 @@
'setting' => 'forms__registrations_test',
'ajax' => false
),
'MailChimpShadowRoot' => array(
'hook' => 'cleantalk_force_mailchimp_shadowroot_check',
'setting' => 'forms__check_external',
'ajax' => true
),
'BloomForms' => array(
'hook' => 'bloom_subscribe',
'setting' => 'forms__contact_forms_test',
Expand Down
41 changes: 41 additions & 0 deletions inc/cleantalk-pluggable.php
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,7 @@ function apbct_is_skip_request($ajax = false, $ajax_message_obj = array())
'nasa_process_login', //Nasa login
'leaky_paywall_validate_registration', //Leaky Paywall validation request
'cleantalk_force_ajax_check', //Force ajax check has direct integration
'cleantalk_force_mailchimp_shadowroot_check', // Mailchimp ShadowRoot has direct integration
'cscf-submitform', // CSCF has direct integration
'mailpoet', // Mailpoet has direct integration
'wpcommunity_auth_login', // WPCommunity login
Expand Down Expand Up @@ -783,6 +784,14 @@ function apbct_is_skip_request($ajax = false, $ajax_message_obj = array())
return 'WS Form submit service request';
}

// UNIT OK https://wordpress.org/plugins/woocommerce-sendinblue-newsletter-subscription/
if (
apbct_is_plugin_active('woocommerce-sendinblue-newsletter-subscription/woocommerce-sendinblue.php') &&
Post::getString('action') === 'the_ajax_hook'
) {
return 'woocommerce-sendinblue-newsletter-subscription';
}

// Paid Memberships Pro - Login Form
if (
apbct_is_plugin_active('paid-memberships-pro/paid-memberships-pro.php') &&
Expand Down Expand Up @@ -1675,6 +1684,38 @@ class_exists('Cleantalk\Antispam\Integrations\CleantalkInternalForms')
) {
return 'spoki_abandoned_card_for_woocommerce';
}

//UNIT OK https://wordpress.org/plugins/woocommerce-abandoned-cart/
if (
apbct_is_plugin_active('woocommerce-abandoned-cart\woocommerce-ac.php') &&
Post::equal('action', 'save_data')
) {
return 'woocommerce-abandoned-cart';
}

//UNIT OK https://wordpress.org/plugins/woo-abandoned-cart-recovery/
if (
apbct_is_plugin_active('woo-abandoned-cart-recovery/woo-abandoned-cart-recovery.php') &&
Post::equal('action', 'wacv_get_info')
) {
return 'woo-abandoned-cart-recovery';
}

//UNIT OK unknown wc plugin from https://app.doboard.com/1/task/41205
if (
apbct_is_plugin_active('abandoned-cart-capture/abandoned-cart-capture.php') &&
Post::equal('action', 'acc_save_data')
) {
return 'abandoned-cart-capture';
}

//UNIT OK https://wordpress.org/plugins/wp-multi-step-checkout/ multipage request
if (
apbct_is_plugin_active('wp-multi-step-checkout/wp-multi-step-checkout.php') &&
Post::equal('action', 'wpms_checkout_errors')
) {
return 'wp-multi-step-checkout';
}
} else {
/*****************************************/
/* Here is non-ajax requests skipping */
Expand Down
5 changes: 4 additions & 1 deletion inc/cleantalk-public-validate-skip-functions.php
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,10 @@ function skip_for_ct_contact_form_validate()
'86' => (isset($_POST['action']) && $_POST['action'] === 'check_email_exists'),
// Handling an unknown action check_email_exists
'87' => Server::inUri('cleantalk-antispam/v1/alt_sessions'),
'88' => apbct_is_in_uri('wc-api') && apbct_is_in_uri('WC_Invoice4U'),
'88' => (
(apbct_is_in_uri('wc-api') && apbct_is_in_uri('WC_Invoice4U')) ||
(apbct_is_in_uri('wp-json') && apbct_is_in_uri('invoice4u/v1/callback'))
),
// has direct integration lib/Cleantalk/Antispam/Integrations/MemberPress.php
'89' => apbct_is_plugin_active('memberpress/memberpress.php') && Post::get('mepr_process_signup_form'),
// WooCommerce recovery password form
Expand Down
Loading