{"id":300487,"date":"2026-06-08T07:08:47","date_gmt":"2026-06-08T07:08:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/photoproof\/"},"modified":"2026-06-08T08:30:21","modified_gmt":"2026-06-08T08:30:21","slug":"photoproof","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/photoproof\/","author":23481087,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"PhotoProof","header_author":"C\u00e9dric Stoecklin","header_description":"Galerie d'\u00e9preuve pour photographe avec gestion de watermark et dossiers s\u00e9curis\u00e9s.","assets_banners_color":"121f1c","last_updated":"2026-06-08 08:30:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":81,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"stoeck","date":"2026-06-08 08:30:21"}},"upgrade_notice":{"1.0.0":"<p>First stable release. If upgrading from a previous beta, deactivate and reactivate the plugin to register the expiration cron job and refresh the rewrite rules.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3564287,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3564287,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3564287,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3564287,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3564287,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3564287,"resolution":"1","location":"assets","locale":"","width":1429,"height":893},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3564287,"resolution":"2","location":"assets","locale":"","width":1944,"height":1215},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3564287,"resolution":"3","location":"assets","locale":"","width":1898,"height":1186}},"screenshots":{"1":"Client gallery view \u2014 clean, standalone page with photo grid and selection bar","2":"Gallery editor \u2014 metabox with status, upload zone, client assignment and selection recap","3":"Settings page \u2014 general options, renaming patterns, recommendation icons"}},"plugin_section":[],"plugin_tags":[466,210,2248,23351,3241],"plugin_category":[50],"plugin_contributors":[266140],"plugin_business_model":[],"class_list":["post-300487","plugin","type-plugin","status-publish","hentry","plugin_tags-client","plugin_tags-gallery","plugin_tags-photography","plugin_tags-proofing","plugin_tags-watermark","plugin_category-media","plugin_contributors-stoeck","plugin_committers-stoeck"],"banners":{"banner":"https:\/\/ps.w.org\/photoproof\/assets\/banner-772x250.jpg?rev=3564287","banner_2x":"https:\/\/ps.w.org\/photoproof\/assets\/banner-1544x500.jpg?rev=3564287","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/photoproof\/assets\/icon.svg?rev=3564287","icon":"https:\/\/ps.w.org\/photoproof\/assets\/icon.svg?rev=3564287","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/photoproof\/assets\/screenshot-1.jpg?rev=3564287","caption":"Client gallery view \u2014 clean, standalone page with photo grid and selection bar"},{"src":"https:\/\/ps.w.org\/photoproof\/assets\/screenshot-2.jpg?rev=3564287","caption":"Gallery editor \u2014 metabox with status, upload zone, client assignment and selection recap"},{"src":"https:\/\/ps.w.org\/photoproof\/assets\/screenshot-3.jpg?rev=3564287","caption":"Settings page \u2014 general options, renaming patterns, recommendation icons"}],"raw_content":"<!--section=description-->\n<p>PhotoProof turns WordPress into a proofing platform for photographers. Create galleries, share them with your clients, and let them pick their favorite shots \u2014 no account needed for browsing, login required only for validation.<\/p>\n\n<p><strong>Key features:<\/strong><\/p>\n\n<ul>\n<li><strong>Standalone gallery template<\/strong> \u2014 a clean, distraction-free gallery page, fully isolated from your theme<\/li>\n<li><strong>Client selection workflow<\/strong> \u2014 clients click to select photos, auto-saved in real-time, then confirm with a single button<\/li>\n<li><strong>Watermark protection<\/strong> \u2014 overlay your logo on gallery images (GD or Imagick), with adjustable opacity. Configured globally, applied per-gallery via a simple toggle.<\/li>\n<li><strong>Automatic file renaming<\/strong> \u2014 organize your deliverables with a configurable naming pattern. Optional per-gallery custom name to override the default.<\/li>\n<li><strong>Private UUID links<\/strong> \u2014 optionally replace gallery slugs with impossible-to-guess UUIDs for extra privacy<\/li>\n<li><strong>Access expiration<\/strong> \u2014 auto-archive galleries after 30 days to keep your workspace clean<\/li>\n<li><strong>Email notifications<\/strong> \u2014 photographer and client both receive confirmation emails when a selection is validated, with customizable templates<\/li>\n<li><strong>Photographer recommendations<\/strong> \u2014 mark your favorite shots to guide the client's selection<\/li>\n<li><strong>CSV export<\/strong> \u2014 export the validated selection as a spreadsheet<\/li>\n<li><strong>Client dashboard shortcode<\/strong> \u2014 <code>[photoproof_galleries_client]<\/code> displays all galleries assigned to the logged-in client<\/li>\n<li><strong>Multilingual<\/strong> \u2014 fully translatable, ships with French (partial AI translations for German, Spanish and Italian)<\/li>\n<li><strong>Customizable design<\/strong> \u2014 choose background, accent and text colors, upload your logo, toggle rounded corners<\/li>\n<\/ul>\n\n<p>PhotoProof stores all gallery photos in a dedicated folder (<code>\/uploads\/photoproof\/<\/code>), separate from the standard Media Library.<\/p>\n\n<p><strong>Built for photographers, by a photographer.<\/strong> PhotoProof is built and maintained by C\u00e9dric Stoecklin, a photographer who needed a proofing tool that wouldn't lock him into a SaaS or share his clients' photos with third parties. Free, open source, and built to last. More details and a full walkthrough on <a href=\"https:\/\/photoproof.cedricstoecklin.com\/\">photoproof.cedricstoecklin.com<\/a>.<\/p>\n\n<h3>For developers<\/h3>\n\n<p>PhotoProof is built to be extended. It exposes action hooks, filter hooks, helper functions and a shortcode \u2014 everything you need to wire it into your own workflow or build a plugin on top.<\/p>\n\n<p><strong>Action hooks<\/strong> include <code>photoproof_gallery_selection_confirmed<\/code> (fired when a client validates), <code>photoproof_attachment_uploaded<\/code> (fired after a photo is processed) and <code>photoproof_daily_expiration_check<\/code> (cron hook for daily maintenance).<\/p>\n\n<p><strong>Template tags<\/strong> include <code>photoproof_get_client_galleries()<\/code>, <code>photoproof_get_gallery_status()<\/code>, <code>photoproof_get_gallery_selection()<\/code> and more \u2014 callable from any theme template.<\/p>\n\n<p><strong>Shortcode<\/strong> <code>[photoproof_galleries_client]<\/code> displays a grid of galleries assigned to the currently logged-in user, with configurable columns and display options.<\/p>\n\n<p>Full developer documentation with code examples is available at <a href=\"https:\/\/photoproof.cedricstoecklin.com\/#developer\">photoproof.cedricstoecklin.com#developer<\/a>.<\/p>\n\n<h3>External services<\/h3>\n\n<p>PhotoProof does not connect to any external service. All gallery photos, client data, watermarks, email templates and CSV exports are stored and processed entirely on your own WordPress installation. No data is sent to third-party servers, no tracking, no analytics, no API calls. Your photographs and your clients' selections never leave your hosting.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>PhotoProof stores the following data:<\/p>\n\n<ul>\n<li><strong>Gallery metadata<\/strong> (title, status, client assignment) in WordPress' standard <code>wp_posts<\/code> and <code>wp_postmeta<\/code> tables<\/li>\n<li><strong>Gallery-specific metadata<\/strong> (UUID, watermark state, expiration date) in a custom table <code>wp_photoproof_galleries<\/code><\/li>\n<li><strong>Uploaded photos<\/strong> in <code>\/uploads\/photoproof\/<\/code> (separate from the main Media Library), with optional watermarked copies in <code>\/watermarked\/<\/code><\/li>\n<li><strong>Client selections<\/strong> as post meta on the gallery<\/li>\n<li><strong>Photographer recommendations<\/strong> as post meta on each attachment<\/li>\n<li><strong>Plugin settings<\/strong> (colors, watermark, email templates) as standard WordPress options<\/li>\n<\/ul>\n\n<p>No data is collected, transmitted or shared with third parties. The plugin uses no cookies beyond WordPress' standard session handling for authenticated users.<\/p>\n\n<p>Uninstalling the plugin (not deactivating) permanently removes all of the above. Deactivation preserves all data.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>photoproof<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Go to <strong>Galleries \u2192 Settings<\/strong> to configure watermark, renaming, colors and email templates.<\/li>\n<li>Create your first gallery under <strong>Galleries \u2192 Add New<\/strong>.<\/li>\n<li>Upload photos, assign a client, and publish.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20my%20clients%20need%20a%20wordpress%20account%3F\"><h3>Do my clients need a WordPress account?<\/h3><\/dt>\n<dd><p>Browsing the gallery works without any account. A WordPress account (subscriber role is enough) is only required when the client wants to validate their final selection.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20own%20login%20page%3F\"><h3>Can I use my own login page?<\/h3><\/dt>\n<dd><p>Yes. In <strong>Settings \u2192 Security &amp; Watermark<\/strong>, you can set a custom login URL. If left empty, WordPress uses its default login page.<\/p><\/dd>\n<dt id=\"how%20does%20the%20watermark%20work%3F\"><h3>How does the watermark work?<\/h3><\/dt>\n<dd><p>In <strong>Settings<\/strong>, upload a PNG logo and set the desired opacity. This makes the watermark <em>available<\/em>. Then, on each gallery, a \"Watermark protection\" toggle lets you decide whether to apply it or not. When enabled, PhotoProof generates watermarked copies in a <code>\/watermarked\/<\/code> subfolder; the originals are never modified. Clients see the watermarked version, you keep the originals safe.<\/p>\n\n<p>The toggle can be changed at any time \u2014 even after publication. The frontend always reflects the current setting.<\/p><\/dd>\n<dt id=\"how%20does%20the%20file%20renaming%20work%3F\"><h3>How does the file renaming work?<\/h3><\/dt>\n<dd><p>In <strong>Settings<\/strong>, enable automatic renaming and set your global pattern (for example: <code>MyStudio-{gallery_title}<\/code>). Once enabled, every gallery's files are automatically renamed using the pattern, with a counter (<code>-0001<\/code>, <code>-0002<\/code>...) appended to each file.<\/p>\n\n<p>On a per-gallery basis, you can fill in a \"Custom file name\" field in the metabox. When set, this name replaces the global pattern entirely (useful if the gallery title doesn't make a good file name \u2014 too long, special characters, internal codes...).<\/p><\/dd>\n<dt id=\"can%20i%20reopen%20a%20validated%20gallery%3F\"><h3>Can I reopen a validated gallery?<\/h3><\/dt>\n<dd><p>Yes. From the gallery editor, you can reopen a validated gallery \u2014 either keeping the previous client selection or resetting it entirely.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20gallery%20expires%3F\"><h3>What happens when a gallery expires?<\/h3><\/dt>\n<dd><p>If auto-archiving is enabled, galleries are automatically set to \"archived\" status 30 days after publication. The client sees a friendly message asking them to contact their photographer. Admins can always view and reactivate archived galleries.<\/p><\/dd>\n<dt id=\"does%20photoproof%20work%20with%20page%20builders%3F\"><h3>Does PhotoProof work with page builders?<\/h3><\/dt>\n<dd><p>The gallery uses its own standalone template, completely independent from your theme. This avoids conflicts with page builders, animation libraries (Barba.js, GSAP...), or any JavaScript framework your theme may use.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20uninstall%20the%20plugin%3F\"><h3>What happens when I uninstall the plugin?<\/h3><\/dt>\n<dd><p>WordPress asks \"Are you sure you want to delete this plugin and all of its data?\" \u2014 PhotoProof respects that promise. Uninstalling the plugin permanently removes:<\/p>\n\n<ul>\n<li>All galleries (custom post type)<\/li>\n<li>All photos uploaded through PhotoProof (originals + watermarked copies)<\/li>\n<li>The <code>\/uploads\/photoproof\/<\/code> folder and its contents<\/li>\n<li>All plugin settings, options and the custom database table<\/li>\n<li>Scheduled cron jobs<\/li>\n<\/ul>\n\n<p>If you want to keep your data, <strong>deactivate<\/strong> the plugin instead of deleting it. Deactivation preserves everything.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First stable release<\/li>\n<li>Watermark and file renaming logic redesigned: settings provide the tools, gallery metabox decides whether to use them. Both can be toggled at any time, even after publication \u2014 the frontend reflects the current state immediately.<\/li>\n<li>Custom file name field in the gallery metabox (overrides the global pattern when needed)<\/li>\n<li>Live preview of the resulting file name in the metabox<\/li>\n<li>Complete uninstall: deleting the plugin now removes all galleries, photos, settings and database tables \u2014 as WordPress promises in its confirmation dialog<\/li>\n<li>UUID private links: fixed edge case on subdirectory installs where the slug could collide with the WP path<\/li>\n<li>Auto-expiration cron is properly scheduled on activation<\/li>\n<li>Multilingual: full translations for French, partial for German, Spanish, Italian<\/li>\n<li>Code quality: full WordPress.org plugin guidelines compliance, all identifiers properly prefixed<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Animated selection tray<\/li>\n<li>Recap panel with expand animation<\/li>\n<li>Full i18n support<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Self-hosted gallery proofing for photographers. Share galleries with your clients and recover their selection by email or CSV.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/300487","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=300487"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/stoeck"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=300487"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=300487"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=300487"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=300487"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=300487"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=300487"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}