{"id":316574,"date":"2026-06-01T08:47:46","date_gmt":"2026-06-01T08:47:46","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ghost-link\/"},"modified":"2026-06-01T08:47:23","modified_gmt":"2026-06-01T08:47:23","slug":"erdo-draft-links","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/erdo-draft-links\/","author":23436214,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Erdo Draft Links","header_author":"Erdinc Bulat","header_description":"Share draft posts with non-logged-in users via a secure, temporary link \u2014 no login required.","assets_banners_color":"ffffff","last_updated":"2026-06-01 08:47:23","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/erdo-draft-links\/","header_author_uri":"https:\/\/erdincbulat.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":40,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"erdincbulat","date":"2026-06-01 08:47:23"}},"upgrade_notice":{"1.0.1":"<p>Minor code quality fix; no functional changes.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3556422,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3556422,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3556422,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3556422,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Erdo Draft Links panel in the Block Editor sidebar \u2014 generate, copy, and manage your link.","2":"Erdo Draft Links meta box in the Classic Editor \u2014 same functionality, same REST API.","3":"Draft post viewed via Erdo Draft Links by a non-logged-in visitor."}},"plugin_section":[],"plugin_tags":[4665,537,2475,870,138],"plugin_category":[56,58],"plugin_contributors":[253916],"plugin_business_model":[],"class_list":["post-316574","plugin","type-plugin","status-publish","hentry","plugin_tags-draft","plugin_tags-link","plugin_tags-preview","plugin_tags-private","plugin_tags-share","plugin_category-social-and-sharing","plugin_category-user-management","plugin_contributors-erdincbulat","plugin_committers-erdincbulat"],"banners":{"banner":"https:\/\/ps.w.org\/erdo-draft-links\/assets\/banner-772x250.png?rev=3556422","banner_2x":"https:\/\/ps.w.org\/erdo-draft-links\/assets\/banner-1544x500.png?rev=3556422","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/erdo-draft-links\/assets\/icon-128x128.png?rev=3556422","icon_2x":"https:\/\/ps.w.org\/erdo-draft-links\/assets\/icon-256x256.png?rev=3556422","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Erdo Draft Links<\/strong> lets you generate a secure, token-based URL for any draft, private, or published post or page. Share it with clients, reviewers, or collaborators \u2014 they can read the content without needing a WordPress account.<\/p>\n\n<p>Think of it like Google Docs' \"Anyone with the link can view\" \u2014 but for WordPress.<\/p>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Open any post or page in the editor (Block Editor or Classic Editor).<\/li>\n<li>Click <strong>\"Generate Draft Link\"<\/strong> in the sidebar panel or meta box.<\/li>\n<li>Choose an expiry: 24 hours, 48 hours, 7 days, or never.<\/li>\n<li>Share the link. Recipients can view the content \u2014 no login needed.<\/li>\n<\/ol>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Works with both the <strong>Block Editor (Gutenberg)<\/strong> and the <strong>Classic Editor<\/strong><\/li>\n<li>Supports <strong>posts<\/strong>, <strong>pages<\/strong>, and any custom post type via a filter<\/li>\n<li>Secure <strong>32-character cryptographic tokens<\/strong> \u2014 brute-force resistant<\/li>\n<li>Configurable expiry: 24 hours, 48 hours, 7 days, or no expiry<\/li>\n<li><strong>View count<\/strong> tracking per link<\/li>\n<li><strong>Revoke or regenerate<\/strong> any link at any time<\/li>\n<li>Tokens are stored <strong>hashed<\/strong> in the database \u2014 raw tokens are never stored after the redirect<\/li>\n<li>Two-step flow: token URL \u2192 cookie \u2192 clean permalink (token never appears in browser history)<\/li>\n<li>No external API calls, no phone-home, no subscriptions<\/li>\n<li>Translation-ready (English default, Turkish included)<\/li>\n<\/ul>\n\n<h4>Developer Notes<\/h4>\n\n<p>Developers can add support for custom post types using the <code>erdo_draft_links_supported_post_types<\/code> filter:<\/p>\n\n<pre><code>add_filter( 'erdo_draft_links_supported_post_types', function( $types ) {\n    $types[] = 'product';\n    return $types;\n} );\n<\/code><\/pre>\n\n<h4>Source Code<\/h4>\n\n<p>The full source code including build tools is included in the plugin's <code>assets\/js\/src\/<\/code> directory.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>erdo-draft-links<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Open any post or page and find the <strong>Erdo Draft Links<\/strong> panel in the editor sidebar or meta box.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20custom%20post%20types%3F\"><h3>Does this work with custom post types?<\/h3><\/dt>\n<dd><p>Yes. By default Erdo Draft Links supports posts and pages. Add more post types using the <code>erdo_draft_links_supported_post_types<\/code> filter.<\/p><\/dd>\n<dt id=\"is%20the%20shared%20link%20secure%3F\"><h3>Is the shared link secure?<\/h3><\/dt>\n<dd><p>Yes. Tokens are 32 characters of cryptographic randomness generated by WordPress's built-in <code>wp_generate_password<\/code>. The raw token appears in the URL only once \u2014 subsequent visits use a signed HttpOnly cookie. Tokens are stored as SHA-256 HMAC hashes in the database.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20link%20expires%3F\"><h3>What happens when a link expires?<\/h3><\/dt>\n<dd><p>The recipient sees a clear message: \"This draft link has expired and is no longer accessible.\" The post remains a draft \u2014 nothing is published.<\/p><\/dd>\n<dt id=\"can%20i%20have%20multiple%20active%20links%20for%20the%20same%20post%3F\"><h3>Can I have multiple active links for the same post?<\/h3><\/dt>\n<dd><p>Currently one active link per post. Regenerating creates a new token and resets the view count.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20password-protected%20posts%3F\"><h3>Does this work with password-protected posts?<\/h3><\/dt>\n<dd><p>No. Erdo Draft Links is designed for draft and private posts. Password-protected posts use WordPress's own mechanism.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20affect%20site%20performance%3F\"><h3>Does this plugin affect site performance?<\/h3><\/dt>\n<dd><p>Erdo Draft Links only runs on requests that include a <code>?erdo_token=<\/code> parameter or a valid session cookie. Normal site traffic is not affected.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: Replace deprecated <code>current_time('timestamp')<\/code> with <code>time()<\/code> for correct UTC handling.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Share draft posts with anyone via a secure, temporary link \u2014 no WordPress login required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/316574","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=316574"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/erdincbulat"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=316574"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=316574"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=316574"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=316574"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=316574"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=316574"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}