{"id":381199,"date":"2026-10-08T15:00:48","date_gmt":"2026-10-08T15:00:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/quiet-content-guard\/"},"modified":"2026-10-09T12:10:11","modified_gmt":"2026-10-09T12:10:11","slug":"freezhao-content-guard","status":"publish","type":"plugin","link":"https:\/\/sr.wordpress.org\/plugins\/freezhao-content-guard\/","author":8566575,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.8","stable_tag":"1.4.8","tested":"7.1.3","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"FREEZhao Content Guard","header_author":"FREEZhao","header_description":"Lightweight, selective content protection for pages, posts, and public custom post types.","assets_banners_color":"3c779b","last_updated":"2026-10-09 12:10:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":142,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.4.7":{"tag":"1.4.7","author":"freezhao","date":"2026-10-08 15:00:35","revision":3734907},"1.4.8":{"tag":"1.4.8","author":"freezhao","date":"2026-10-09 12:10:11","revision":3736594}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3736540,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3736540,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3736414,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3736414,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.4.7","1.4.8"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3736442,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3736442,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3736442,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3736606,"resolution":"4","location":"assets","locale":"","width":1944,"height":809},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3736540,"resolution":"5","location":"assets","locale":"","width":1983,"height":793}},"screenshots":[]},"plugin_section":[],"plugin_tags":[55363,18193,19832,19833,22129],"plugin_category":[],"plugin_contributors":[193933],"plugin_business_model":[],"class_list":["post-381199","plugin","type-plugin","status-publish","hentry","plugin_tags-content-security","plugin_tags-content-protection","plugin_tags-copy-protection","plugin_tags-image-protection","plugin_tags-right-click","plugin_contributors-freezhao","plugin_committers-freezhao"],"banners":{"banner":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/banner-772x250.png?rev=3736414","banner_2x":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/banner-1544x500.png?rev=3736414","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/icon-128x128.png?rev=3736540","icon_2x":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/icon-256x256.png?rev=3736540","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/screenshot-1.png?rev=3736442","caption":""},{"src":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/screenshot-2.png?rev=3736442","caption":""},{"src":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/screenshot-3.png?rev=3736442","caption":""},{"src":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/screenshot-4.png?rev=3736606","caption":""},{"src":"https:\/\/ps.w.org\/freezhao-content-guard\/assets\/screenshot-5.png?rev=3736540","caption":""}],"raw_content":"<!--section=description-->\n<p>FREEZhao Content Guard helps site owners discourage casual copying and saving of protected web content without changing the stored WordPress content.<\/p>\n\n<p>The plugin is designed around two useful defaults:<\/p>\n\n<ul>\n<li>Content Protection ON: content is protected by default, including newly created content. Individual content can be set to Protection OFF.<\/li>\n<li>Protection OFF: content is open by default. Individual content can be set to Content Protection ON.<\/li>\n<\/ul>\n\n<p>Protection can be controlled per action:<\/p>\n\n<ul>\n<li>Text selection<\/li>\n<li>Copy, cut, and paste<\/li>\n<li>Right click<\/li>\n<li>Image dragging<\/li>\n<li>Image saving<\/li>\n<li>Printing<\/li>\n<li>Common copy, save, and print keyboard shortcuts<\/li>\n<\/ul>\n\n<p>Administrators can bypass protection. Optional role-based permissions are grouped under Logged-in Users and are hidden until role-based permissions are enabled.<\/p>\n\n<p>Notifications can be disabled or shown as a browser alert with a custom message.<\/p>\n\n<p>Optional browser deterrents can also discourage common View Source and DevTools shortcuts and detect PrintScreen key events where the browser exposes them.<\/p>\n\n<p>This plugin is a browser-side deterrent, not DRM. A website cannot reliably prevent operating-system screenshots, browser extensions, developer tools, network inspection, or a determined user from accessing data that has already been delivered to the browser.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>FREEZhao Content Guard does not send personal data or browsing activity to external services. Settings are stored locally in the WordPress database.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>freezhao-content-guard<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or upload the ZIP from Plugins &gt; Add New &gt; Upload Plugin.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open Settings &gt; FREEZhao Content Guard.<\/li>\n<li>Choose the global default mode and the actions you want to protect.<\/li>\n<li>Select the public post types that should use the global default.<\/li>\n<li>Configure Special Frontend Pages for the homepage, 404 page, search results, and archive pages.<\/li>\n<li>Use the shield-icon protection box in the editor when a specific page, post, or custom post type needs an ON or OFF override.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20content%20protection%20on%20protect%20new%20content%3F\"><h3>Does Content Protection ON protect new content?<\/h3><\/dt>\n<dd><p>Yes. New content with no explicit override inherits the global default.<\/p><\/dd>\n<dt id=\"can%20i%20leave%20a%20download%20page%20open%3F\"><h3>Can I leave a download page open?<\/h3><\/dt>\n<dd><p>Yes. Set that content to Protection OFF.<\/p><\/dd>\n<dt id=\"can%20i%20protect%20one%20page%20when%20the%20global%20default%20is%20off%3F\"><h3>Can I protect one page when the global default is OFF?<\/h3><\/dt>\n<dd><p>Yes. Set that content to Content Protection ON.<\/p><\/dd>\n<dt id=\"can%20i%20protect%20the%20homepage%2C%20404%20page%2C%20search%20results%2C%20or%20archives%3F\"><h3>Can I protect the homepage, 404 page, search results, or archives?<\/h3><\/dt>\n<dd><p>Yes. Use Special Frontend Pages in Settings &gt; FREEZhao Content Guard. Each context has the same Use Global Default, Content Protection ON, and Protection OFF choices. A static homepage follows the protection setting of its page.<\/p><\/dd>\n<dt id=\"can%20administrators%20bypass%20protection%3F\"><h3>Can administrators bypass protection?<\/h3><\/dt>\n<dd><p>Yes, when Administrator Bypass is enabled.<\/p><\/dd>\n<dt id=\"can%20i%20configure%20different%20permissions%20for%20different%20roles%3F\"><h3>Can I configure different permissions for different roles?<\/h3><\/dt>\n<dd><p>Yes. Enable role-based permissions under Logged-in Users, then configure the Role Permissions matrix.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20prevent%20screenshots%3F\"><h3>Does the plugin prevent screenshots?<\/h3><\/dt>\n<dd><p>No website can reliably prevent operating-system-level screenshots. The optional screenshot setting detects PrintScreen key events when the browser makes the event available.<\/p><\/dd>\n<dt id=\"can%20the%20plugin%20really%20block%20devtools%20or%20view%20source%3F\"><h3>Can the plugin really block DevTools or View Source?<\/h3><\/dt>\n<dd><p>It can deter common keyboard shortcuts and flag likely DevTools opening, but it cannot provide absolute browser security.<\/p><\/dd>\n<dt id=\"what%20does%20reset%20plugin%20data%20remove%3F\"><h3>What does Reset Plugin Data remove?<\/h3><\/dt>\n<dd><p>The reset action removes FREEZhao Content Guard settings, protection metadata stored on posts and pages, and the plugin-created role capabilities. It does not delete posts, pages, media, or other WordPress content.<\/p><\/dd>\n<dt id=\"does%20uninstalling%20the%20plugin%20remove%20its%20database%20data%3F\"><h3>Does uninstalling the plugin remove its database data?<\/h3><\/dt>\n<dd><p>Yes. When WordPress uninstalls FREEZhao Content Guard, its uninstall routine removes the plugin settings, protection metadata, and plugin-created role capabilities.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20visitor%20data%20to%20an%20external%20service%3F\"><h3>Does the plugin send visitor data to an external service?<\/h3><\/dt>\n<dd><p>No. FREEZhao Content Guard does not use external tracking, analytics, or remote APIs.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.4.8<\/h4>\n\n<ul>\n<li>Replaced the long editor protection meta-box heading with a compact blue WordPress Dashicons shield, retaining an accessible screen-reader name.<\/li>\n<li>Expanded the development notes using verifiable earlier release entries.<\/li>\n<\/ul>\n\n<h4>1.4.7<\/h4>\n\n<ul>\n<li>Documented the two WPML third-party hooks with narrowly scoped PHPCS exemptions to avoid false-positive prefix warnings.<\/li>\n<\/ul>\n\n<h4>1.4.6<\/h4>\n\n<ul>\n<li>Added editable protected-screen text for DevTools and print protection.<\/li>\n<li>Added gettext default and optional WPML\/Polylang translation for custom text.<\/li>\n<\/ul>\n\n<h4>1.4.5<\/h4>\n\n<ul>\n<li>Initialize role permissions before the role-based toggle is enabled, and preserve explicitly unchecked permissions.<\/li>\n<li>Avoid false DevTools detection caused by mobile browser viewport differences.<\/li>\n<\/ul>\n\n<h4>1.4.4<\/h4>\n\n<ul>\n<li>Standardized the plugin identity, slug, and text domain for WordPress.org compatibility.<\/li>\n<li>Removed the post-activation dashboard redirect while retaining the direct Settings action link on the Plugins screen.<\/li>\n<li>Moved settings-page JavaScript into an enqueued admin script and removed inline script handlers.<\/li>\n<\/ul>\n\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>Added a Settings action link to the Plugins screen for administrators with access to plugin settings.<\/li>\n<li>Added a one-time settings redirect after normal single-plugin activation; this behavior was removed in 1.4.4 for a simpler WordPress.org-compliant admin experience.<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Added three-state protection controls for the homepage, 404 page, search results, and archive pages.<\/li>\n<li>Extended frontend protection beyond singular content while preserving per-content overrides for individual posts and pages.<\/li>\n<li>Clarified that a static homepage follows its own page-level protection setting.<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Fixed Plugin Check nonce-related false-positive warnings around the reset success query parameter by validating it with a filtered input value.<\/li>\n<li>Fixed uninstall.php global variable naming warnings for multisite cleanup.<\/li>\n<li>Avoided capability database writes on every frontend request; capabilities are synchronized when plugin settings change or when the plugin is activated.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added a protected reset action at the bottom of the settings page to remove all FREEZhao Content Guard data from the current site without deleting site content.<\/li>\n<li>Reset now removes plugin settings, per-content protection metadata, and plugin-created role capabilities.<\/li>\n<li>Hardened uninstall cleanup to remove all plugin data, including protection metadata and custom role capabilities.<\/li>\n<li>Added multisite-aware uninstall cleanup for all sites in a network.<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Restored the visual DevTools deterrent: when likely DevTools opening is detected, protected page content is replaced in the viewport by a \"Protected content\" message.<\/li>\n<li>Removed the hidden <code>.gitkeep<\/code> file to satisfy Plugin Check.<\/li>\n<li>Fixed the Stable tag to match the plugin version.<\/li>\n<li>Prefixed uninstall.php global-scope variables with the full plugin prefix for Plugin Check compatibility.<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>Administrator role permissions now default to all unchecked; administrator bypass remains controlled separately by the Administrator Bypass setting.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Moved Advanced Browser Deterrents directly after Protected Actions.<\/li>\n<li>Refined Logged-in Users &gt; Role Permissions hierarchy, spacing, and default selections.<\/li>\n<li>Role Permissions now starts with all actions selected for newly initialized roles; existing explicit choices remain respected.<\/li>\n<li>Added the languages directory required by the plugin text-domain path.<\/li>\n<li>Fixed Plugin Check naming warnings caused by versioned plugin folder names and uninstall variable prefixes.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Updated plugin identity, text-domain consistency, and WordPress.org submission compatibility.<\/li>\n<li>Fixed text-domain consistency for internationalization.<\/li>\n<li>Removed the third-party Update URI mechanism for WordPress.org submission compatibility.<\/li>\n<li>Added conditional Role Permissions UI: the matrix is hidden unless role-based permissions are enabled.<\/li>\n<li>Hardened settings and post metadata sanitization.<\/li>\n<li>Kept the two-way global default and page-level three-state override model.<\/li>\n<li>Clarified browser deterrent limitations.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added configurable browser alert notification.<\/li>\n<li>Added optional DevTools, View Source, and PrintScreen deterrents.<\/li>\n<li>Improved Logged-in Users and Role Permissions layout.<\/li>\n<\/ul>\n\n<p>Development before version 1.3.0 included prototyping the core content-protection controls, the global default and per-content override model, and refining the settings interface. Exact version-by-version entries for that period are not available in the supplied source and are therefore not listed as releases.<\/p>","raw_excerpt":"Selective, lightweight browser-side content protection for WordPress pages, posts, public custom post types, and special frontend contexts.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/381199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=381199"}],"author":[{"embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/freezhao"}],"wp:attachment":[{"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=381199"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=381199"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=381199"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=381199"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=381199"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/sr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=381199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}