=== RIACO Content Protector ===
Contributors: prototipo88
Tags: content protection, password, password protection, hide content, restrict content
Requires at least: 6.2
Tested up to: 6.8
Requires PHP: 7.4
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Protect any portion of your WordPress content using a simple shortcode. Includes global password, AJAX unlock, and site-wide instant access.

== Description ==

**RIACO Content Protector** allows you to protect *any part* of your WordPress content using a shortcode.  
Unlike the built-in post password protection, this plugin protects only what you wrap, *not the whole post*.

Perfect for:

* Protecting premium blocks of content  
* Protecting guides, downloads, links, or sensitive sections   
* Paywall-style snippets

### Features

* Protect **only specific content** inside posts/pages  
* Uses a minimal shortcode:  
  `[riaco_content_protector] Hidden text here [/riaco_content_protector]`
* **Global password** stored in plain text, like WordPress page passwords.
* AJAX-based form — no page reload  
* Unlocks **all protected sections** on the site after correct password  
* Optional cookie persistence (remember unlocked content for a configurable number of days)   
* Secure implementation using nonces, hashed tokens, and transients   

**Important:**

* The global password is stored in plain text, just like WordPress page passwords. It can be read by user with 'manage_options' ability.
* If the global password or "Remember Unlocked" duration is changed in settings, all existing unlock cookies are invalidated. Users will need to re-enter the new password to access protected content.

### How It Works

Wrap content you want to protect:

`
[riaco_content_protector]
This text will be hidden until the visitor enters the password.
[/riaco_content_protector]
`

Set the global password under:

**Settings > Content Protector**

Visitors will see a modern, styled form.  
After entering the correct password:

* The content unlocks immediately  
* All other protected areas unlock automatically  
* An optional cookie can keep everything unlocked for a chosen number of days  

### Security

* Nonces on every request  
* Secure HMAC token for cookie authentication  
* Sanitized shortcode attributes  
* Escaped output  
* No sensitive data stored in cookies  
* Global password stored in plain text, like WordPress page passwords. 

### Cookie

We use this cookie to understand if user unlocked the content: `riaco_cp_unlocked_global`.

### Style

You can style the content protector box.

It has this class: `.riaco-cp--container`, so you can add in your `style.css`:

`
.riaco-cp--container {
    background: #f8f9fa;
    padding: 20px;
    border: 1px solid #ddd;
    border-radius: 6px;
}
`

You can replace button classes using:

`
add_filter( 'riaco_cp_button_classes', function( $classes ) {
    return 'button my-custom-button-class';
});
`

Or you can remove button classes:

`
add_filter( 'riaco_cp_button_classes', function( $classes ) {
    // Remove wp-element-button
    return str_replace( 'wp-element-button', '', $classes );
});
`

== Installation ==

1. Upload the plugin folder to `/wp-content/plugins/`
2. Activate the plugin through **Plugins > Installed Plugins**
3. Go to **Settings > Content Protector** and configure your global password
4. Add the shortcode to any post or page

`
[riaco_content_protector] This is hidden. [/riaco_content_protector]
`

== Frequently Asked Questions ==

= Can I protect multiple sections on the same page? =  
Yes. All instances use the same global password and unlock together.

= Does this protect the entire post? =  
No — only the content wrapped in the shortcode.

= Are passwords hashed in the database? =
No, the global password is stored in plain text like WordPress page passwords for easy admin management.

= Does this work with Gutenberg / block editor? =  
Yes. It works in both Classic and Block Editor.  
You can insert the shortcode inside Paragraph block or using Shortcode block.

= What happens when I change the global password? =
All previously unlocked content cookies are invalidated. Users must re-enter the new password.

== Screenshots ==

1. Frontend password form  
2. Protected content example  
3. Settings page with global password option  

== Changelog ==

= 1.0.0 =
* Initial release
* Shortcode protection
* Global password
* AJAX unlock
* Cookie remember feature
* Automatic unlock of all instances

== License ==

This plugin is licensed under GPLv2 or later.
