{"id":259519,"date":"2025-12-09T19:55:58","date_gmt":"2025-12-09T19:55:58","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/photo-competition-manager\/"},"modified":"2026-02-20T11:13:52","modified_gmt":"2026-02-20T11:13:52","slug":"photo-competition-manager","status":"publish","type":"plugin","link":"https:\/\/bal.wordpress.org\/plugins\/photo-competition-manager\/","author":263,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"0.3.0","stable_tag":"0.3.0","tested":"6.9.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Photo Competition Manager","header_author":"Donncha O Caoimh","header_description":"Manage photography competitions, submissions, and voting.","assets_banners_color":"","last_updated":"2026-02-20 11:13:52","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":0,"downloads":323,"num_ratings":1,"support_threads":1,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"donncha","date":"2025-12-09 19:58:19"},"0.2.0":{"tag":"0.2.0","author":"donncha","date":"2026-01-24 15:15:32"},"0.3.0":{"tag":"0.3.0","author":"donncha","date":"2026-02-20 11:13:52"}},"upgrade_notice":{"0.3.0":"<p>Fixes a fatal error on plugin activation. Share competition results with committee members or all members via a secret link before making results public.<\/p>","0.2.0":"<p>Redesigned voting controls, improved tie handling in scoring, better export formatting, and various bug fixes. All times are now normalized to UTC.<\/p>","0.1.0":"<p>First public release. After activation, visit <strong>Competitions \u2192 Setup Wizard<\/strong> to create pages and <strong>Competitions \u2192 Settings<\/strong> to configure defaults before launching your first competition.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0","0.2.0","0.3.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Competition dashboard with status tracking, settings tabs, and quick actions","2":"Member management interface with bulk CSV import and grade assignments","3":"Voting controls for opening\/closing categories and managing tokens","4":"Setup wizard for one-click page creation with pre-configured shortcodes","5":"Email template editor with merge tags and preview functionality","6":"Responsive top-3 podium display showcasing winners with scores","7":"Full results table with category filtering and member information","8":"Mobile-optimized voting interface with image gallery","9":"Submission tracking showing upload status and quota enforcement","10":"Export screen for downloading competition data and statistics"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[175716,162841,2248,357,11300],"plugin_category":[43,50,53],"plugin_contributors":[77609],"plugin_business_model":[],"class_list":["post-259519","plugin","type-plugin","status-publish","hentry","plugin_tags-competitions","plugin_tags-member-management","plugin_tags-photography","plugin_tags-shortcodes","plugin_tags-voting","plugin_category-customization","plugin_category-media","plugin_category-ratings-and-reviews","plugin_contributors-donncha","plugin_committers-donncha"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/photo-competition-manager.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Photo Competition Manager provides everything photography clubs need to run professional competitions online:<\/p>\n\n<p><strong>Core Features<\/strong><\/p>\n\n<ul>\n<li><strong>Member Management<\/strong> \u2013 Maintain active rosters, assign grades, track member status, and bulk import\/update via CSV<\/li>\n<li><strong>Competition Setup<\/strong> \u2013 Create competitions with custom categories, grade divisions, submission quotas, and scoring matrices<\/li>\n<li><strong>Secure Submissions<\/strong> \u2013 Members upload via magic-link authentication with automatic file validation, resizing, and quota enforcement<\/li>\n<li><strong>Flexible Voting<\/strong> \u2013 Token-based member voting, password-protected public voting, and full-screen slideshow mode for in-person club nights<\/li>\n<li><strong>Results Display<\/strong> \u2013 Full results tables with filtering, responsive top-3 podium displays, and customizable member name visibility<\/li>\n<li><strong>Email Notifications<\/strong> \u2013 Automated emails for upload confirmations, voting invitations, results announcements, and custom templates with merge tags<\/li>\n<li><strong>Setup Wizard<\/strong> \u2013 One-click page creation for upload, voting, results, and top-3 displays with pre-configured shortcodes<\/li>\n<\/ul>\n\n<p><strong>Advanced Capabilities<\/strong><\/p>\n\n<ul>\n<li><strong>Voting Controls<\/strong> \u2013 Open\/close voting by category, manage voter tokens, track submission and voting status per competition<\/li>\n<li><strong>Results Analytics<\/strong> \u2013 View score distributions, voting participation, and competition statistics from the admin dashboard<\/li>\n<li><strong>Export Tools<\/strong> \u2013 Export competition results, voting data, and member lists to CSV for archiving or external reporting<\/li>\n<li><strong>Repository Pattern<\/strong> \u2013 All data stored in dedicated database tables for performance, portability, and clean separation from WordPress content<\/li>\n<\/ul>\n\n<p><strong>Five Shortcodes, Unlimited Possibilities<\/strong><\/p>\n\n<ul>\n<li><code>[competition_upload]<\/code> \u2013 Member upload form with quota tracking<\/li>\n<li><code>[competition_voting]<\/code> \u2013 Interactive voting interface with live validation<\/li>\n<li><code>[competition_slideshow]<\/code> \u2013 Full-screen presentation mode for club meetings<\/li>\n<li><code>[competition_results]<\/code> \u2013 Complete results table with grade and category filtering<\/li>\n<li><code>[competition_top3]<\/code> \u2013 Responsive podium display showcasing winners<\/li>\n<\/ul>\n\n<p>Perfect for photography clubs, camera clubs, photo societies, and any organization running regular image competitions.<\/p>\n\n<!--section=installation-->\n<p><strong>Quick Start<\/strong><\/p>\n\n<ol>\n<li>Install via the Plugins screen on your WordPress site.<\/li>\n<li>Activate the plugin through <strong>Plugins \u2192 Installed Plugins<\/strong><\/li>\n<li>Navigate to <strong>Competitions \u2192 Setup Wizard<\/strong> to auto-create pages with shortcodes<\/li>\n<li>Go to <strong>Competitions \u2192 Settings<\/strong> to configure default categories, grades, and scoring<\/li>\n<li>Add your members via <strong>Competitions \u2192 Members<\/strong> (supports bulk CSV import)<\/li>\n<li>Create your first competition and start accepting submissions!<\/li>\n<\/ol>\n\n<p><strong>Manual Page Setup<\/strong><\/p>\n\n<p>If you prefer manual control, create pages with these shortcodes:<\/p>\n\n<ul>\n<li><code>[competition_upload]<\/code> \u2013 Member submission form<\/li>\n<li><code>[competition_voting]<\/code> \u2013 Voting interface (token-based or password-protected)<\/li>\n<li><code>[competition_slideshow]<\/code> \u2013 Full-screen slideshow for in-person voting<\/li>\n<li><code>[competition_results]<\/code> \u2013 Complete results table<\/li>\n<li><code>[competition_top3]<\/code> \u2013 Podium-style top 3 display<\/li>\n<\/ul>\n\n<p><strong>Shortcode Attributes<\/strong><\/p>\n\n<ul>\n<li><code>competition=\"slug\"<\/code> \u2013 Target a specific competition (all shortcodes)<\/li>\n<li><code>category=\"slug\"<\/code> \u2013 Filter by category (voting and slideshow only)<\/li>\n<\/ul>\n\n<p><strong>Building From Source<\/strong><\/p>\n\n<p>This plugin includes compiled JavaScript and CSS assets. The complete source code is available on GitHub:<\/p>\n\n<p>https:\/\/github.com\/donnchawp\/photo-competition-manager<\/p>\n\n<p>Source files are located in the <code>assets\/src\/<\/code> directory. To build the assets:<\/p>\n\n<ol>\n<li>Navigate to the assets directory: <code>cd assets<\/code><\/li>\n<li>Install dependencies: <code>npm install<\/code><\/li>\n<li>For development (watch mode): <code>npm run dev<\/code><\/li>\n<li>For production build: <code>npm run build<\/code><\/li>\n<\/ol>\n\n<p>The plugin uses <code>@wordpress\/scripts<\/code> for building and bundling assets. All source code can be reviewed, modified, and rebuilt from the repository.<\/p>\n\n<p><strong>Local Development<\/strong><\/p>\n\n<p>Run <code>make up<\/code> to launch the WordPress environment with Mailpit email capture at <a href=\"http:\/\/localhost:8026\">http:\/\/localhost:8026<\/a>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20members%20submit%20their%20photos%3F\"><h3>How do members submit their photos?<\/h3><\/dt>\n<dd><p>Members receive a magic-link email with a unique upload URL. No passwords or login required. They simply click the link, select their category, and upload their images. The system automatically validates file types, dimensions, and enforces submission quotas.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20voting%20system%3F\"><h3>Can I customize the voting system?<\/h3><\/dt>\n<dd><p>Yes! Choose between three voting modes:\n1. <strong>Token-based<\/strong> \u2013 Each member gets a unique voting link via email\n2. <strong>Password-protected<\/strong> \u2013 Share a single password with all voters\n3. <strong>Slideshow mode<\/strong> \u2013 Full-screen presentation for in-person voting at club meetings<\/p><\/dd>\n<dt id=\"how%20do%20email%20notifications%20work%3F\"><h3>How do email notifications work?<\/h3><\/dt>\n<dd><p>The plugin sends automated emails for key events:\n* Upload confirmations when members submit images\n* Voting invitations with unique links or passwords\n* Results announcements when competition closes\n* Custom templates with merge tags (member names, competition titles, links, etc.)<\/p>\n\n<p>Configure and customize all templates from <strong>Competitions \u2192 Email Templates<\/strong>.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20categories%20and%20grades%20per%20competition%3F\"><h3>Can I customize categories and grades per competition?<\/h3><\/dt>\n<dd><p>Absolutely. Set default categories, grades, quotas, and scoring matrices in <strong>Competitions \u2192 Settings<\/strong>. Each competition can override these defaults via its Settings tab without affecting future competitions.<\/p><\/dd>\n<dt id=\"what%20if%20someone%20loses%20their%20magic%20link%20or%20voting%20token%3F\"><h3>What if someone loses their magic link or voting token?<\/h3><\/dt>\n<dd><p><strong>For uploads:<\/strong> Regenerate the member's upload link from <strong>Competitions \u2192 Members<\/strong> \u2192 Edit Member \u2192 \"Send Upload Link\"<\/p>\n\n<p><strong>For voting:<\/strong> From <strong>Competitions \u2192 Voting Controls<\/strong>, close and reopen the voting category to generate fresh token links for all members.<\/p><\/dd>\n<dt id=\"can%20i%20hide%20member%20names%20in%20the%20results%3F\"><h3>Can I hide member names in the results?<\/h3><\/dt>\n<dd><p>Yes. The \"competition_results\" shortcode has an optional \"hide_names\" parameter. Set that to 1 to hide the names.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20mobile%20devices%3F\"><h3>Does it work on mobile devices?<\/h3><\/dt>\n<dd><p>Yes! All shortcodes are fully responsive and tested on mobile devices. The top-3 podium display, voting interface, and upload forms adapt beautifully to small screens.<\/p><\/dd>\n<dt id=\"where%20do%20uploaded%20images%20get%20stored%3F\"><h3>Where do uploaded images get stored?<\/h3><\/dt>\n<dd><p>Images are stored in <code>\/wp-content\/uploads\/competitions\/{competition-slug}\/{category-slug}\/<\/code>. The plugin automatically creates thumbnails and validates uploads. All paths are secure and inaccessible without proper authentication.<\/p><\/dd>\n<dt id=\"can%20i%20export%20competition%20data%3F\"><h3>Can I export competition data?<\/h3><\/dt>\n<dd><p>Yes. Visit <strong>Competitions \u2192 Export<\/strong> to download:\n* Full competition results (CSV)\n* Voting data and statistics (CSV)\n* Member lists (CSV)\n* All exports include timestamps and are formatted for Excel\/Google Sheets<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Fix fatal error on activation due to missing Admin_Dependencies class in release package<\/li>\n<li><strong>Results Sharing<\/strong> \u2014 Share competition results via a secret link before making them public\n\n<ul>\n<li>New \"Generate Results Link\" action on the Competitions page<\/li>\n<li>\"Send to Committee\" and \"Send to All Members\" buttons on the Results Dashboard<\/li>\n<li>Share link bypasses results visibility and resolves to the correct competition<\/li>\n<\/ul><\/li>\n<li><strong>Committee Members<\/strong> \u2014 Mark members as committee via admin or CSV import<\/li>\n<li>Confirmation dialogs on hash regeneration and email sending to prevent accidental actions<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li><p><strong>Voting Controls Redesign<\/strong><\/p>\n\n<ul>\n<li>Streamlined voting controls page with improved layout<\/li>\n<li>Added focus panel for managing individual categories<\/li>\n<li>Clear \"Voting is Open\/Closed\" status headings<\/li>\n<li>Extended slideshow duration options (5s to 30s) with 20s default<\/li>\n<\/ul><\/li>\n<li><p><strong>Member Management<\/strong><\/p>\n\n<ul>\n<li>New toggle button on Members page to enable\/disable uploads<\/li>\n<\/ul><\/li>\n<li><p><strong>Results &amp; Scoring<\/strong><\/p>\n\n<ul>\n<li>Proper tie handling in admin results and scoring calculations<\/li>\n<li>Scores now stored as totals per category for accuracy<\/li>\n<li>Grades displayed in results emails and thumbnails<\/li>\n<\/ul><\/li>\n<li><p><strong>Exports<\/strong><\/p>\n\n<ul>\n<li>Improved vote and uploader exports with category separation<\/li>\n<li>Aligned export columns across categories for better spreadsheet compatibility<\/li>\n<\/ul><\/li>\n<li><p><strong>Email<\/strong><\/p>\n\n<ul>\n<li>Site name now prefixed to all email subjects for clarity<\/li>\n<\/ul><\/li>\n<li><p><strong>Bug Fixes<\/strong><\/p>\n\n<ul>\n<li>Delete associated votes when deleting an image<\/li>\n<li>Normalized all times to UTC<\/li>\n<li>Proper cleanup of physical files and attachment posts on deletion<\/li>\n<\/ul><\/li>\n<li><p><strong>Compatibility<\/strong><\/p>\n\n<ul>\n<li>Tested up to WordPress 6.9<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li><p><strong>Core Features<\/strong><\/p>\n\n<ul>\n<li>Member management with CSV bulk import\/export<\/li>\n<li>Competition creation with custom categories, grades, and scoring<\/li>\n<li>Magic-link authentication for secure member uploads<\/li>\n<li>Three voting modes: token-based, password-protected, and slideshow<\/li>\n<li>Full results tables and responsive top-3 podium displays<\/li>\n<\/ul><\/li>\n<li><p><strong>Admin Interface<\/strong><\/p>\n\n<ul>\n<li>Setup wizard for automatic page creation<\/li>\n<li>Voting controls dashboard with category management<\/li>\n<li>Submission tracking and quota enforcement<\/li>\n<li>Results analytics and statistics<\/li>\n<li>CSV export for all competition data<\/li>\n<\/ul><\/li>\n<li><p><strong>Email System<\/strong><\/p>\n\n<ul>\n<li>Automated upload confirmations<\/li>\n<li>Voting invitation emails with tokens<\/li>\n<li>Results announcement notifications<\/li>\n<li>Customizable templates with merge tags<\/li>\n<li>Template enable\/disable controls<\/li>\n<\/ul><\/li>\n<li><p><strong>Frontend Shortcodes<\/strong><\/p>\n\n<ul>\n<li><code>[competition_upload]<\/code> \u2013 Member submission form<\/li>\n<li><code>[competition_voting]<\/code> \u2013 Interactive voting interface<\/li>\n<li><code>[competition_slideshow]<\/code> \u2013 Full-screen presentation mode<\/li>\n<li><code>[competition_results]<\/code> \u2013 Complete results table<\/li>\n<li><code>[competition_top3]<\/code> \u2013 Responsive podium display<\/li>\n<\/ul><\/li>\n<li><p><strong>Technical<\/strong><\/p>\n\n<ul>\n<li>Repository pattern with dedicated database tables<\/li>\n<li>Automatic image resizing and thumbnail generation<\/li>\n<li>Mobile-responsive frontend styles<\/li>\n<li>WordPress coding standards compliance<\/li>\n<li>PHPUnit test coverage for core functionality<\/li>\n<\/ul><\/li>\n<\/ul>","raw_excerpt":"Complete photography club competition platform. Handle submissions, member voting, public voting, email notifications, and beautiful results displays.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/259519","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=259519"}],"author":[{"embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/donncha"}],"wp:attachment":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=259519"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=259519"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=259519"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=259519"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=259519"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=259519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}