Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : May 4, 2026

CVE-2026-4025: PrivateContent Free <= 1.2.0 – Authenticated (Contributor+) Stored Cross-Site Scripting via 'align' Shortcode Attribute (privatecontent-free)

CVE ID CVE-2026-4025
Severity Medium (CVSS 6.4)
CWE 79
Vulnerable Version 1.2.0
Patched Version 1.3.0
Disclosed April 6, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-4025:

This vulnerability is a Stored Cross-Site Scripting (XSS) flaw in the PrivateContent Free plugin for WordPress, affecting versions up to and including 1.2.0. The issue resides in how the plugin processes the ‘align’ shortcode attribute for the [pc-login-form] shortcode. An attacker with Contributor-level access can inject arbitrary JavaScript, which executes when other users view the affected page.

Root Cause: The root cause is the lack of input sanitization and output escaping on the ‘align’ attribute. The attribute flows from the shortcode through pc_login_form() to pc_static::form_align() in the file /privatecontent-free/classes/pc_static.php at line 741. In the vulnerable version, line 741 returns: ‘

‘. $form_code .’

‘;. The $align variable is directly concatenated into an HTML class attribute without esc_attr() or any escaping. The patched code on line 741 adds esc_attr(): ‘

‘. $form_code .’

‘;. This single change prevents the injection by escaping the attribute value.

