{"id":344043,"date":"2026-07-24T16:36:48","date_gmt":"2026-07-24T16:36:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/private-content-login-protector\/"},"modified":"2026-07-24T16:36:26","modified_gmt":"2026-07-24T16:36:26","slug":"private-content-login-protector","status":"publish","type":"plugin","link":"https:\/\/en-gb.wordpress.org\/plugins\/private-content-login-protector\/","author":23532144,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"1.2.0","tested":"7.0.2","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Private Content Login Protector","header_author":"Abdul Rafay","header_description":"Protect Pages, Posts, WooCommerce Products\/Categories and Custom Post Types behind a completely independent, custom-built login system (no wp-login.php, no WordPress users table involved).","assets_banners_color":"","last_updated":"2026-07-24 16:36:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.0":{"tag":"1.2.0","author":"abdulrafay7299","date":"2026-07-24 16:36:26"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[18193,602,1932,17051,286],"plugin_category":[38,45,58],"plugin_contributors":[273202],"plugin_business_model":[],"class_list":["post-344043","plugin","type-plugin","status-publish","hentry","plugin_tags-content-protection","plugin_tags-login","plugin_tags-membership","plugin_tags-restrict-content","plugin_tags-woocommerce","plugin_category-authentication","plugin_category-ecommerce","plugin_category-user-management","plugin_contributors-abdulrafay7299","plugin_committers-abdulrafay7299"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/private-content-login-protector.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Private Content Login Protector lets you gate any piece of WordPress content behind a login screen that is entirely separate from the normal WordPress login (wp-login.php) and the wp_users table.<\/p>\n\n<p>Key features:<\/p>\n\n<ul>\n<li>Fully custom login, forgot-password and reset-password pages served at <code>\/private-login\/<\/code><\/li>\n<li>Independent user table (<code>wp_pclp_users<\/code>) with its own roles (Plugin Admin, Manager, Viewer)<\/li>\n<li>Per-post \"Protect this content\" metabox for Pages, Posts, WooCommerce Products, and any public Custom Post Type<\/li>\n<li>Product category protection field<\/li>\n<li>Bulk protection toggles (all products \/ all categories \/ all pages \/ all posts \/ specific CPTs)<\/li>\n<li>Fully theme-able login screen (heading, sub-heading, logo, colors, border radius, font, card width)<\/li>\n<li>Configurable session timeout, login attempt limits with lockout, and password reset token expiry<\/li>\n<li>Activity log (login, logout, failed login, password reset) with IP + browser<\/li>\n<li>CSV import\/export of users, JSON import\/export of settings<\/li>\n<li>Shortcodes: [private_login], [private_logout], [current_private_user] (also available as the prefixed aliases [pclp_login], [pclp_logout], [pclp_current_user])<\/li>\n<li>Elementor and WooCommerce compatible<\/li>\n<li>Translation-ready<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>private-content-login-protector<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the \"Plugins\" menu in WordPress.<\/li>\n<li>Go to \"Private Content Login\" in the admin menu to configure the login page design and behaviour.<\/li>\n<li>On first activation, a default account (username <code>admin<\/code>) is created \u2014 check the admin notice for the generated password and change it immediately from the Users screen.<\/li>\n<li>Open any Page, Post, Product, Product Category, or Custom Post Type and check \"Protect this content\" in the metabox \/ category screen, or use the bulk protection toggles in Settings.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20replace%20the%20wordpress%20login%3F\"><h3>Does this replace the WordPress login?<\/h3><\/dt>\n<dd><p>No. WordPress admin login (wp-login.php) and the wp_users table are completely untouched. This plugin manages its own separate set of users and sessions purely for gating front-end content.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20and%20elementor%3F\"><h3>Does it work with WooCommerce and Elementor?<\/h3><\/dt>\n<dd><p>Yes. Product pages, product categories, and the shop page can be protected, and the login templates render independently of page builders so there are no layout conflicts.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Removed: the Custom CSS field has been removed entirely (settings UI, storage, and output). All other design options (colors, logo, background image, border radius, font, card width) are unaffected. Any Custom CSS value saved by a previous version is automatically cleared from the database.<\/li>\n<li>Added: prefixed shortcode aliases [pclp_login], [pclp_logout], and [pclp_current_user], registered alongside the existing [private_login], [private_logout], and [current_private_user] shortcodes (which continue to work unchanged).<\/li>\n<li>Confirmed: every plugin-owned function, class, constant, option, hook, and meta key already uses a unique <code>Pclp<\/code>\/<code>pclp_<\/code>\/<code>PCLP_<\/code> prefix or namespace.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Hardened: Custom CSS is now sanitized with a dedicated, stricter routine (tag\/<code>&lt;\/style&gt;<\/code>-breakout stripping, legacy CSS script-vector removal) both when saved and again at output time.<\/li>\n<li>Hardened: Settings JSON import and Users CSV import now verify the actual uploaded file type (not just the client-supplied file name\/extension) before processing.<\/li>\n<li>Hardened: imported settings JSON is now whitelisted and re-sanitized field-by-field instead of being merged in as-is, so an import can never introduce unexpected option keys or unsanitized values.<\/li>\n<li>Hardened: CSV user export now neutralizes cells that could be interpreted as spreadsheet formulas (CSV\/formula injection protection) when opened in Excel\/Sheets\/etc.<\/li>\n<li>Improved: minor output-escaping consistency pass across the admin Users screen.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Fixed: protected Product Category archives now correctly redirect guests to the custom login page and return them to the same category after login. The old URL builder could produce a link whose path didn't match its query string under certain permalink setups (this is what caused the login screen to sometimes not appear at all); auth URLs are now built explicitly per action and work under both pretty permalinks and plain \"?query-string\" permalinks.<\/li>\n<li>Added: individual (per-item) protection via searchable, AJAX-backed multi-select fields for Products, Product Categories, Pages, Posts, and any Custom Post Type \u2014 usable independently of, or together with, the existing bulk \"Protect all\u2026\" toggles. Selections can be edited later from the same screen.<\/li>\n<li>Added: Product Tag archives can now also be protected (term-level checkbox on the Tags screen, same as Product Categories).<\/li>\n<li>Added: protected products\/pages\/posts are now excluded from front-end search results for logged-out guests instead of leaving them fully searchable.<\/li>\n<li>Added: protected pages\/templates are no longer served from page caches \u2014 a protected response now sends no-cache headers and sets DONOTCACHEPAGE.<\/li>\n<li>Added: rewrite rules automatically re-flush after a plugin update, so the pretty-permalink login URL never goes stale.<\/li>\n<li>Added: Elementor editor\/preview mode is no longer redirected away from protected content, so templates can still be edited normally.<\/li>\n<li>Improved: dashboard \"Protected\" counts now include individually-selected items, not just the per-item checkbox.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Protect Pages, Posts, WooCommerce Products\/Categories, and Custom Post Types behind a completely independent, custom-built login system.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/344043","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=344043"}],"author":[{"embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/abdulrafay7299"}],"wp:attachment":[{"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=344043"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=344043"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=344043"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=344043"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=344043"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-gb.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=344043"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}