{"id":344767,"date":"2026-07-30T20:20:18","date_gmt":"2026-07-30T20:20:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/heartapproval\/"},"modified":"2026-07-30T20:28:22","modified_gmt":"2026-07-30T20:28:22","slug":"heartapproval","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/heartapproval\/","author":23434246,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.4.1","stable_tag":"1.4.1","tested":"7.0.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"HeartApproval","header_author":"Evgenij Gross","header_description":"Client photo proofing and image selection galleries for WordPress.","assets_banners_color":"","last_updated":"2026-07-30 20:28:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/gross-macht.de\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":132,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","changelog"],"tags":{"1.4.1":{"tag":"1.4.1","author":"genij91","date":"2026-07-30 20:28:22"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.4.1"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3629093,"resolution":"1","location":"assets","locale":"","width":1440,"height":980},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3629093,"resolution":"2","location":"assets","locale":"","width":1440,"height":980},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3629093,"resolution":"3","location":"assets","locale":"","width":1440,"height":980},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3629093,"resolution":"4","location":"assets","locale":"","width":1125,"height":1100}},"screenshots":{"1":"Responsive client gallery with favorite selection and final approval.","2":"Full-screen image review with navigation, zoom, and favorite controls.","3":"Per-image comments for clear client feedback and retouching requests.","4":"WordPress gallery editor with client access settings and image management."}},"plugin_section":[],"plugin_tags":[262500,210,273899,48831],"plugin_category":[50],"plugin_contributors":[273900],"plugin_business_model":[],"class_list":["post-344767","plugin","type-plugin","status-publish","hentry","plugin_tags-client-gallery","plugin_tags-gallery","plugin_tags-image-selection","plugin_tags-photo-proofing","plugin_category-media","plugin_contributors-genij91","plugin_committers-genij91"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/heartapproval.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/heartapproval\/assets\/screenshot-1.jpg?rev=3629093","caption":"Responsive client gallery with favorite selection and final approval."},{"src":"https:\/\/ps.w.org\/heartapproval\/assets\/screenshot-2.jpg?rev=3629093","caption":"Full-screen image review with navigation, zoom, and favorite controls."},{"src":"https:\/\/ps.w.org\/heartapproval\/assets\/screenshot-3.jpg?rev=3629093","caption":"Per-image comments for clear client feedback and retouching requests."},{"src":"https:\/\/ps.w.org\/heartapproval\/assets\/screenshot-4.jpg?rev=3629093","caption":"WordPress gallery editor with client access settings and image management."}],"raw_content":"<!--section=description-->\n<p>HeartApproval adds a complete client photo proofing workflow to WordPress. Create a gallery, upload your images, and send your client a private access link. Clients can review the gallery on desktop or mobile, mark their favorite images, and leave precise comments directly on individual photos.<\/p>\n\n<p>When the selection is complete, the client can finalize the gallery to prevent further changes. You can then export the selected images as a ZIP archive or download the selection data as CSV.<\/p>\n\n<h4>A simple workflow for photographers and clients<\/h4>\n\n<ol>\n<li>Create and configure a client gallery in the WordPress admin area.<\/li>\n<li>Upload images from the Media Library or your computer.<\/li>\n<li>Share the gallery using its private, token-protected link.<\/li>\n<li>Let the client select favorites and add per-image feedback.<\/li>\n<li>Finalize the approved selection and export the results.<\/li>\n<\/ol>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li>WordPress-native gallery management.<\/li>\n<li>Private gallery links protected by individual access tokens.<\/li>\n<li>Responsive client galleries with configurable grid or masonry layouts.<\/li>\n<li>Full-screen PhotoSwipe lightbox with navigation, zoom, and touch gestures.<\/li>\n<li>Favorite selection directly in the gallery and lightbox.<\/li>\n<li>Comments attached to individual images.<\/li>\n<li>Final approval that locks the completed selection.<\/li>\n<li>ZIP export of selected images and CSV export of selection data.<\/li>\n<li>Configurable gallery layout, spacing, thumbnail quality, and finalization texts.<\/li>\n<li>Locally bundled lightbox assets with no external CDN dependency.<\/li>\n<\/ul>\n\n<p>HeartApproval is designed for photographers, designers, agencies, and other visual professionals who need a focused approval process without sending clients to a separate proofing platform.<\/p>\n\n<!--section=changelog-->\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Fix: Selected hearts in the PhotoSwipe lightbox are shown in red.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Fix: Harden REST argument validation\/sanitization.<\/li>\n<li>Fix: Replace legacy finalize option keys with hearli_ prefixed keys (with migration).<\/li>\n<li>Fix: Remove inline admin styles in favor of admin stylesheet classes.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fix: WP.org compliance updates (prefixing, REST token permission checks, REST namespace update).<\/li>\n<li>Fix: i18n cleanup (removed load_plugin_textdomain, no manual language switch).<\/li>\n<li>Change: Remove plugin directory icons from plugin ZIP; update .distignore exclusions.<\/li>\n<li>Change: PhotoSwipe vendor files updated to stable release + MIT license notices.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Fix: WP.org compliance updates (plugin naming\/slug and cleanup).<\/li>\n<li>Fix: PhotoSwipe\/Lightbox scripts loaded correctly (no console module errors).<\/li>\n<li>Fix: Persist selection and comments across reload.<\/li>\n<li>Fix: i18n \u2013 follow WordPress system language; removed manual language switch; English default with German translations.<\/li>\n<li>Security: Hardened escaping and nonce checks in admin\/front-end.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Feature: Kommentar-Funktion pro Bild in der Proofing-Galerie eingef\u00fchrt.<\/li>\n<li>Fix: Stabilisierung der PhotoSwipe-Lightbox (kein JS-Abbruch mehr bei fehlenden UI-Elementen).<\/li>\n<li>Fix: Auswahl-Status (Herz\/Favorit) bleibt nach Seiten-Reload erhalten.<\/li>\n<li>Improvement: Initiale State-Synchronisation aus dem DOM reduziert UI-Flackern beim Laden.<\/li>\n<li>Improvement: Robustere Verarbeitung von REST-Statusdaten (selected\/comment) ohne unbeabsichtigtes Zur\u00fccksetzen.<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Improvement: Plugin-Icon f\u00fcr die WordPress-Pluginliste erg\u00e4nzt (assets\/icon-128x128.png, assets\/icon-256x256.png).<\/li>\n<li>Improvement: WordPress-Kompatibilit\u00e4ts-Metadaten (Tested up to \/ Requires \/ Requires PHP) f\u00fcr Update-Anzeige erg\u00e4nzt.<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Change: Plugin-Beschreibung aktualisiert (sichtbar in der WordPress-Pluginliste).<\/li>\n<li>Change: Dokumentations-Link erg\u00e4nzt (https:\/\/gross-macht.de\/heartapproval-dokumentation\/).<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Change: Third-Party-Nachweise f\u00fcr geb\u00fcndelte PhotoSwipe-Assets erg\u00e4nzt.<\/li>\n<li>Improvement: Lizenz-\/Notice-Dateien werden im Plugin-Paket mitgeliefert (THIRD-PARTY-NOTICES, PhotoSwipe LICENSE).<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Fix: Touch-Swipe-Navigation in der Lightbox (Mobile) funktioniert wieder zuverl\u00e4ssig.<\/li>\n<li>Fix: Lightbox \u00fcberdeckt auf mobilen Ger\u00e4ten den kompletten Bildschirm; Hintergrund\/Seite darunter ist nicht mehr sichtbar bzw. scrollbar.<\/li>\n<li>Fix: Mobile UI-Positionierung\/Visibility der Lightbox-Steuerelemente (Safe-Area\/Z-Index\/Overlay).<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix: Lightbox-UI verbessert: Dateiname\/Caption wird unten mittig unter dem Bild angezeigt.<\/li>\n<li>Feature: Lightbox zeigt oben links einen Bildz\u00e4hler (z. B. \"1 von 20\").<\/li>\n<li>Fix: Navigation in der Lightbox: \"Zur\u00fcck\" wird beim ersten Bild ausgeblendet, \"Weiter\" beim letzten Bild (bei deaktiviertem Loop).<\/li>\n<li>Fix: Auswahl-Heart in der Lightbox synchronisiert den Status beim ersten \u00d6ffnen korrekt (kein Wei\u00df-Zustand trotz Auswahl).<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Fix: Entfernt externe CDN-Abh\u00e4ngigkeit (cdnjs.cloudflare.com) f\u00fcr die Lightbox. Assets werden lokal aus dem Plugin geladen.<\/li>\n<li>Change: Lightbox von Fancybox auf PhotoSwipe umgestellt (geb\u00fcndelte lokale Ressourcen).<\/li>\n<li>Fix: Auswahl-Heart in der Lightbox aktualisiert sofort nach Klick (kein Bildwechsel mehr n\u00f6tig).<\/li>\n<li>Improvement: UI\/Styles gegen Theme-Overrides geh\u00e4rtet (CSS-Variable f\u00fcr Heart-Aktivfarbe).<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fix\/Change: Fancybox wird standardm\u00e4\u00dfig lokal aus dem Plugin geladen (keine CDN-Requests zu cdnjs.cloudflare.com mehr).<\/li>\n<li>Feature: Option unter \u201eEinstellungen \u2192 Diagnose &amp; Info\u201c hinzugef\u00fcgt, um Fancybox auf Wunsch explizit wieder \u00fcber CDN zu laden (Default: AUS = lokal).<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Change: Nicht ben\u00f6tigten Lizenz-\/Plan-Block aus den Einstellungen entfernt.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: Abschlussgalerie-Upload zeigt den Fortschritt korrekt mit nur einem Prozentzeichen (z. B. \"100%\" statt \"100%%\").<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: Heart-Icon (Bildauswahl) im Grid wird auch bei Theme-Button-Styles zuverl\u00e4ssig angezeigt (Padding\/Line-Height\/Font-Size Reset + SVG-Fill abgesichert).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Private client photo proofing galleries with favorites, per-image comments, final approval, and ZIP\/CSV exports.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/344767","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=344767"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/genij91"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=344767"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=344767"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=344767"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=344767"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=344767"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=344767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}