{"id":240030,"date":"2025-07-10T12:32:54","date_gmt":"2025-07-10T12:32:54","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/otp-content-protect\/"},"modified":"2025-07-18T17:28:54","modified_gmt":"2025-07-18T17:28:54","slug":"otp-content-protect","status":"publish","type":"plugin","link":"https:\/\/lmo.wordpress.org\/plugins\/otp-content-protect\/","author":18109109,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.3.5","stable_tag":"1.3.5","tested":"6.8.5","requires":"6.0","requires_php":"7.0","requires_plugins":null,"header_name":"OTP Content Protect","header_author":"Tim Ehling","header_description":"OTP Content Protect allows administrators to create secure one-time passwords for individual posts, pages, and custom post types. Visitors must enter the correct OTP to view the protected content. After a single use, an OTP can optionally be reset for reuse.","assets_banners_color":"7fc7bc","last_updated":"2025-07-18 17:28:54","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/die-mainagentur.de","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/otp-content-protect\/","header_author_uri":"https:\/\/die-mainagentur.de","rating":5,"author_block_rating":0,"active_installs":40,"downloads":581,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.2":{"tag":"1.3.2","author":"tehling","date":"2025-07-10 12:36:08"},"1.3.3":{"tag":"1.3.3","author":"tehling","date":"2025-07-18 17:28:54"},"1.3.4":{"tag":"1.3.4","author":"tehling","date":"2025-07-12 14:16:56"},"1.3.5":{"tag":"1.3.5","author":"tehling","date":"2025-07-18 17:28:54"}},"upgrade_notice":{"1.3.0":"<p>This is a major security and stability update to meet WordPress.org requirements. All plugin functions and database entries are now prefixed to prevent conflicts.<\/p>","1.2.0":"<p>Dynamic AJAX list and improved UX. Tabs now show human-readable post type names.<\/p>","1.1.0":"<p>Single-select dropdown replaced multi-select; search and tabs added.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3325625,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3325625,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3325625,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3325625,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.2","1.3.3","1.3.4","1.3.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3326790,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3326790,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3326790,"resolution":"3","location":"assets","locale":""}},"screenshots":{"1":"The settings page\u2014a clear overview of all generated one-time passwords with key actions like edit, delete, and reset.","2":"The simple password input form a visitor sees on a protected page."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[4252,19827,244844,9210,30794],"plugin_category":[54],"plugin_contributors":[244773],"plugin_business_model":[],"class_list":["post-240030","plugin","type-plugin","status-publish","hentry","plugin_tags-content-locker","plugin_tags-content-protect","plugin_tags-no-registration","plugin_tags-otp","plugin_tags-password-protect","plugin_category-security-and-spam-protection","plugin_contributors-tehling","plugin_committers-tehling"],"banners":{"banner":"https:\/\/ps.w.org\/otp-content-protect\/assets\/banner-772x250.png?rev=3325625","banner_2x":"https:\/\/ps.w.org\/otp-content-protect\/assets\/banner-1544x500.png?rev=3325625","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/otp-content-protect\/assets\/icon-128x128.png?rev=3325625","icon_2x":"https:\/\/ps.w.org\/otp-content-protect\/assets\/icon-256x256.png?rev=3325625","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/otp-content-protect\/assets\/screenshot-1.png?rev=3326790","caption":"The settings page\u2014a clear overview of all generated one-time passwords with key actions like edit, delete, and reset."},{"src":"https:\/\/ps.w.org\/otp-content-protect\/assets\/screenshot-2.png?rev=3326790","caption":"The simple password input form a visitor sees on a protected page."},{"src":"https:\/\/ps.w.org\/otp-content-protect\/assets\/screenshot-3.png?rev=3326790","caption":""}],"raw_content":"<!--section=description-->\n<p>As a WordPress owner who values both <strong>security and a seamless user experience<\/strong>, you often face the challenge of protecting sensitive information. Most password solutions force your visitors to register for an account, granting them potential access to your WordPress environment.<\/p>\n\n<p><strong>This is where \"OTP Content Protect\" comes in, offering an innovative way to protect your content with a One-Time Password (OTP).<\/strong><\/p>\n\n<p>Our plugin was designed to give you full control over your content without opening the doors to your WordPress backend for strangers. Easily and effectively protect individual posts, pages, or even downloads. Your visitors don't need an account and don't have to register\u2014they simply enter the one-time password you provide and get instant access.<\/p>\n\n<p>By not granting unnecessary backend access, you actively minimize the risk of hacker or spam activities. \"OTP Content Protect\" is the perfect blend of simplicity, security, and innovation, making it the ideal password protection for your WordPress site when you need to lock specific content without burdening users with registration.<\/p>\n\n<h4>Support &amp; Feature Requests<\/h4>\n\n<p>We are constantly developing the plugin and welcome your feedback!<\/p>\n\n<ul>\n<li><strong>For questions or issues,<\/strong> please use the official <a href=\"https:\/\/wordpress.org\/support\/plugin\/otp-content-protect\/\">Support Forum on WordPress.org<\/a> or report a bug directly via our <a href=\"https:\/\/die-mainagentur.de\/en\/wordpress-plugin-otp-content-protect\/#submitbug\">Submit a Bug form<\/a>.<\/li>\n<li><strong>Have an idea for a new feature?<\/strong> Submit your feature request easily through our website: <a href=\"https:\/\/die-mainagentur.de\/en\/wordpress-plugin-otp-content-protect\/#featurerequest\">Submit a Feature Request<\/a>.<\/li>\n<\/ul>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Protection Without Registration:<\/strong> The key advantage\u2014visitors don't need a WordPress account.<\/li>\n<li><strong>Flexible Content Protection:<\/strong> Secure posts, pages, or any custom post type.<\/li>\n<li><strong>Simple Password Generation:<\/strong> Creates secure, alphanumeric OTPs (8\u201310 characters).<\/li>\n<li><strong>Full Control:<\/strong> Stores creation date, optional expiration date, and a timestamp of when it was used.<\/li>\n<li><strong>Reusable Passwords:<\/strong> A used OTP can easily be reset for reuse.<\/li>\n<li><strong>Modern Admin Interface:<\/strong> AJAX-powered content list with search and convenient post-type tabs.<\/li>\n<li><strong>Clean Uninstall:<\/strong> An uninstall script completely removes all plugin data from the database upon deletion if desired.<\/li>\n<li><strong>Built for the World:<\/strong> Fully internationalized (i18n) and ready for translation.<\/li>\n<\/ul>\n\n<h3>Usage<\/h3>\n\n<ol>\n<li>Go to the OTP Protect settings page.<\/li>\n<li>Select the content to protect and generate or enter an OTP.<\/li>\n<li>(Optional) Set an expiration date.<\/li>\n<li>Save the OTP and share it with the intended users.<\/li>\n<li>When a visitor accesses the protected content, they will see a simple input form for the password.<\/li>\n<li>Upon valid entry, the original content is displayed instantly.<\/li>\n<li>In the admin overview, you can easily reset or delete used OTPs.<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Unzip and upload the <code>otp-content-protect<\/code> folder to your <code>\/wp-content\/plugins\/<\/code> directory. Alternatively, find and install it directly via the \"Add New\" plugin screen.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Navigate to Settings \u2192 OTP Protect to configure and generate OTPs.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id='do%20users%20need%20to%20register%20to%20view%20the%20content%3F'><h3>Do users need to register to view the content?<\/h3><\/dt>\n<dd><p>No, and that is the plugin's main advantage. A user only needs to enter the one-time password you provide. No WordPress user account is required.<\/p><\/dd>\n<dt id='how%20can%20i%20allow%20an%20otp%20to%20be%20used%20more%20than%20once%3F'><h3>How can I allow an OTP to be used more than once?<\/h3><\/dt>\n<dd><p>In the admin overview, you can edit any used OTP and reset it with a single click. This clears the usage timestamp and makes the password immediately valid again.<\/p><\/dd>\n<dt id='is%20plugin%20data%20removed%20on%20uninstall%3F'><h3>Is plugin data removed on uninstall?<\/h3><\/dt>\n<dd><p>Yes. When you delete the plugin from the WordPress admin area, the included <code>uninstall.php<\/code> file ensures the associated database table (<code>&lt;prefix&gt;_otpcp_protect<\/code>) is cleanly removed.<\/p><\/dd>\n<dt id='can%20multiple%20passwords%20be%20active%20for%20the%20same%20post%3F'><h3>Can multiple passwords be active for the same post?<\/h3><\/dt>\n<dd><p>Yes. You can create multiple different and simultaneously active OTPs for the same piece of content. Each one will be validated correctly upon entry.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.5<\/h4>\n\n<ul>\n<li><strong>Enhancement:<\/strong> Implemented a new protection method using the <code>template_redirect<\/code> hook to provide proper compatibility for WooCommerce Products.<\/li>\n<li><strong>Enhancement:<\/strong> Added a \"View\" link to the row actions in the admin list to quickly open the protected content.<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li><strong>Enhancement:<\/strong> Replaced the password list with a professional, sortable, and searchable table (WP_List_Table).<\/li>\n<li><strong>Enhancement:<\/strong> Restructured the admin page to match WordPress standards (separate Add\/Edit view), which also fixes the placement of admin notices.<\/li>\n<li><strong>Tweak:<\/strong> Updated the styling of filter buttons to match the modern WordPress UI.<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li><strong>Fix:<\/strong> Corrected a bug where only the first created OTP for a page was accepted. Now, multiple different OTPs can be active for the same content simultaneously, and each will be validated correctly.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li><strong>Fix:<\/strong> Addressed final <code>WordPress.DB.PreparedSQL.NotPrepared<\/code> false-positive errors by adding specific <code>phpcs:ignore<\/code> comments to pass the \"Plugin Check\" tool cleanly.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li><strong>Fix:<\/strong> Resolved several warnings from the \"Plugin Check\" tool related to direct database queries and input validation.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li><strong>Security:<\/strong> Major refactoring to meet official WordPress.org requirements. All functions, classes, hooks, and the database table now use a unique <code>otpcp_<\/code> prefix to prevent conflicts.<\/li>\n<li><strong>Security:<\/strong> Standardized and improved all nonce checks for better security.<\/li>\n<li><strong>Fix:<\/strong> Corrected various bugs in the admin area, including broken edit links and script loading issues that arose during the refactoring.<\/li>\n<\/ul>","raw_excerpt":"The easiest way to protect WordPress content with an OTP. Secure posts and pages with a one-time password\u2014no user registration required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/240030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=240030"}],"author":[{"embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tehling"}],"wp:attachment":[{"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=240030"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=240030"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=240030"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=240030"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=240030"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=240030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}