{"id":393435,"date":"2026-10-30T17:21:02","date_gmt":"2026-10-30T17:21:02","guid":{"rendered":"https:\/\/ja.wordpress.org\/plugins\/quiet-copy-notice\/"},"modified":"2026-10-30T17:20:31","modified_gmt":"2026-10-30T17:20:31","slug":"rapls-copy-notice","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/rapls-copy-notice\/","author":23425763,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.19","stable_tag":"1.3.19","tested":"7.1.4","requires":"6.3","requires_php":"8.2","requires_plugins":null,"header_name":"Rapls Copy Notice","header_author":"Rapls Works","header_description":"Detects when visitors copy text from your posts and tells you by email. Lightweight copy notification and copy tracking; the plugin itself calls no outside service, and email goes out through your site's mail setup.","assets_banners_color":"f2e1ca","last_updated":"2026-10-30 17:20:31","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/raplsworks.com\/plugins\/rapls-copy-notice\/","header_author_uri":"https:\/\/raplsworks.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":135,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.19":{"tag":"1.3.19","author":"rapls","date":"2026-10-30 17:20:31","revision":3775764}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3775764,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3775764,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3775764,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3775764,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.19"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3775764,"resolution":"1","location":"assets","locale":"","width":2066,"height":4708},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3775764,"resolution":"2","location":"assets","locale":"","width":1822,"height":2300},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3775764,"resolution":"3","location":"assets","locale":"","width":2066,"height":1766},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3775764,"resolution":"4","location":"assets","locale":"","width":2066,"height":3283},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3775764,"resolution":"5","location":"assets","locale":"","width":2066,"height":1284},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3775764,"resolution":"6","location":"assets","locale":"","width":1000,"height":500}},"screenshots":{"1":"The log under Tools \u2192 Rapls Copy Notice: date, post, copied text, shortened IP address and browser, with a filter by post.","2":"A summary email: plain text, with the copied text quoted, the post and its address, and the length of each copy.","3":"The Notifications tab: where emails go, the subject label, hourly summaries or one email per copy, and a test email button.","4":"The Detection tab: minimum length, post types, the content area, and who and what to ignore.","5":"The Visitors tab: an optional message after copying and an optional source line added to copied text, both off by default.","6":"The dashboard widget: copies in the last 7 days and the most copied posts."}},"plugin_section":[262246],"plugin_tags":[232,18193,2738,289813,1159],"plugin_category":[36],"plugin_contributors":[253146],"plugin_business_model":[],"class_list":["post-393435","plugin","type-plugin","status-publish","hentry","plugin_section-dashboard-widgets","plugin_tags-analytics","plugin_tags-content-protection","plugin_tags-copy","plugin_tags-copy-tracking","plugin_tags-notification","plugin_category-analytics","plugin_contributors-rapls","plugin_committers-rapls"],"banners":{"banner":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/banner-772x250.png?rev=3775764","banner_2x":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/banner-1544x500.png?rev=3775764","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/icon-128x128.png?rev=3775764","icon_2x":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/icon-256x256.png?rev=3775764","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/screenshot-1.png?rev=3775764","caption":"The log under Tools \u2192 Rapls Copy Notice: date, post, copied text, shortened IP address and browser, with a filter by post."},{"src":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/screenshot-2.png?rev=3775764","caption":"A summary email: plain text, with the copied text quoted, the post and its address, and the length of each copy."},{"src":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/screenshot-3.png?rev=3775764","caption":"The Notifications tab: where emails go, the subject label, hourly summaries or one email per copy, and a test email button."},{"src":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/screenshot-4.png?rev=3775764","caption":"The Detection tab: minimum length, post types, the content area, and who and what to ignore."},{"src":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/screenshot-5.png?rev=3775764","caption":"The Visitors tab: an optional message after copying and an optional source line added to copied text, both off by default."},{"src":"https:\/\/ps.w.org\/rapls-copy-notice\/assets\/screenshot-6.png?rev=3775764","caption":"The dashboard widget: copies in the last 7 days and the most copied posts."}],"raw_content":"<!--section=description-->\n<p>When a visitor selects text in one of your posts and copies it, Rapls Copy Notice\nrecords what was copied and from which post, and tells you by email.\nIt does not stop anyone from copying. Readers can still select, copy and\nright-click as usual; you simply find out which passages are being taken.<\/p>\n\n<ul>\n<li>A log under <strong>Tools \u2192 Rapls Copy Notice<\/strong>: date, post, copied text, shortened IP\naddress and browser. Filter by post, delete selected entries or everything.<\/li>\n<li>Email notifications, either one summary per hour (the default) or one email\nper copy with an hourly cap, after which copies roll into the summary.<\/li>\n<li>Only copies of at least 20 characters (adjustable), only from the post body,\nand only on the post types you choose. If your theme's markup is unusual, the\nplugin can mark the end of the post body itself so it is found in any theme.<\/li>\n<li>Copies by logged-in administrators and editors are ignored by default. You\ncan also ignore IP addresses (CIDR ranges allowed) and individual posts.<\/li>\n<li>Your own subject line, so the emails are easy to filter.<\/li>\n<li>A dashboard widget with the number of copies in the last 7 days and the three\nmost copied posts.<\/li>\n<li>Checks in <strong>Tools \u2192 Site Health<\/strong> for the log table, the scheduled tasks, the\nnotification address, notifications that keep failing, the monitored post\ntypes, proxy setup and database locks.<\/li>\n<li>Two optional features for readers, both off by default: a short message after\nthey copy (for example, asking them to link to the source), and the post title\nand URL appended to the copied text.<\/li>\n<li>Log entries are deleted automatically after 90 days (adjustable).<\/li>\n<li>Works with page caching: the detection script needs no per-visitor token.<\/li>\n<\/ul>\n\n<h4>Rapls Copy Notice Pro (optional add-on)<\/h4>\n\n<p>Everything described above is free, with no trial and no limits tied to an\nupgrade, and this plugin does not need anything else to work. Rapls Copy Notice\nPro is a separate plugin, sold on the author's website, for sites that want to\nact on copies:<\/p>\n\n<ul>\n<li>Statistics by post and by paragraph, compared with the previous period.<\/li>\n<li>Notifications to Slack, Chatwork, Discord or your own webhook, with a delivery history and retries, and a choice of which visitor data they receive.<\/li>\n<li>Rules that route each copy to the right channel, and burst alerts.<\/li>\n<li>Daily web search for your most copied paragraphs, with your own search API key.<\/li>\n<li>CSV export of the log.<\/li>\n<li>Multisite: the 5-site license covers a whole network, with an overview of every site.<\/li>\n<\/ul>\n\n<p>One-time purchase, no subscription. Details: https:\/\/raplsworks.com\/rapls-copy-notice-pro-en\/<\/p>\n\n<p>The plugin's screen has a <strong>Pro features<\/strong> tab describing the add-on, and short\nnotes about it on the Log and Notifications tabs and in its row on the Plugins\nscreen. All of them disappear once the add-on is active, and the\n    rapls_cn_show_upsell filter hides them (return <code>false<\/code>).<\/p>\n\n<h4>Paragraphs<\/h4>\n\n<p>Each copy also records a fingerprint of the paragraph it came from: a SHA-1 hash\nof that paragraph's text, worked out in the reader's browser. The paragraph\nitself is not stored. In the log, <strong>Copies of this paragraph<\/strong> lists every copy\ntaken from the same paragraph. Browsers only offer the hashing function on HTTPS\npages, so sites served over plain HTTP record copies without it.<\/p>\n\n<h4>For developers<\/h4>\n\n<ul>\n<li><code>rapls_cn_logged<\/code> (action) fires after a copy is stored, with the row ID and\nthe stored values.<\/li>\n<li><code>rapls_cn_notification_delivered<\/code> (filter) lets an add-on send each\nnotification to another channel; return <code>true<\/code> when it was delivered.<\/li>\n<li><code>rapls_cn_email_rows<\/code> (filter) lets an add-on choose which rows go into the\nnotification email; an empty array skips the email for that notification.<\/li>\n<li><code>rapls_cn_is_pro<\/code> (filter) is set to <code>true<\/code> by the Pro add-on;\n  rapls_cn_show_upsell and <code>rapls_cn_pro_url<\/code> control the Pro features tab.<\/li>\n<li><code>rapls_cn_privacy_policy_paragraphs<\/code> (filter) gets the suggested privacy\npolicy paragraphs, keyed <code>collected<\/code>, <code>ip<\/code>, <code>use<\/code> and <code>retention<\/code>, as plain text;\nan add-on that sends copy records out should replace <code>use<\/code>.<\/li>\n<li><code>rapls_cn_log_emptied<\/code> (action) fires after \"Delete all\" has removed every log\nentry. New entries are numbered from 1 again, so an add-on that keeps entry\nIDs should drop them here.<\/li>\n<li><code>rapls_cn_admin_tabs<\/code> (filter), <code>rapls_cn_admin_load<\/code> and\n  rapls_cn_render_tab_{key} (actions) let an add-on add tabs to the plugin's\nscreen.<\/li>\n<\/ul>\n\n<p>Values that came from a visitor's browser are passed to these hooks as stored.\nEscape them for wherever you output them.<\/p>\n\n<h4>How visitor data is handled<\/h4>\n\n<p>Everything a copy report contains comes from the visitor's browser, so the\nplugin treats all of it as untrusted.<\/p>\n\n<ul>\n<li><strong>Escaped wherever it is shown.<\/strong> The copied text, user agent, referrer and IP\naddress are escaped every time they are printed in the admin screens, for the\nexact place they appear (HTML text, attribute or URL). The plugin does not\nrely on cleaning values when they are saved.<\/li>\n<li><strong>Plain-text email only.<\/strong> Notifications are always sent as <code>text\/plain<\/code>. The\nsubject line contains your site name, the label you set (by default \"Copy\nnotification\") and a count, never anything a visitor sent or a post title. Copied text is quoted line by line in\nthe body so it cannot imitate other fields.<\/li>\n<li><strong>Rate limited.<\/strong> By default at most 10 reports per minute from one IP address\nand 500 per hour for the whole site are accepted. One address is also held to\na fifth of the site limit per hour (100 by default), so it cannot use up the\nsite limit alone, and IPv6 addresses are counted per \/64 block. Reports over a\nlimit are neither stored nor emailed. The counts stay exact when many reports\narrive at once as long as the database allows named locks (MySQL's GET_LOCK),\nwhich Site Health checks.<\/li>\n<li><strong>Checked against real posts.<\/strong> A report is accepted only for a published\npost of a monitored type. Copied text is capped at 500 characters and the\nuser agent and referrer host at 255.<\/li>\n<li><strong>Nothing echoed back.<\/strong> The endpoint answers with a status code and an empty\nbody.<\/li>\n<li><strong>IP addresses shortened by default.<\/strong> The last part of an IPv4 address and\nthe last 80 bits of an IPv6 address are removed before storage. Headers such\nas <code>X-Forwarded-For<\/code> are ignored unless you list your reverse proxy as trusted,\nand then only for requests that come from that proxy.<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>Rapls Copy Notice sets no cookies and stores nothing in the visitor's\nbrowser. To enforce the rate limits, the site keeps a one-way hash of each\nvisitor's IP address (of its \/64 block for IPv6) for up to an hour, in a\ncounter that then expires. The optional reader message and source link use\nonly the post's own title and URL and your text; they record nothing extra.\nThis plugin never contacts any external service: copy reports go only to your\nown site, and notifications are sent with WordPress's own mail function,\nthrough whatever mail system the site uses (an SMTP plugin or email service,\nfor example). Suggested wording for your privacy policy is added to\n<strong>Settings \u2192 Privacy<\/strong>.<\/p>\n\n<p>An add-on can send notifications elsewhere: Rapls Copy Notice Pro, for\nexample, sends them to the chat services or webhook you switch on. It then\nchanges the suggested privacy policy wording to name those services and what\nthey receive.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>That's it. With the default settings, copies of 20 or more characters from\nposts and pages are logged and summarized to the site administration email\nonce an hour.<\/li>\n<li>Optional: adjust the settings under <strong>Tools \u2192 Rapls Copy Notice<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20stop%20people%20from%20copying%20my%20content%3F\"><h3>Does this stop people from copying my content?<\/h3><\/dt>\n<dd><p>No, and it is not meant to. Blocking selection or right-click gets in the way of\nordinary readers and does not stop anyone determined. This plugin only tells you\nwhat is being copied.<\/p><\/dd>\n<dt id=\"nothing%20is%20being%20logged.%20what%20should%20i%20check%3F\"><h3>Nothing is being logged. What should I check?<\/h3><\/dt>\n<dd><p>Log out, or use a private window, since administrators and editors are ignored\nby default. Copy at least 20 characters from the body of a single post or page. If your\ntheme does not use <code>.entry-content<\/code>, <code>.post-content<\/code> or <code>article<\/code> around the\npost body, either enter the right CSS selector under <strong>Detection \u2192 Content\narea<\/strong>, or turn on <strong>Detection \u2192 Find the post body<\/strong>. That option is off by\ndefault because it adds one empty, hidden element after the post content.\nCopies from form fields (a comment box, a contact form) are never recorded:\nthat text is usually the reader's own.<\/p><\/dd>\n<dt id=\"how%20do%20i%20check%20that%20notification%20emails%20arrive%3F\"><h3>How do I check that notification emails arrive?<\/h3><\/dt>\n<dd><p>Use <strong>Send a test email<\/strong> on the Notifications tab. It sends a short fixed\nmessage to the notification address. If it does not arrive, check the spam\nfolder and the site's email settings; many hosts need an SMTP plugin.<\/p><\/dd>\n<dt id=\"why%20did%20the%20hourly%20summary%20arrive%20late%3F\"><h3>Why did the hourly summary arrive late?<\/h3><\/dt>\n<dd><p>Summaries are sent by WP-Cron, which runs when someone visits the site. On a\nsite with little traffic, the email goes out with the first visit after it is due.<\/p><\/dd>\n<dt id=\"can%20i%20count%20copies%20in%20google%20analytics%20or%20another%20tool%3F\"><h3>Can I count copies in Google Analytics or another tool?<\/h3><\/dt>\n<dd><p>The plugin does not send anything to analytics services itself. It does fire a\n    rapls-cn:copy event on the page each time it reports a copy to your site, with\nthe post ID and the length of the selection, which your own script can forward.\nThe event fires in the browser, before the site applies its rate limits and\nignored IP addresses, so the count can be a little higher than the log's:<\/p>\n\n<pre><code>document.addEventListener( 'rapls-cn:copy', function ( e ) { \/* e.detail.postId, e.detail.length *\/ } );\n<\/code><\/pre><\/dd>\n<dt id=\"my%20site%20is%20behind%20cloudflare%20or%20another%20proxy%20and%20every%20ip%20looks%20the%20same.\"><h3>My site is behind Cloudflare or another proxy and every IP looks the same.<\/h3><\/dt>\n<dd><p>Add the proxy's IP addresses or ranges under <strong>Detection \u2192 Trusted proxies<\/strong>.\nThe visitor's address is then taken from <code>X-Forwarded-For<\/code>, but only on requests\nthat really come from those proxies.<\/p><\/dd>\n<dt id=\"i%20used%20check%20copy%20contents.%20can%20i%20switch%20to%20this%20plugin%3F\"><h3>I used Check Copy Contents. Can I switch to this plugin?<\/h3><\/dt>\n<dd><p>Yes. Rapls Copy Notice covers the same need, logging copied text and emailing\nyou about it, and it is a separate plugin written from scratch. If that plugin's\nsettings are still in your database when you first activate this one, the\nnotification address, minimum length and a custom subject are carried over.\nDeactivate the old plugin afterwards, or you will get two emails per copy.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.19<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Copy notification and copy tracking for posts: logs what visitors copy and emails you a plain-text summary. Calls no outside service itself.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/393435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=393435"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rapls"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=393435"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=393435"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=393435"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=393435"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=393435"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=393435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}