Exploitation: An authenticated user with Contributor-level access (or higher) creates or edits a WordPress post or page and inserts the [pc-login-form] shortcode with a malicious ‘align’ attribute. For example, an attacker can insert: [pc-login-form align='” onfocus=”alert(1)’ autofocus=”true”] or [pc-login-form align=’left” onmouseover=”alert(1) “‘]. The plugin passes the unescaped value directly into the HTML output. When a victim visits the page, the injected JavaScript executes. The shortcode is processed server-side, so the payload is stored in the post content and executed for every visitor.

Patch Analysis: The patch is minimal and precise. In the file /privatecontent-free/classes/pc_static.php, the vulnerable line 741 originally read: return ‘

‘. $form_code .’

‘;. The patched version wraps $align with esc_attr(): return ‘

‘. $form_code .’

‘;. esc_attr() is a WordPress function that encodes unsafe characters (like double-quotes, single-quotes, and angle brackets) into HTML entities, preventing them from breaking out of the HTML attribute context. The rest of the diff shows only text domain changes from ‘privatecontent-free’ to ‘pc_ml’, which are unrelated to the security fix.

Impact: Successful exploitation allows an attacker to inject arbitrary JavaScript into a page. This can lead to session hijacking, cookie theft, defacement, phishing, or forced actions on behalf of the victim (e.g., privilege escalation if an admin views the page). Since the XSS is stored and does not require user interaction beyond viewing the page, the impact is significant for compromised Contributor+ accounts.

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/privatecontent-free/builders_integration/guten_elements/login/login.php
+++ b/privatecontent-free/builders_integration/guten_elements/login/login.php
@@ -6,19 +6,19 @@
 // structure
 $defaults = array(
 	'redirect' => array(
-		'label'		=> esc_html__('Custom redirect', 'privatecontent-free'),
-		'help'		=> esc_html__('Use a valid URL or "refresh" keyword', 'privatecontent-free'),
+		'label'		=> esc_html__('Custom redirect', 'pc_ml'),
+		'help'		=> esc_html__('Use a valid URL or "refresh" keyword', 'pc_ml'),
 		'type'		=> 'text',
 		'default' 	=> '',
 		'panel'		=> 'main',
 	),
 	'pc_align' => array(
-		'label'		=> esc_html__('Form alignment', 'privatecontent-free'),
+		'label'		=> esc_html__('Form alignment', 'pc_ml'),
 		'type'		=> 'select',
 		'opts'		=> array(
-			'center'	=> esc_html__('Center', 'privatecontent-free'),
-			'left'		=> esc_html__('Left', 'privatecontent-free'),
-			'right'		=> esc_html__('Right', 'privatecontent-free'),
+			'center'	=> esc_html__('Center', 'pc_ml'),
+			'left'		=> esc_html__('Left', 'pc_ml'),
+			'right'		=> esc_html__('Right', 'pc_ml'),
 		),
 		'default' 	=> 'center',
 		'panel'		=> 'main',
--- a/privatecontent-free/builders_integration/guten_elements/logout/logout.php
+++ b/privatecontent-free/builders_integration/guten_elements/logout/logout.php
@@ -6,8 +6,8 @@
 // structure
 $defaults = array(
 	'redirect' => array(
-		'label'		=> esc_html__('Custom redirect', 'privatecontent-free'),
-		'help'		=> esc_html__('Use a valid URL or "refresh" keyword', 'privatecontent-free'),
+		'label'		=> esc_html__('Custom redirect', 'pc_ml'),
+		'help'		=> esc_html__('Use a valid URL or "refresh" keyword', 'pc_ml'),
 		'type'		=> 'text',
 		'default' 	=> '',
 		'panel'		=> 'main',
--- a/privatecontent-free/builders_integration/guten_elements/registr/registr.php
+++ b/privatecontent-free/builders_integration/guten_elements/registr/registr.php
@@ -19,7 +19,7 @@
     foreach($rf_terms as $term) {
         $rf[ $term->term_id ] = $term->name;
     }
-    $vars['id'] = array('' => esc_html__('Select a form', 'privatecontent-free')) + $rf;
+    $vars['id'] = array('' => esc_html__('Select a form', 'pc_ml')) + $rf;


     // user cats
@@ -47,44 +47,44 @@
 // structure
 $defaults = array(
 	'id' => array(
-		'label'		=> esc_html__('Which form?', 'privatecontent-free'),
+		'label'		=> esc_html__('Which form?', 'pc_ml'),
 		'type'		=> 'select',
 		'opts'		=> array(),
 		'default' 	=> array(),
 		'panel'		=> 'main',
 	),
 	'layout' => array(
-		'label'		=> esc_html__('Layout', 'privatecontent-free'),
+		'label'		=> esc_html__('Layout', 'pc_ml'),
 		'type'		=> 'select',
 		'opts'		=> array(
-			''			=> esc_html__('Default one', 'privatecontent-free'),
-			'one_col'	=> esc_html__('Single column', 'privatecontent-free'),
-			'fluid'		=> esc_html__('Fluid (multi column)', 'privatecontent-free'),
+			''			=> esc_html__('Default one', 'pc_ml'),
+			'one_col'	=> esc_html__('Single column', 'pc_ml'),
+			'fluid'		=> esc_html__('Fluid (multi column)', 'pc_ml'),
 		),
 		'default' 	=> '',
 		'panel'		=> 'main',
 	),
 	'custom_categories' => array(
-		'label'		=> esc_html__('Custom categories assignment (ignored if field is in form)', 'privatecontent-free'),
+		'label'		=> esc_html__('Custom categories assignment (ignored if field is in form)', 'pc_ml'),
 		'type'		=> 'multi-opt',
 		'opts'		=> array(),
 		'default' 	=> '',
 		'panel'		=> 'main',
 	),
 	'redirect' => array(
-		'label'		=> esc_html__('Custom redirect', 'privatecontent-free'),
-		'help'		=> esc_html__('Use a valid URL or "refresh" keyword', 'privatecontent-free'),
+		'label'		=> esc_html__('Custom redirect', 'pc_ml'),
+		'help'		=> esc_html__('Use a valid URL or "refresh" keyword', 'pc_ml'),
 		'type'		=> 'text',
 		'default' 	=> '',
 		'panel'		=> 'main',
 	),
 	'pc_align' => array(
-		'label'		=> esc_html__('Form alignment', 'privatecontent-free'),
+		'label'		=> esc_html__('Form alignment', 'pc_ml'),
 		'type'		=> 'select',
 		'opts'		=> array(
-			'center'	=> esc_html__('Center', 'privatecontent-free'),
-			'left'		=> esc_html__('Left', 'privatecontent-free'),
-			'right'		=> esc_html__('Right', 'privatecontent-free'),
+			'center'	=> esc_html__('Center', 'pc_ml'),
+			'left'		=> esc_html__('Left', 'pc_ml'),
+			'right'		=> esc_html__('Right', 'pc_ml'),
 		),
 		'default' 	=> 'center',
 		'panel'		=> 'main',
--- a/privatecontent-free/builders_integration/guten_elements/user_del/user_del.php
+++ b/privatecontent-free/builders_integration/guten_elements/user_del/user_del.php
@@ -6,19 +6,19 @@
 // structure
 $defaults = array(
 	'redirect' => array(
-		'label'		=> esc_html__('Custom redirect', 'privatecontent-free'),
-		'help'		=> esc_html__('Use a valid URL or "refresh" keyword', 'privatecontent-free'),
+		'label'		=> esc_html__('Custom redirect', 'pc_ml'),
+		'help'		=> esc_html__('Use a valid URL or "refresh" keyword', 'pc_ml'),
 		'type'		=> 'text',
 		'default' 	=> '',
 		'panel'		=> 'main',
 	),
 	'pc_align' => array(
-		'label'		=> esc_html__('Form alignment', 'privatecontent-free'),
+		'label'		=> esc_html__('Form alignment', 'pc_ml'),
 		'type'		=> 'select',
 		'opts'		=> array(
-			'center'	=> esc_html__('Center', 'privatecontent-free'),
-			'left'		=> esc_html__('Left', 'privatecontent-free'),
-			'right'		=> esc_html__('Right', 'privatecontent-free'),
+			'center'	=> esc_html__('Center', 'pc_ml'),
+			'left'		=> esc_html__('Left', 'pc_ml'),
+			'right'		=> esc_html__('Right', 'pc_ml'),
 		),
 		'default' 	=> 'center',
 		'panel'		=> 'main',
--- a/privatecontent-free/builders_integration/gutenberg.php
+++ b/privatecontent-free/builders_integration/gutenberg.php
@@ -81,7 +81,7 @@
 	// Block panels
 	$panels = array(
 	   'main' => array(
-			'title' 	=> esc_html__('Main parameters', 'privatecontent-free'),
+			'title' 	=> esc_html__('Main parameters', 'pc_ml'),
 			'opened' 	=> true
 		),
 	);
--- a/privatecontent-free/classes/engine_import_export.php
+++ b/privatecontent-free/classes/engine_import_export.php
@@ -13,8 +13,8 @@
         // PC-FILTER - suite engine export - allow extra subjects to be injected. Passes the structure array(plugin-name => array(subj_id => subj_name))
         $engine_ei_structure = array(
             'PrivateContent Plugin' => array(
-                'pc_settings' => esc_html__('Settings', 'privatecontent-free'),
-                'pc_reg_form' => esc_html__('Registration forms', 'privatecontent-free'),
+                'pc_settings' => esc_html__('Settings', 'pc_ml'),
+                'pc_reg_form' => esc_html__('Registration forms', 'pc_ml'),
             ),
         );
         $this->engine_ei_structure = apply_filters('pc_engine_ie_structure', $engine_ei_structure);
@@ -148,7 +148,7 @@
             return 'Missing uploaded file';
         }
         if($_FILES['pc_engine_import_json']['type'] !== 'application/json') {
-            return esc_html__('Wrong file type', 'privatecontent-free');
+            return esc_html__('Wrong file type', 'pc_ml');
         }
         $contents = json_decode(file_get_contents(
             sanitize_text_field($_FILES['pc_engine_import_json']['tmp_name'])
@@ -156,10 +156,10 @@


         if(!is_array($contents) || !isset($contents['main']) || !isset($contents['subjs'])) {
-            return esc_html__('Wrong or corrupted JSON data', 'privatecontent-free');
+            return esc_html__('Wrong or corrupted JSON data', 'pc_ml');
         }
         if(empty($contents['subjs']) || !is_array($contents['subjs'])) {
-            return esc_html__('No import subjects found', 'privatecontent-free');
+            return esc_html__('No import subjects found', 'pc_ml');
         }

         $avail_subjs = $this->get_subjs();
@@ -171,7 +171,7 @@
         }

         if(empty($possible_choices)) {
-            return esc_html__('No import subjects found', 'privatecontent-free');
+            return esc_html__('No import subjects found', 'pc_ml');
         }
         return $contents;
     }
@@ -208,7 +208,7 @@
                     $pc_settings_baseurl
                 );

-                $reports[$subj_id] = esc_html__('To complete the import, click on', 'privatecontent-free') .' <strong><a href="'. esc_attr($final_url) .'" target="_blank">'. esc_html__('this link', 'privatecontent-free') .' »</a></strong>';
+                $reports[$subj_id] = esc_html__('To complete the import, click on', 'pc_ml') .' <strong><a href="'. esc_attr($final_url) .'" target="_blank">'. esc_html__('this link', 'pc_ml') .' »</a></strong>';
             }

             // registration forms
@@ -252,7 +252,7 @@
                         $term_id = wp_insert_category($args);

                         if(is_wp_error($term_id)) {
-                            $import_report['errors'][$orig_term_id] = esc_html__('Error importing the registration form', 'privatecontent-free') .' "'. $term_data['name'] .'": '. $term_id->get_error_message();
+                            $import_report['errors'][$orig_term_id] = esc_html__('Error importing the registration form', 'pc_ml') .' "'. $term_data['name'] .'": '. $term_id->get_error_message();
                             continue;
                         }

@@ -278,10 +278,10 @@
                     }

                     switch($report_subj) {
-                        case 'added' : $pre_txt = esc_html__('Registration forms added', 'privatecontent-free'); break;
-                        case 'overridden' : $pre_txt = esc_html__('Registration forms updated', 'privatecontent-free'); break;
-                        case 'ignored' : $pre_txt = esc_html__('Duplicate registration forms ignored', 'privatecontent-free'); break;
-                        case 'errors' : $pre_txt = esc_html__('Errors', 'privatecontent-free'); break;
+                        case 'added' : $pre_txt = esc_html__('Registration forms added', 'pc_ml'); break;
+                        case 'overridden' : $pre_txt = esc_html__('Registration forms updated', 'pc_ml'); break;
+                        case 'ignored' : $pre_txt = esc_html__('Duplicate registration forms ignored', 'pc_ml'); break;
+                        case 'errors' : $pre_txt = esc_html__('Errors', 'pc_ml'); break;
                     }
                     $html_report .= '
                     <li class="pc_import_report">
--- a/privatecontent-free/classes/pc_anti_bruteforce_static.php
+++ b/privatecontent-free/classes/pc_anti_bruteforce_static.php
@@ -95,7 +95,7 @@

     // return error message for blocked visitors
     public static function error_message() {
-        return esc_attr__('Too many attempts, please try again in 30 minutes', 'privatecontent-free');
+        return esc_attr__('Too many attempts, please try again in 30 minutes', 'pc_ml');
     }


--- a/privatecontent-free/classes/pc_form_framework.php
+++ b/privatecontent-free/classes/pc_form_framework.php
@@ -65,11 +65,11 @@

         $custom_cat_name = (isset($args['use_custom_cat_name']) || isset($GLOBALS['pvtcont_custom_cat_name'])) ? trim(get_option('pg_reg_cat_label', '')) : '';
 		$cat_placeh_opt = (!is_admin() && !get_option('pg_reg_multiple_cats') && !empty(get_option('pg_reg_cat_placeh'))) ? array('' => get_option('pg_reg_cat_placeh')) : array();
-        $group = esc_html__('Core fields', 'privatecontent-free');
+        $group = esc_html__('Core fields', 'pc_ml');

 		$fields = array(
 			'name' => array(
-				'label' 	=> ($fist_last_name) ? esc_html__('First name', 'privatecontent-free') : esc_html__('Name', 'privatecontent-free'),
+				'label' 	=> ($fist_last_name) ? esc_html__('First name', 'pc_ml') : esc_html__('Name', 'pc_ml'),
 				'type' 		=> 'text',
 				'subtype' 	=> '',
 				'maxlen' 	=> 150,
@@ -78,10 +78,10 @@
 				'icon'		=> get_option('pg_name_icon'), // FontAwesome icon class
                 'group'     => $group,
                 'helper'    => '',
-				'note' 		=> ($fist_last_name) ? esc_html__('User first name', 'privatecontent-free') : esc_html__('User name', 'privatecontent-free')
+				'note' 		=> ($fist_last_name) ? esc_html__('User first name', 'pc_ml') : esc_html__('User name', 'pc_ml')
 			),
 			'surname' => array(
-				'label' 	=> ($fist_last_name) ? esc_html__('Last name', 'privatecontent-free') : esc_html__('Surname', 'privatecontent-free'),
+				'label' 	=> ($fist_last_name) ? esc_html__('Last name', 'pc_ml') : esc_html__('Surname', 'pc_ml'),
 				'type' 		=> 'text',
 				'subtype' 	=> '',
 				'maxlen' 	=> 150,
@@ -90,10 +90,10 @@
 				'icon'		=> get_option('pg_surname_icon'),
                 'group'     => $group,
                 'helper'    => '',
-				'note' 		=> ($fist_last_name) ? esc_html__('User last name', 'privatecontent-free') : esc_html__('User name', 'privatecontent-free')
+				'note' 		=> ($fist_last_name) ? esc_html__('User last name', 'pc_ml') : esc_html__('User name', 'pc_ml')
 			),
 			'username' => array(
-				'label' 	=> esc_html__('Username', 'privatecontent-free'),
+				'label' 	=> esc_html__('Username', 'pc_ml'),
 				'type' 		=> 'text',
 				'subtype' 	=> '',
 				'maxlen' 	=> 150,
@@ -102,11 +102,11 @@
 				'icon'		=> get_option('pg_username_icon'),
                 'group'     => $group,
                 'helper'    => '',
-				'note' 		=> esc_html__('Username used for the login', 'privatecontent-free'),
+				'note' 		=> esc_html__('Username used for the login', 'pc_ml'),
 				'sys_req' 	=> true,
 			),
 			'psw' => array(
-				'label' 	=> esc_html__('Password', 'privatecontent-free'),
+				'label' 	=> esc_html__('Password', 'pc_ml'),
 				'type' 		=> 'password',
 				'subtype' 	=> '',
 				'minlen' 	=> get_option('pg_psw_min_length', 4),
@@ -116,11 +116,11 @@
 				'icon'		=> get_option('pg_psw_icon'),
                 'group'     => $group,
                 'helper'    => (get_option('pg_show_psw_helper')) ? $this->psw_requiremens() : '',
-				'note' 		=> esc_html__('Password used for the login', 'privatecontent-free'),
+				'note' 		=> esc_html__('Password used for the login', 'pc_ml'),
 				'sys_req' 	=> true
 			),
 			'categories' => array(
-				'label' 	=> (empty($custom_cat_name)) ? esc_html__('Category', 'privatecontent-free') : $custom_cat_name,
+				'label' 	=> (empty($custom_cat_name)) ? esc_html__('Category', 'pc_ml') : $custom_cat_name,
 				'type' 		=> 'select',
 				'subtype' 	=> '',
 				'maxlen' 	=> 20,
@@ -129,26 +129,26 @@
 				'icon'		=> get_option('pg_categories_icon'),
                 'group'     => $group,
                 'helper'    => '',
-				'note' 		=> 'PrivateContent '. esc_html__('Categories', 'privatecontent-free'),
+				'note' 		=> 'PrivateContent '. esc_html__('Categories', 'pc_ml'),
 				'multiple'	=> (get_option('pg_reg_multiple_cats')) ? true : false,
                 'def_choice'=> array(),
 				'sys_req' 	=> true
 			),
 			'email' => array(
-				'label' 	=> esc_html__('E-Mail', 'privatecontent-free'),
+				'label' 	=> esc_html__('E-Mail', 'pc_ml'),
 				'type' 		=> 'text',
 				'subtype' 	=> 'email',
 				'maxlen' 	=> 255,
 				'opt'		=> '',
 				'placeh'	=> get_option('pg_email_placeh'),
 				'icon'		=> get_option('pg_email_icon'),
-				'note' 		=> esc_html__('User E-mail', 'privatecontent-free'),
+				'note' 		=> esc_html__('User E-mail', 'pc_ml'),
                 'group'     => $group,
                 'helper'    => '',
 				'sys_req' 	=> $this->mail_is_required
 			),
 			'tel' => array(
-				'label' 	=> esc_html__('Telephone', 'privatecontent-free'),
+				'label' 	=> esc_html__('Telephone', 'pc_ml'),
 				'type' 		=> 'text',
 				'subtype' 	=> '',
 				'maxlen' 	=> 20,
@@ -157,10 +157,10 @@
 				'icon'		=> get_option('pg_tel_icon'),
                 'group'     => $group,
                 'helper'    => '',
-				'note' 		=> esc_html__('User Telephone', 'privatecontent-free')
+				'note' 		=> esc_html__('User Telephone', 'pc_ml')
 			),
 			'pc_disclaimer' => array(
-				'label' 	=> esc_html__("Disclaimer", 'privatecontent-free'),
+				'label' 	=> esc_html__("Disclaimer", 'pc_ml'),
 				'type' 		=> 'single_checkbox',
 				'subtype' 	=> '',
 				'maxlen' 	=> 1,
@@ -169,7 +169,7 @@
 				'disclaimer'=> true,
                 'group'     => $group,
                 'helper'    => '',
-				'note' 		=> esc_html__('Registration disclaimer', 'privatecontent-free'),
+				'note' 		=> esc_html__('Registration disclaimer', 'pc_ml'),
 				'sys_req' 	=> true
 			)
 		);
@@ -223,7 +223,7 @@


         // core is first
-        $core_key = esc_html__('Core fields', 'privatecontent-free');
+        $core_key = esc_html__('Core fields', 'pc_ml');
         if(isset($to_return[$core_key])) {
             $to_prepend = $to_return[$core_key];
             unset($to_return[$core_key]);
@@ -233,7 +233,7 @@

         // not is last
         if(!empty($ungrouped)) {
-            $to_return[ esc_html__('Ungrouped', 'privatecontent-free') ] = $ungrouped;
+            $to_return[ esc_html__('Ungrouped', 'pc_ml') ] = $ungrouped;
         }

         return $to_return;
@@ -368,7 +368,7 @@

             for($c=1; $c<=$this->form_pages; $c++) {
                 $sel_class = ($c === 1) ? 'class="pc_fpp_current pc_fpp_active"' : '';
-                $form .= '<span '. $sel_class .' title="'. esc_attr__('go to page', 'privatecontent-free') .' '. $c .'" data-pag="'. $c .'" role="button" tabindex="0">'. $c .'</span>';
+                $form .= '<span '. $sel_class .' title="'. esc_attr__('go to page', 'pc_ml') .' '. $c .'" data-pag="'. $c .'" role="button" tabindex="0">'. $c .'</span>';
             }

             $form .= '
@@ -484,7 +484,7 @@

                 if(get_option('pg_single_psw_f_w_reveal') && $field == 'psw') {
                     $fdata['icon'] = 'far fa-eye';
-                    $icon_label = esc_attr__('toggle password visibility', 'privatecontent-free');
+                    $icon_label = esc_attr__('toggle password visibility', 'pc_ml');
                     $role_btn = 'role="button" tabindex="0"';
                 }

@@ -595,7 +595,7 @@

                     // repeat psw specific data
                     // icon
-                    $rp_icon = (get_option('pg_repeat_psw_icon')) ? '<span class="pc_field_icon" title="'. esc_attr__('Repeat password', 'privatecontent-free') .'"><i class=" '. esc_attr( pc_static::fontawesome_v4_retrocomp(get_option('pg_repeat_psw_icon')) ) .'" aria-hidden="true"></i></span>' : '';
+                    $rp_icon = (get_option('pg_repeat_psw_icon')) ? '<span class="pc_field_icon" title="'. esc_attr__('Repeat password', 'pc_ml') .'"><i class=" '. esc_attr( pc_static::fontawesome_v4_retrocomp(get_option('pg_repeat_psw_icon')) ) .'" aria-hidden="true"></i></span>' : '';

                     $rp_has_icon_class = ($rp_icon) ? 'pc_field_w_icon' : '';
                     ////
@@ -618,7 +618,7 @@
                     if($field == 'psw' && !get_option('pg_single_psw_f_w_reveal')) {
                         $form .= '
                         <section class="'. $sect_classes .' pc_psw_confirm '. $rp_has_icon_class .'" '. $sect_atts .'>
-                            <label for="'. esc_attr($f_uniqid) .'_repeat">'. esc_html__('Repeat password', 'privatecontent-free').' '.$req_f_html.'</label>
+                            <label for="'. esc_attr($f_uniqid) .'_repeat">'. esc_html__('Repeat password', 'pc_ml').' '.$req_f_html.'</label>
                             <div class="pc_field_container">
                                 '. $rp_icon .'
                                 <input type="'. $fdata['type'] .'" name="check_'. $field .'" '. $f_atts .' id="'. $f_uniqid .'_repeat" placeholder="'. esc_attr( get_option('pg_repeat_psw_placeh')).'" />
@@ -943,7 +943,7 @@
 				// check psw validation
 				$a++;
 				$indexes[$a]['index'] = 'check_psw';
-				$indexes[$a]['label'] = esc_html__('Repeat password', 'privatecontent-free');
+				$indexes[$a]['label'] = esc_html__('Repeat password', 'pc_ml');
 				$indexes[$a]['maxlen'] = $fval['maxlen'];
 			}

@@ -975,7 +975,7 @@
 		include_once('simple_form_validator.php');
 		global $wpdb;

-		$validator = new simple_fv('privatecontent-free');
+		$validator = new simple_fv('pc_ml');
         $form_vals = $validator->getAllIndexVals($indexes, true);

         // is a data-update form?
@@ -1008,16 +1008,16 @@
 			if($field['index'] == 'psw') {
 				$psw_strength = $this->check_psw_strength($fdata['psw']);
 				if($psw_strength !== true) {
-					$validator->custom_error[esc_html__("Password strength", 'privatecontent-free')] = $psw_strength;
+					$validator->custom_error[esc_html__("Password strength", 'pc_ml')] = $psw_strength;
 				}
 			}

             // username format must comply with WP format
             if($field['index'] == 'username' && !validate_username($fdata['username'])) {
-                $letters_part = (is_multisite()) ? esc_html__("lowercase letters", 'privatecontent-free') : esc_html__("letters", 'privatecontent-free');
+                $letters_part = (is_multisite()) ? esc_html__("lowercase letters", 'pc_ml') : esc_html__("letters", 'pc_ml');

                 /* translators: 1: letters specification. */
-                $validator->custom_error[esc_html__("Username", 'privatecontent-free')] = sprintf(esc_html__("May only contain %s, numbers, spaces, periods, hyphens, underscores, and the @ symbol", 'privatecontent-free'), $letters_part);
+                $validator->custom_error[esc_html__("Username", 'pc_ml')] = sprintf(esc_html__("May only contain %s, numbers, spaces, periods, hyphens, underscores, and the @ symbol", 'pc_ml'), $letters_part);
             }

 			// username unicity
@@ -1038,7 +1038,7 @@

 				$wpdb->query($prepared);
 				if($wpdb->num_rows) {
-					$validator->custom_error[esc_html__("Username", 'privatecontent-free')] =  esc_html__("Another user already has this username", 'privatecontent-free');
+					$validator->custom_error[esc_html__("Username", 'pc_ml')] =  esc_html__("Another user already has this username", 'pc_ml');
 				}
 			}

@@ -1049,7 +1049,7 @@
 				foreach((array)$fdata['categories'] as $f_cat) {
 					if(!isset($cats[ absint($f_cat) ])) {
 						$name = $this->fields['categories']['label'];
-						$validator->custom_error[$name] =  esc_html__("One or more chosen categories are wrong", 'privatecontent-free');
+						$validator->custom_error[$name] =  esc_html__("One or more chosen categories are wrong", 'pc_ml');
 						break;
 					}
 				}
@@ -1100,18 +1100,18 @@
 		$new_error = array();
 		foreach($options as $opt) {
 			if($opt == 'chars_digits') {
-				if(!preg_match("((?=.*d)(?=.*[a-zA-Z]))", $psw)) {$new_error[] = esc_html__('characters and digits', 'privatecontent-free');}
+				if(!preg_match("((?=.*d)(?=.*[a-zA-Z]))", $psw)) {$new_error[] = esc_html__('characters and digits', 'pc_ml');}
 			}
 			elseif($opt == 'use_uppercase') {
-				if(!preg_match("(.*[A-Z])", $psw)) {$new_error[] = esc_html__('an uppercase character', 'privatecontent-free');}
+				if(!preg_match("(.*[A-Z])", $psw)) {$new_error[] = esc_html__('an uppercase character', 'pc_ml');}
 			}
 			elseif($opt == 'use_symbols') {
-				if(!preg_match("(.*[^A-Za-z0-9])", $psw)) {$new_error[] = esc_html__('a symbol', 'privatecontent-free');}
+				if(!preg_match("(.*[^A-Za-z0-9])", $psw)) {$new_error[] = esc_html__('a symbol', 'pc_ml');}
 			}
 		}
 		if(count($new_error)) {
-            $imploded = str_replace(',', ' '. esc_html__('and', 'privatecontent-free'), implode(', ', $new_error));
-			$regex_err = esc_html__('must contain at least', 'privatecontent-free') .' '. $imploded;
+            $imploded = str_replace(',', ' '. esc_html__('and', 'pc_ml'), implode(', ', $new_error));
+			$regex_err = esc_html__('must contain at least', 'pc_ml') .' '. $imploded;
 		}

 		return (!isset($regex_err)) ? true : $regex_err;
@@ -1187,23 +1187,23 @@
         $strength   = get_option('pg_psw_strength', array());

         /* translators: 1: min length. */
-        $txt = sprintf(esc_html__("Min. %s chars long", 'privatecontent-free'), $min_length);
+        $txt = sprintf(esc_html__("Min. %s chars long", 'pc_ml'), $min_length);

         if(!empty($strength)) {
             $opts = array();
             foreach($strength as $opt) {
                 if($opt == 'chars_digits') {
-                    $opts[] = esc_html__('characters and digits', 'privatecontent-free');
+                    $opts[] = esc_html__('characters and digits', 'pc_ml');
                 }
                 elseif($opt == 'use_uppercase') {
-                    $opts[] = esc_html__('an uppercase character', 'privatecontent-free');
+                    $opts[] = esc_html__('an uppercase character', 'pc_ml');
                 }
                 elseif($opt == 'use_symbols') {
-                    $opts[] = esc_html__('a symbol', 'privatecontent-free');
+                    $opts[] = esc_html__('a symbol', 'pc_ml');
                 }
             }

-            $txt .= '. '. ucfirst(esc_html__('must contain at least', 'privatecontent-free')) .': '. implode(', ', $opts);
+            $txt .= '. '. ucfirst(esc_html__('must contain at least', 'pc_ml')) .': '. implode(', ', $opts);
         }

         return $txt;
--- a/privatecontent-free/classes/pc_static.php
+++ b/privatecontent-free/classes/pc_static.php
@@ -219,7 +219,7 @@

         //if no time was passed return 0 seconds
         if ($timestamp < 1){
-            return '1 '. esc_html__('second', 'privatecontent-free');
+            return '1 '. esc_html__('second', 'pc_ml');
         }

         //create multi-array with seconds and define values
@@ -244,12 +244,12 @@

                 // translatable strings
                 switch($point) {
-                    case 'year' : $txt = ($res > 1) ? esc_html__('years', 'privatecontent-free') : esc_html__('year', 'privatecontent-free'); break;
-                    case 'month': $txt = ($res > 1) ? esc_html__('months', 'privatecontent-free') : esc_html__('month', 'privatecontent-free'); break;
-                    case 'day'  : $txt = ($res > 1) ? esc_html__('days', 'privatecontent-free') : esc_html__('day', 'privatecontent-free'); break;
-                    case 'hour' : $txt = ($res > 1) ? esc_html__('hours', 'privatecontent-free') : esc_html__('hour', 'privatecontent-free'); break;
-                    case'minute': $txt = ($res > 1) ? esc_html__('minutes', 'privatecontent-free') : esc_html__('minute', 'privatecontent-free'); break;
-                    case'second': $txt = ($res > 1) ? esc_html__('seconds', 'privatecontent-free') : esc_html__('second', 'privatecontent-free'); break;
+                    case 'year' : $txt = ($res > 1) ? esc_html__('years', 'pc_ml') : esc_html__('year', 'pc_ml'); break;
+                    case 'month': $txt = ($res > 1) ? esc_html__('months', 'pc_ml') : esc_html__('month', 'pc_ml'); break;
+                    case 'day'  : $txt = ($res > 1) ? esc_html__('days', 'pc_ml') : esc_html__('day', 'pc_ml'); break;
+                    case 'hour' : $txt = ($res > 1) ? esc_html__('hours', 'pc_ml') : esc_html__('hour', 'pc_ml'); break;
+                    case'minute': $txt = ($res > 1) ? esc_html__('minutes', 'pc_ml') : esc_html__('minute', 'pc_ml'); break;
+                    case'second': $txt = ($res > 1) ? esc_html__('seconds', 'pc_ml') : esc_html__('second', 'pc_ml'); break;
                 }
                 return $res. ' ' .$txt;
             }
@@ -546,16 +546,6 @@
         }

         $rpt = array('post','page');
-
-        /* NFPCF */
-        $cpt = get_option('pg_extend_cpt');
-        if(is_array($cpt)) {
-            foreach($cpt as $pt) {
-                if(is_admin() || post_type_exists($pt)) { // frontend check - be sure CPT are registered
-                    $rpt[] = $pt;
-                }
-            }
-        }

         // PC-FILTER - allow manual CPT integration - passes already affected CPT slugs array
         $rpt = apply_filters('pvtcont_affected_pt', $rpt);
@@ -574,16 +564,6 @@

         $tax = array('category');

-        /* NFPCF */
-        $cts = get_option('pg_extend_ct');
-        if(is_array($cts)) {
-            foreach($cts as $ct) {
-                if(is_admin() || taxonomy_exists($ct)) {
-                    $tax[] = $ct;
-                }
-            }
-        }
-
         // PC-FILTER - allow manual taxonomies integration - passes already affected taxonomies slug array
         $tax = apply_filters('pvtcont_affected_tax', $tax);

@@ -648,14 +628,14 @@

         // pvtContent cats
         $opts['pc_cats'] = array(
-            'name' => esc_html__('User Categories', 'privatecontent-free'),
+            'name' => esc_html__('User Categories', 'pc_ml'),
             'opts' => array()
         );

         if($bulk_opts) {
             $opts['pc_cats']['opts'] = array(
-                'all'       => esc_html__('Any logged user', 'privatecontent-free'),
-                'unlogged'  => esc_html__('Unlogged Users', 'privatecontent-free'),
+                'all'       => esc_html__('Any logged user', 'pc_ml'),
+                'unlogged'  => esc_html__('Unlogged Users', 'pc_ml'),
             );
         }

@@ -761,7 +741,7 @@
             return $form_code;
         }

-        return '<div class="pc_aligned_form pc_falign_'. $align .'">'. $form_code .'</div>';
+        return '<div class="pc_aligned_form pc_falign_'. esc_attr($align) .'">'. $form_code .'</div>';
     }


@@ -816,41 +796,41 @@

                 if($curr_pag < 2) {
                     $code .= '
-                    <span class="tablenav-pages-navspan button disabled" title="'. esc_attr__('First page', 'privatecontent-free') .'">«</span>
-                    <span class="tablenav-pages-navspan button disabled" title="'. esc_attr__('Previous page', 'privatecontent-free') .'">‹</span>';
+                    <span class="tablenav-pages-navspan button disabled" title="'. esc_attr__('First page', 'pc_ml') .'">«</span>
+                    <span class="tablenav-pages-navspan button disabled" title="'. esc_attr__('Previous page', 'pc_ml') .'">‹</span>';
                 }
                 else {
                     $code .= '
-                    <a class="first-page button" href="'. esc_attr($first_url) .'" title="'. esc_attr__('First page', 'privatecontent-free') .'">
-                        <span class="screen-reader-text">'. esc_html__('First page', 'privatecontent-free') .'</span>
+                    <a class="first-page button" href="'. esc_attr($first_url) .'" title="'. esc_attr__('First page', 'pc_ml') .'">
+                        <span class="screen-reader-text">'. esc_html__('First page', 'pc_ml') .'</span>
                         <span aria-hidden="true">«</span>
                     </a>
-                    <a class="prev-page button" href="'. esc_attr($prev_url) .'" title="'. esc_attr__('Previous page', 'privatecontent-free') .'">
-                        <span class="screen-reader-text">'. esc_html__('Previous page', 'privatecontent-free') .'</span>
+                    <a class="prev-page button" href="'. esc_attr($prev_url) .'" title="'. esc_attr__('Previous page', 'pc_ml') .'">
+                        <span class="screen-reader-text">'. esc_html__('Previous page', 'pc_ml') .'</span>
                         <span aria-hidden="true">‹</span>
                     </a>';
                 }

                 $code .= '
                 <span class="paging-input">
-                    <label class="screen-reader-text">'. esc_html__('Current Page', 'privatecontent-free') .'</label>
+                    <label class="screen-reader-text">'. esc_html__('Current Page', 'pc_ml') .'</label>
                     <input class="current-page pc_ulist_pagenum_input" type="text" name="pagenum" value="'. $curr_pag .'" size="1" data-tot-pag="'. $tot_pages .'" autocomplete="off" />
-                    <span class="tablenav-paging-text"> '. esc_html__('of', 'privatecontent-free') .' <span class="total-pages">'. $tot_pages .'</span></span>
+                    <span class="tablenav-paging-text"> '. esc_html__('of', 'pc_ml') .' <span class="total-pages">'. $tot_pages .'</span></span>
                 </span>';

                 if($curr_pag == $tot_pages) {
                     $code .= '
-                    <span class="tablenav-pages-navspan button disabled" title="'. esc_attr__('Next page', 'privatecontent-free') .'">›</span>
-                    <span class="tablenav-pages-navspan button disabled" title="'. esc_attr__('Last page', 'privatecontent-free') .'">»</span>';
+                    <span class="tablenav-pages-navspan button disabled" title="'. esc_attr__('Next page', 'pc_ml') .'">›</span>
+                    <span class="tablenav-pages-navspan button disabled" title="'. esc_attr__('Last page', 'pc_ml') .'">»</span>';
                 }
                 else {
                     $code .= '
-                    <a class="next-page button" href="'. esc_attr($next_url) .'" title="'. esc_attr__('Next page', 'privatecontent-free') .'">
-                        <span class="screen-reader-text">'. esc_html__('Next page', 'privatecontent-free') .'></span>
+                    <a class="next-page button" href="'. esc_attr($next_url) .'" title="'. esc_attr__('Next page', 'pc_ml') .'">
+                        <span class="screen-reader-text">'. esc_html__('Next page', 'pc_ml') .'></span>
                         <span aria-hidden="true">›</span>
                     </a>
-                    <a class="last-page button" href="'. esc_attr($last_url) .'" title="'. esc_attr__('Last page', 'privatecontent-free') .'">
-                        <span class="screen-reader-text">'. esc_html__('Last page', 'privatecontent-free') .'></span>
+                    <a class="last-page button" href="'. esc_attr($last_url) .'" title="'. esc_attr__('Last page', 'pc_ml') .'">
+                        <span class="screen-reader-text">'. esc_html__('Last page', 'pc_ml') .'></span>
                         <span aria-hidden="true">»</span>
                     </a>';
                 }
@@ -868,40 +848,40 @@
     public static function default_ulist_cols() {
         return array(
             'name' => array(
-                'name' 		=> (get_option('pg_use_first_last_name')) ? esc_html__('First name', 'privatecontent-free') : esc_html__('Name', 'privatecontent-free'),
+                'name' 		=> (get_option('pg_use_first_last_name')) ? esc_html__('First name', 'pc_ml') : esc_html__('Name', 'pc_ml'),
                 'sortable' 	=> true,
                 'is_date'   => false,
             ),
             'surname' => array(
-                'name' 		=> (get_option('pg_use_first_last_name')) ? esc_html__('Last name', 'privatecontent-free') : esc_html__('Surname', 'privatecontent-free'),
+                'name' 		=> (get_option('pg_use_first_last_name')) ? esc_html__('Last name', 'pc_ml') : esc_html__('Surname', 'pc_ml'),
                 'sortable' 	=> true,
                 'is_date'   => false,
             ),
             'email' => array(
-                'name' 		=> esc_html__('E-mail', 'privatecontent-free'),
+                'name' 		=> esc_html__('E-mail', 'pc_ml'),
                 'sortable' 	=> true,
                 'is_date'   => false,
             ),
             'tel' => array(
-                'name' 		=> esc_html__('Telephone', 'privatecontent-free'),
+                'name' 		=> esc_html__('Telephone', 'pc_ml'),
                 'sortable' 	=> true,
                 'width'		=> '120px',

                 'is_date'   => false,
             ),
             'categories' => array(
-                'name' 		=> esc_html__('Categories', 'privatecontent-free'),
+                'name' 		=> esc_html__('Categories', 'pc_ml'),
                 'sortable' 	=> false,
                 'is_date'   => false,
             ),
             'insert_date' => array(
-                'name' 		=> esc_html__('Registered', 'privatecontent-free'),
+                'name' 		=> esc_html__('Registered', 'pc_ml'),
                 'sortable' 	=> true,
                 'width'		=> '152px',
                 'is_date'   => true,
             ),
             'last_access' => array(
-                'name' 		=> esc_html__('Last access', 'privatecontent-free'),
+                'name' 		=> esc_html__('Last access', 'pc_ml'),
                 'sortable' 	=> true,
                 'width'		=> '110px',
                 'is_date'   => true,
@@ -1066,7 +1046,7 @@


     // given a settings option name, echoes (or returns it) getting the default value from defined settings
-    public static function get_opt_for_css($opt_name, $echo = true, $recursive_array = false) {
+    public static function get_opt_for_css($opt_name, $echo = true, $recursive_array = false, $recursive_count = 0) {
         if(isset($GLOBALS['pvtcont_get_opt_for_css_cache']) && isset($GLOBALS['pvtcont_get_opt_for_css_cache'][$opt_name])) {
             $val = $GLOBALS['pvtcont_get_opt_for_css_cache'][$opt_name];
         }
@@ -1088,13 +1068,14 @@
             // search
             $result = false;

-            if(isset($array[$opt_name])) {
-                $result = $array[$opt_name];
+            if(isset($array[$opt_name]) || $recursive_count > 5) {
+                $result = (isset($array[$opt_name])) ? $array[$opt_name] : '';
             }
             else {
                 foreach($array as $key => $val) {
                     if(is_array($val) && !isset($val['type'])) { // skip fields definition arrays
-                        $result = self::get_opt_for_css($opt_name, $echo, $val);
+                        $rcc = $recursive_count++;
+                        $result = self::get_opt_for_css($opt_name, $echo, $val, $rcc);

                         if($result) {
                             break;
@@ -1232,42 +1213,42 @@
             'pcud' => array(
                 'name' => 'User Data',
                 'descr'	=> 'User Data add-on boosts PrivateContent plugin allowing you to create and use unlimited fields to record more informations from your users',
-                'link'	=> 'https://charon.lcweb.it/bff73641?ref=pc_addons_adv',
+                'link'	=> 'https://charon.lcweb.it/bff73641?utm_source=pc_addons_adv',
                 'path'	=> 'private-content-user-data/pc_user_data.php'
             ),

             'pcfm' => array(
                 'name' 	=> 'Files Manager',
                 'descr'	=> 'Unlimited upload fields and restricted files for PrivateContent users. Google Analytics tracking and six different file view layouts to use',
-                'link'	=> 'https://charon.lcweb.it/46223884?ref=pc_addons_adv',
+                'link'	=> 'https://charon.lcweb.it/46223884?utm_source=pc_addons_adv',
                 'path'	=> 'private-content-files-manager/pc_files_manager.php'
             ),

             'pcpp' => array(
                 'name' 	=> 'Premium Plans',
                 'descr'	=> 'Turn PrivateContent into a true premium membership platform. The add-on takes advantage of WooCommerce systems to handle payments and set subscription time limits',
-                'link'	=> 'https://charon.lcweb.it/7937f589?ref=pc_addons_adv',
+                'link'	=> 'https://charon.lcweb.it/7937f589?utm_source=pc_addons_adv',
                 'path'	=> 'private-content-premium-plans/pc_premium_plans.php'
             ),

             'pcma' => array(
                 'name' => 'Mail Actions',
                 'descr'	=> 'Manages PrivateContent e-mail operations: e-mail address validation, password retrieval, MailPoet + Mailchimp sync and much more. Finally a true e-mail marketing campaign engine to run your newsletters!',
-                'link'	=> 'https://charon.lcweb.it/b1f9f472?ref=pc_addons_adv',
+                'link'	=> 'https://charon.lcweb.it/b1f9f472?utm_source=pc_addons_adv',
                 'path'	=> 'private-content-mail-actions/pc_mail_actions.php'
             ),

             'pczw' => array(
                 'name' => 'Data Bridge',
                 'descr'	=> 'Connect PrivateContent with external systems: manage or send users data through webhooks. Enjoy the native Zapier integration or use user actions to update their data!',
-                'link'	=> 'https://charon.lcweb.it/e0f2f688?ref=pc_addons_adv',
+                'link'	=> 'https://charon.lcweb.it/e0f2f688?utm_source=pc_addons_adv',
                 'path'	=> 'private-content-data-bridge/pc-data-bridge.php'
             ),

             'pcua' => array(
                 'name' => 'User Activities',
                 'descr'	=> 'A powerful and easy-to-use solution to track PrivateContent users interaction on your website. Includes also a scheduled e-mail report and PDF export engine!',
-                'link'	=> 'https://charon.lcweb.it/f2ce52ae?ref=pc_addons_adv',
+                'link'	=> 'https://charon.lcweb.it/f2ce52ae?utm_source=pc_addons_adv',
                 'path'	=> 'private-content-user-activities/pc_user_activities.php'
             ),
         );
@@ -1329,13 +1310,13 @@
                     'form_wrap'     => $form_wrap,

                     'labels'        => array(
-                        '🔍 '. esc_html__('Search icons ..', 'privatecontent-free'),
-                        esc_html__('All categories', 'privatecontent-free'),
-                        esc_html__('Solid', 'privatecontent-free'),
-                        esc_html__('Regular', 'privatecontent-free'),
-                        esc_html__('Brands', 'privatecontent-free'),
-                        esc_html__('no icon', 'privatecontent-free'),
-                        esc_html__('.. no icons found ..', 'privatecontent-free'),
+                        '🔍 '. esc_html__('Search icons ..', 'pc_ml'),
+                        esc_html__('All categories', 'pc_ml'),
+                        esc_html__('Solid', 'pc_ml'),
+                        esc_html__('Regular', 'pc_ml'),
+                        esc_html__('Brands', 'pc_ml'),
+                        esc_html__('no icon', 'pc_ml'),
+                        esc_html__('.. no icons found ..', 'pc_ml'),
                     )
                 )) .'
             </div>';
@@ -1366,7 +1347,7 @@
             }


-            tb_show("'. esc_html__('Icons picker', 'privatecontent-free') .'", `#TB_inline?inlineId='. esc_js($prefix) .'_icons_list`);
+            tb_show("'. esc_html__('Icons picker', 'pc_ml') .'", `#TB_inline?inlineId='. esc_js($prefix) .'_icons_list`);
             setTimeout(function() {
                 $(`#TB_window`).addClass(`'. esc_js($prefix) .'_icon_picker_lb`)
                 $(`input[name="lcfah-search"]`).val(``);
@@ -1408,21 +1389,24 @@
         if(!isset($GLOBALS['lcwp_safe_inline_scripts'])) {
             $GLOBALS['lcwp_safe_inline_scripts'] = array();
         }
-        if(in_array($unique_id, $GLOBALS['lcwp_safe_inline_scripts']) && !wp_doing_ajax()) {
+        if(in_array($unique_id, $GLOBALS['lcwp_safe_inline_scripts'])) {
             return '';
         }
         $GLOBALS['lcwp_safe_inline_scripts'][] = $unique_id;

-
         // minify
         $code = trim(preg_replace('/s+/', ' ', str_replace(["r","n","t","v"], '', $code)));

-
-        if(wp_doing_ajax()) {
+        if(
+            wp_doing_ajax() ||
+            (defined('REST_REQUEST') && REST_REQUEST) ||
+            did_action('wp_footer') || doing_action('wp_footer') ||
+            did_action('wp_print_footer_scripts') || doing_action('wp_print_footer_scripts')
+        ) {
             return '<script type="text/javascript">'. $code .'</script>';
         }

-        add_action('wp_footer', function() use ($code) {
+        add_action('wp_print_footer_scripts', function() use ($code) {
             if(function_exists('wp_print_inline_script_tag')){
                 wp_print_inline_script_tag($code);
             } else {
--- a/privatecontent-free/classes/pc_wp_user_caps_static.php
+++ b/privatecontent-free/classes/pc_wp_user_caps_static.php
@@ -432,7 +432,7 @@
     // autocomplete search + user picker module to pick single users able to do things
     public static function autocomplete_users_search_n_pick($field_name, $users = array(), $custom_placeholder = false) {

-        $placeh = ($custom_placeholder) ? $custom_placeholder : '🔍'. esc_attr__(' search users (username, names, e-mail)', 'privatecontent-free');
+        $placeh = ($custom_placeholder) ? $custom_placeholder : '🔍'. esc_attr__(' search users (username, names, e-mail)', 'pc_ml');
         ?>
         <div class="pc_ausnp_wrap">
             <input type="text" name="pc_ausnp" autocomplete="off" maxlength="255" placeholder="<?php echo esc_attr($placeh) ?>" />
@@ -456,7 +456,7 @@
                     ) {
                         echo '
                         <li data-user-id="'. absint($uid) .'">
-                            <span class="dashicons dashicons-no-alt" title="'. esc_attr__('remove user from selection', 'privatecontent-free') .'"></span>
+                            <span class="dashicons dashicons-no-alt" title="'. esc_attr__('remove user from selection', 'pc_ml') .'"></span>
                             <input type="hidden" name="'. esc_attr($field_name) .'[]" value="'. absint($uid) .'" />
                             '. esc_html($user_data->user_login) .'
                         </li>';
@@ -510,7 +510,7 @@
                                         response([{
                                             id      : ``,
                                             value   : ``,
-                                            label   : "'. esc_attr__('Error retrieving users', 'privatecontent-free') .'"
+                                            label   : "'. esc_attr__('Error retrieving users', 'pc_ml') .'"
                                         }]);
                                     }
                                 })
@@ -520,7 +520,7 @@
                                     response([{
                                         id      : ``,
                                         value   : ``,
-                                        label   : "'. esc_attr__('Error retrieving users', 'privatecontent-free') .'"
+                                        label   : "'. esc_attr__('Error retrieving users', 'pc_ml') .'"
                                     }]);
                                 });
                             },
@@ -529,13 +529,13 @@

                                 // check already selected users
                                 if($chosen_ul.find(`[data-user-id="`+ ui.item.id +`"]`).length) {
-                                    lc_wp_popup_message(`error`, "'. esc_attr__('User already selected', 'privatecontent-free') .'");
+                                    lc_wp_popup_message(`error`, "'. esc_attr__('User already selected', 'pc_ml') .'");
                                 }
                                 else {
                                     if(parseInt(ui.item.id, 10)) {
                                         $chosen_ul.append(`
                                         <li data-user-id="${ ui.item.id }">
-                                            <span class="dashicons dashicons-no-alt" title="'. esc_attr__('remove user from selection', 'privatecontent-free') .'"></span>
+                                            <span class="dashicons dashicons-no-alt" title="'. esc_attr__('remove user from selection', 'pc_ml') .'"></span>
                                             <input type="hidden" name="'. esc_attr($field_name) .'[]" value="${ ui.item.id }" />
                                             ${ ui.item.label }
                                         </li>`);
@@ -558,7 +558,7 @@

                 // chosen user removal
                 $(document).on(`click`, `.pc_ucat_mbu_list li span`, function() {
-                    if(typeof(window.pc_ucat_reset_cust_fields) != `undefined` || confirm("'. esc_attr__('Remove selected user?', 'privatecontent-free') .'")) {
+                    if(typeof(window.pc_ucat_reset_cust_fields) != `undefined` || confirm("'. esc_attr__('Remove selected user?', 'pc_ml') .'")) {
                         $(this).parents(`li`).remove();
                     }
                 });
--- a/privatecontent-free/classes/restrictions_wizard.php
+++ b/privatecontent-free/classes/restrictions_wizard.php
@@ -576,7 +576,7 @@
 		if(!is_object($term_data)) :
 			?>
 			<div class="form-field pc_tax_restr_wizard">
-				<h4>PrivateContent - <?php esc_html_e("Restrictions Wizard", 'privatecontent-free') ?></h4>
+				<h4>PrivateContent - <?php esc_html_e("Restrictions Wizard", 'pc_ml') ?></h4>
 				<?php echo pc_static::wp_kses_ext($this->wizard_code('tax', $term_id)) ?>
 			</div>

@@ -590,7 +590,7 @@

 			<td class="pc_tax_restr_wizard_td">
 				<div class="form-field pc_tax_restr_wizard">
-					<h4>PrivateContent - <?php esc_html_e("Restrictions Wizard", 'privatecontent-free') ?></h4>
+					<h4>PrivateContent - <?php esc_html_e("Restrictions Wizard", 'pc_ml') ?></h4>
 					<?php echo pc_static::wp_kses_ext($this->wizard_code('tax', $term_id)) ?>
 				</div>
 			</td>
@@ -624,7 +624,7 @@

 		// add a meta box for affected post types and be sure excerpt is there for Contents hiding
 		foreach(pc_static::affected_pt() as $type){
-			add_meta_box('pc_redirect_meta', "PvtContent - ". esc_html__(" Restrictions Wizard", 'privatecontent-free'), array($this, 'posts_form_implementation'), $type, 'side', 'default');
+			add_meta_box('pc_redirect_meta', "PvtContent - ". esc_html__(" Restrictions Wizard", 'pc_ml'), array($this, 'posts_form_implementation'), $type, 'side', 'default');
 			add_post_type_support($type, 'excerpt');

 			add_filter('manage_edit-'.$type.'_columns', array($this, 'postNterms_list_pc_col_head'));
@@ -679,20 +679,20 @@
 			$code .= '
 			<div class="pc_restr_wizard_block pc_rw_redir">
 				<legend>
-					<i class="fas fa-lock" ></i><strong>'. esc_html__('Redirect', 'privatecontent-free') .'</strong>
+					<i class="fas fa-lock" ></i><strong>'. esc_html__('Redirect', 'pc_ml') .'</strong>
 					'. $this->inherited_restr_helper('redirect', $subj_type, $subj_id) .'
 				</legend>'.$tax_tb.'
 				<fieldset>
-					<label>'. esc_html__('Who can access this page?', 'privatecontent-free') .'</label>
-					<select name="pc_redirect_allow[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'privatecontent-free') .'" autocomplete="off">
+					<label>'. esc_html__('Who can access this page?', 'pc_ml') .'</label>
+					<select name="pc_redirect_allow[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'pc_ml') .'" autocomplete="off">
 						'. pc_static::user_cat_dd_opts($data['redirect_allow']) .'
 					</select>
 					<input type="hidden" name="pc_redirect_allow_check" value="'. esc_attr(implode(',', $data['redirect_allow'])) .'" />
 				</fieldset>
 				<fieldset class="'. $redirect_block_vis .'">
 					<hr/>
-					<label>'. esc_html__('Among them - want to block someone?', 'privatecontent-free') .'</label>
-					<select name="pc_redirect_block[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'privatecontent-free') .'" autocomplete="off">
+					<label>'. esc_html__('Among them - want to block someone?', 'pc_ml') .'</label>
+					<select name="pc_redirect_block[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'pc_ml') .'" autocomplete="off">
 						'. pc_static::user_cat_dd_opts($data['redirect_block'], false) .'
 					</select>
 					<input type="hidden" name="pc_redirect_block_check" value="'. esc_attr(implode(',', $data['redirect_block'])) .'" />
@@ -705,19 +705,19 @@
             <hr/>
 			<div class="pc_restr_wizard_block pc_rw_cont_h">
 				<legend>
-					<i class="fas fa-eye-slash" ></i><strong>'. esc_html__('Contents Hiding', 'privatecontent-free') .'</strong>
+					<i class="fas fa-eye-slash" ></i><strong>'. esc_html__('Contents Hiding', 'pc_ml') .'</strong>
 					'. $this->inherited_restr_helper('cont_hide', $subj_type, $subj_id) .'
 				</legend>'.$tax_tb.'
 				<fieldset>
-					<label>'. esc_html__('Who can see contents?', 'privatecontent-free') .'</label>
-					<select name="pc_cont_hide_allow[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'privatecontent-free') .'" autocomplete="off">
+					<label>'. esc_html__('Who can see contents?', 'pc_ml') .'</label>
+					<select name="pc_cont_hide_allow[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'pc_ml') .'" autocomplete="off">
 						'. pc_static::user_cat_dd_opts($data['cont_hide_allow'], true, true, array('unlogged')) .'
 					</select>
 				</fieldset>
 				<fieldset class="'. $cont_hide_block_vis .'">
 					<hr/>
-					<label>'. esc_html__('Among them - want to block someone?', 'privatecontent-free') .'</label>
-					<select name="pc_cont_hide_block[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'privatecontent-free') .'" autocomplete="off">
+					<label>'. esc_html__('Among them - want to block someone?', 'pc_ml') .'</label>
+					<select name="pc_cont_hide_block[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'pc_ml') .'" autocomplete="off">
 						'. pc_static::user_cat_dd_opts($data['cont_hide_block'], false) .'
 					</select>
 				</fieldset>
@@ -730,19 +730,19 @@
                 <hr/>
 				<div class="pc_restr_wizard_block pc_rw_comm_h">
 					<legend>
-						<i class="fas fa-comment-slash" ></i><strong>'. esc_html__('Comments', 'privatecontent-free') .'</strong>
+						<i class="fas fa-comment-slash" ></i><strong>'. esc_html__('Comments', 'pc_ml') .'</strong>
 						'. $this->inherited_restr_helper('comm_hide', $subj_type, $subj_id) .'
 					</legend>'.$tax_tb.'
 					<fieldset>
-						<label>'. esc_html__('Who can see comments?', 'privatecontent-free') .'</label>
-						<select name="pc_comm_hide_allow[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'privatecontent-free') .'" autocomplete="off">
+						<label>'. esc_html__('Who can see comments?', 'pc_ml') .'</label>
+						<select name="pc_comm_hide_allow[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'pc_ml') .'" autocomplete="off">
 							'. pc_static::user_cat_dd_opts($data['comm_hide_allow'], true, true, array('unlogged')) .'
 						</select>
 					</fieldset>
 					<fieldset class="'. $comm_hide_block_vis .'">
 						<hr/>
-						<label>'. esc_html__('Among them - want to block someone?', 'privatecontent-free') .'</label>
-						<select name="pc_comm_hide_block[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'privatecontent-free') .'" autocomplete="off">
+						<label>'. esc_html__('Among them - want to block someone?', 'pc_ml') .'</label>
+						<select name="pc_comm_hide_block[]" multiple="multiple" class="pc_restr_wiz_lcslt" data-placeholder="'. esc_attr__('Leave empty to ignore', 'pc_ml') .'" autocomplete="off">
 							'. pc_static::user_cat_dd_opts($data['comm_hide_block'], false) .'
 						</select>
 					</fieldset>
@@ -753,18 +753,18 @@
 			// LIGHTBOX ON OPENING
 			if(!empty($lb_instances)) {
 				$lb_instances = array(
-					'inherit' 	=> '('. esc_html__('inherit', 'privatecontent-free') .')',
-					'none' 			=> esc_html__('No', 'privatecontent-free')
+					'inherit' 	=> '('. esc_html__('inherit', 'pc_ml') .')',
+					'none' 			=> esc_html__('No', 'pc_ml')
 				) + $lb_instances;

 				$code .= '
 				<hr/>
 				<div class="pc_restr_wizard_block pc_rw_lb">
 					<legend>
-						<i class="far fa-window-restore" ></i><strong>'. esc_html__("Lightbox on page's opening", 'privatecontent-free') .'</strong>
+						<i class="far fa-window-restore" ></i><strong>'. esc_html__("Lightbox on page's opening", 'pc_ml') .'</strong>
 					</legend>'.$tax_tb.'
 					<fieldset>
-						<label>'. esc_html__('Displayed for unlogged users', 'privatecontent-free') .'</label>
+						<label>'. esc_html__('Displayed for unlogged users', 'pc_ml') .'</label>
                         '. $this->inherited_restr_helper('lb_on_open', $subj_type, $subj_id) .'

 						<select name="pc_lb_on_open" autocomplete="off">';
@@ -894,7 +894,7 @@
                 }

 				if($restr == 'no') {
-                    $txt = esc_html__('No lightbox', 'privatecontent-free');
+                    $txt = esc_html__('No lightbox', 'pc_ml');
                 }
 				else {
 					$lb_instances = pc_static::get_lb_instances();
@@ -909,7 +909,7 @@

 				$helper .= '
 				<dl>
-					<dt>'. $this->restr_subj_to_link($subj) .'</dt><dd>'. esc_html__('uses', 'privatecontent-free') .' <em>'. $txt .'</em></dd>
+					<dt>'. $this->restr_subj_to_link($subj) .'</dt><dd>'. esc_html__('uses', 'pc_ml') .' <em>'. $txt .'</em></dd>
 				</dl>';
 			}
 		}
@@ -924,11 +924,11 @@
                     continue;
                 }

-				$txt = ($restr == 'no') ? esc_html__('No', 'privatecontent-free') : esc_html__('Yes', 'privatecontent-free');
+				$txt = ($restr == 'no') ? esc_html__('No', 'pc_ml') : esc_html__('Yes', 'pc_ml');

 				$helper .= '
 				<dl>
-					<dt>'. $this->restr_subj_to_link($subj) .'</dt><dd>'. esc_html__('uses', 'privatecontent-free') .' <em>'. $txt .'</em></dd>
+					<dt>'. $this->restr_subj_to_link($subj) .'</dt><dd>'. esc_html__('uses', 'pc_ml') .' <em>'. $txt .'</em></dd>
 				</dl>';
 			}
 		}
@@ -940,11 +940,11 @@
 				if(($suppress_self && $subj == 'self') || empty($restr)) {continue;}

 				// check also blocks
-				$blocks_txt = (isset($restr['block']) && !empty($restr['block'])) ? ' '. esc_html__('and blocks', 'privatecontent-free') .' <em class="pc_rwh_block">'. $this->restr_arr_to_string($restr['block']) .'</em>' : '';
+				$blocks_txt = (isset($restr['block']) && !empty($restr['block'])) ? ' '. esc_html__('and blocks', 'pc_ml') .' <em class="pc_rwh_block">'. $this->restr_arr_to_string($restr['block']) .'</em>' : '';

 				$helper .= '
 				<dl>
-					<dt>'. $this->restr_subj_to_link($subj) .'</dt><dd>'. esc_html__('allows', 'privatecontent-free') .' <em class="pc_rwh_allow">'. $this->restr_arr_to_string($restr['allow']) .'</em>' . $blocks_txt .'</dd>
+					<dt>'. $this->restr_subj_to_link($subj) .'</dt><dd>'. esc_html__('allows', 'pc_ml') .' <em class="pc_rwh_allow">'. $this->restr_arr_to_string($restr['allow']) .'</em>' . $blocks_txt .'</dd>
 				</dl>';
 			}
 		}
@@ -967,7 +967,7 @@

 		// special case - self restrictions
 		if($subj == 'self') {
-			return '<a href="#"><i class="far fa-arrow-alt-circle-right"></i>' . esc_html__('self restriction', 'privatecontent-free') .'</a>';
+			return '<a href="#"><i class="far fa-arrow-alt-circle-right"></i>' . esc_html__('self restriction', 'pc_ml') .'</a>';
 		}

 		// retrieve subj and ID
@@ -1035,7 +1035,7 @@
 		$columns_local = array();

 		if(!isset($columns_local['pvtcontent'])) {
-			$columns_local['pvtcontent'] = '<span class="pc_help_cursor" title="'. esc_attr__('restrictions summary', 'privatecontent-free') .'">PrivateContent</span>';
+			$columns_local['pvtcontent'] = '<span class="pc_help_cursor" title="'. esc_attr__('restrictions summary', 'pc_ml') .'">PrivateContent</span>';
 		}
 		return array_merge($columns, $columns_local);
 	}
@@ -1074,23 +1074,23 @@
 				$nr_class = 'pc_rw_no_restr';
 				switch($restr) {
 					case 'cont_hide' :
-						$icon = '<i class="fas fa-eye-slash '.$nr_class.'" title="'. esc_attr__('no contents restriction', 'privatecontent-free') .'"></i>';
+						$icon = '<i class="fas fa-eye-slash '.$nr_class.'" title="'. esc_attr__('no contents restriction', 'pc_ml') .'"></i>';
 						break;

 					case 'comm_hide' :
-						$icon = '<i class="fas fa-comment-slash '.$nr_class.'" title="'. esc_attr__('no comments hidin

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School