{"id":337042,"date":"2026-08-05T11:04:18","date_gmt":"2026-08-05T11:04:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/seven-digits-dilemmas\/"},"modified":"2026-08-05T11:03:45","modified_gmt":"2026-08-05T11:03:45","slug":"seven-digits-dilemmas","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/seven-digits-dilemmas\/","author":23528839,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"7.0.2","requires":"6.9","requires_php":"8.1","requires_plugins":null,"header_name":"Seven Digits Dilemmas","header_author":"Seven Digits Media","header_description":"Embed two-option \"dilemma\" polls in any post via shortcode. One-click voting, animated result bars, per-dilemma voting periods, centralised styling, statistics, audit log, SEO-friendly server-side rendering with optional Schema.org JSON-LD.","assets_banners_color":"588aab","last_updated":"2026-08-05 11:03:45","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/7digits.net\/dilemmas-wordpress-plugin","header_author_uri":"https:\/\/7digits.net","rating":0,"author_block_rating":0,"active_installs":0,"downloads":26,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.1":{"tag":"1.2.1","author":"7digits","date":"2026-08-05 11:03:45"}},"upgrade_notice":{"1.2.1":"<p>The shortcode is now <code>[sevendigits_dilemma id=&amp;quot;1&amp;quot;]<\/code>. If you used the previous <code>[dilemma]<\/code> tag anywhere, update those posts \u2014 the old tag is no longer registered.<\/p>","1.2.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3635283,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3635283,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3635283,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3635283,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3635283,"resolution":"1","location":"assets","locale":"","width":1390,"height":1123},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3635283,"resolution":"10","location":"assets","locale":"","width":2888,"height":532},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3635283,"resolution":"2","location":"assets","locale":"","width":1390,"height":1235},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3635283,"resolution":"3","location":"assets","locale":"","width":3050,"height":830},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3635283,"resolution":"4","location":"assets","locale":"","width":3010,"height":1830},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3635283,"resolution":"5","location":"assets","locale":"","width":1760,"height":1880},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3635283,"resolution":"6","location":"assets","locale":"","width":1223,"height":1446},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3635283,"resolution":"7","location":"assets","locale":"","width":1133,"height":1686},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3635283,"resolution":"8","location":"assets","locale":"","width":1534,"height":899},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3635283,"resolution":"9","location":"assets","locale":"","width":1229,"height":2402}},"screenshots":{"1":"A dilemma embedded in a post \u2014 the pre-vote state, with both options waiting for a single click.","2":"The same dilemma right after voting: the chosen option is highlighted, both cards show percentage and vote count, and the total appears below. (Shown with custom colours; the defaults are a pale blue winner and a near-white runner-up.)","3":"All Dilemmas \u2014 status, voting period, running totals and A\/B split, plus a copy-to-clipboard shortcode for every dilemma.","4":"The dilemma editor: question and two options, voting period with optional explicit start and end dates, per-dilemma visual and animation overrides, and a live preview.","5":"Settings \u2192 Colours: every colour in the widget, including the winning and losing fills after a vote and the \"voting closed\" badge.","6":"Settings \u2192 Typography: font family, size, and weight for the question and the option text.","7":"Settings \u2192 Layout: rectangle height, border radius and width, spacing, max width, and mobile stacking.","8":"Settings \u2192 Animation defaults: one of nine reveal animations, its duration, and reduced-motion handling.","9":"Settings \u2192 Behaviour: cookie lifetime, default voting period, Hungarian and English badge and label text, Schema.org output, and audit log retention.","10":"The Audit Log \u2014 a read-only, filterable record of every privileged action."}},"plugin_section":[],"plugin_tags":[307,2254,80,364,9827],"plugin_category":[42,43,53],"plugin_contributors":[274530],"plugin_business_model":[],"class_list":["post-337042","plugin","type-plugin","status-publish","hentry","plugin_tags-engagement","plugin_tags-poll","plugin_tags-shortcode","plugin_tags-survey","plugin_tags-vote","plugin_category-contact-forms","plugin_category-customization","plugin_category-ratings-and-reviews","plugin_contributors-7digits","plugin_committers-7digits"],"banners":{"banner":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/banner-772x250.png?rev=3635283","banner_2x":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/banner-1544x500.png?rev=3635283","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/icon-128x128.png?rev=3635283","icon_2x":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/icon-256x256.png?rev=3635283","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-1.png?rev=3635283","caption":"A dilemma embedded in a post \u2014 the pre-vote state, with both options waiting for a single click."},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-2.png?rev=3635283","caption":"The same dilemma right after voting: the chosen option is highlighted, both cards show percentage and vote count, and the total appears below. (Shown with custom colours; the defaults are a pale blue winner and a near-white runner-up.)"},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-3.png?rev=3635283","caption":"All Dilemmas \u2014 status, voting period, running totals and A\/B split, plus a copy-to-clipboard shortcode for every dilemma."},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-4.png?rev=3635283","caption":"The dilemma editor: question and two options, voting period with optional explicit start and end dates, per-dilemma visual and animation overrides, and a live preview."},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-5.png?rev=3635283","caption":"Settings \u2192 Colours: every colour in the widget, including the winning and losing fills after a vote and the \"voting closed\" badge."},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-6.png?rev=3635283","caption":"Settings \u2192 Typography: font family, size, and weight for the question and the option text."},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-7.png?rev=3635283","caption":"Settings \u2192 Layout: rectangle height, border radius and width, spacing, max width, and mobile stacking."},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-8.png?rev=3635283","caption":"Settings \u2192 Animation defaults: one of nine reveal animations, its duration, and reduced-motion handling."},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-9.png?rev=3635283","caption":"Settings \u2192 Behaviour: cookie lifetime, default voting period, Hungarian and English badge and label text, Schema.org output, and audit log retention."},{"src":"https:\/\/ps.w.org\/seven-digits-dilemmas\/assets\/screenshot-10.png?rev=3635283","caption":"The Audit Log \u2014 a read-only, filterable record of every privileged action."}],"raw_content":"<!--section=description-->\n<p><strong>Every good post has two sides. Let your readers pick one.<\/strong><\/p>\n\n<p>Coffee or tea. Remote or office. Print or digital. A <em>dilemma<\/em> is the smallest possible piece of interactive content \u2014 one question, two options, one click \u2014 and it is remarkably good at turning a passive reader into a participant.<\/p>\n\n<p>Seven Digits Dilemmas gives you exactly that. Write a question with two options, paste one shortcode into any post or page, and visitors vote with a single click. No account, no form, no page reload. The moment they choose, the two option cards animate into result bars showing live percentages and vote counts.<\/p>\n\n<p>A dilemma gives people a reason to stop scrolling, a reason to come back (\"who's winning?\"), and a reason to share. And every vote is first-party audience insight, stored in your own database \u2014 not somebody else's.<\/p>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li><strong>Create a dilemma.<\/strong> Go to <strong>Dilemmas \u2192 Add New<\/strong>, type your question and two options, set a voting period (or leave the 30-day default), and publish.<\/li>\n<li><strong>Drop in the shortcode.<\/strong> Each dilemma gets its own tag, ready to copy: <code>[sevendigits_dilemma id=\"1\"]<\/code><\/li>\n<li><strong>Readers vote.<\/strong> The two options render as real, server-side HTML. A click sends one small REST request, and the cards animate into result bars \u2014 percentages, vote counts, and the total underneath.<\/li>\n<li><strong>You watch the split.<\/strong> The Statistics dashboard shows KPIs, a votes-per-day chart, and a per-dilemma A\/B breakdown you can export to CSV.<\/li>\n<\/ol>\n\n<p>Behind the scenes, one vote per visitor is enforced <em>twice<\/em>: a first-party cookie on the client, and a unique database index on the server. Clearing the cookie does not buy a second vote.<\/p>\n\n<h4>One-click voting that just works<\/h4>\n\n<ul>\n<li>Visitors vote with a single click; the result view animates in instantly.<\/li>\n<li>One vote per visitor, enforced by both a first-party cookie and a database-level unique index.<\/li>\n<li>Per-dilemma voting periods (default 30 days). When a period ends, voting closes automatically but results stay visible with a \"closed\" badge.<\/li>\n<li>Schedule a dilemma to open in the future with an explicit start date.<\/li>\n<li>Works for logged-out visitors \u2014 no registration required.<\/li>\n<\/ul>\n\n<h4>Make it look like your site<\/h4>\n\n<ul>\n<li>Colours, typography, spacing, rectangle height, border radius, max width, and mobile stacking are all configurable from a tabbed Settings screen \u2014 no CSS needed.<\/li>\n<li>Nine result-reveal animations (fade, slide down, slide up, flip, fold, rotate, scale, reveal, or none) with adjustable duration, overridable per dilemma.<\/li>\n<li>Respects the visitor's reduced-motion preference and falls back to instant transitions.<\/li>\n<li>Every tab can be restored to its defaults independently, so experimenting is safe.<\/li>\n<li>BEM-style class names (<code>sd-dilemma<\/code>, <code>sd-dilemma__option<\/code>, <code>sd-dilemma__results<\/code>, \u2026) for theme developers who want to go further in CSS.<\/li>\n<\/ul>\n\n<h4>Know what your audience thinks<\/h4>\n\n<ul>\n<li>A Statistics dashboard with KPIs, date-range filters, and a top-10 dilemmas chart.<\/li>\n<li>Per-dilemma drilldowns: the A\/B split, a votes-per-day chart, and the most recent votes.<\/li>\n<li>CSV export of both the overview and per-dilemma vote logs (UTF-8 with BOM, so accented characters open correctly in Excel).<\/li>\n<li>An append-only audit log of every privileged admin action \u2014 who did what, to which dilemma, and when \u2014 with configurable retention.<\/li>\n<li>Full lifecycle management: create, edit, clone, archive, restore, reset votes, delete.<\/li>\n<\/ul>\n\n<h4>Fast, private, and dependency-free<\/h4>\n\n<ul>\n<li><strong>Server-side rendering.<\/strong> The question and both options are real HTML, visible to search engines and no-JS visitors, with an optional Schema.org <code>Question<\/code> JSON-LD block.<\/li>\n<li><strong>Cache-friendly.<\/strong> The pre-vote markup is identical for every visitor, so full-page caches serve a single version; per-visitor state hydrates via one lightweight REST call.<\/li>\n<li><strong>No tracking.<\/strong> No raw IP addresses or user agents are ever stored \u2014 only salted hashes, used solely for fraud prevention and rate limiting.<\/li>\n<li><strong>No dependencies.<\/strong> Vanilla JavaScript. No jQuery, no external CDN requests, no build step, no Composer.<\/li>\n<li><strong>Translation-ready<\/strong>, with separate Hungarian and English front-end labels you can edit in Settings, plus locale-aware date formatting.<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin sets a single first-party, strictly-necessary functional cookie (<code>7d_dv<\/code>) whose only purpose is to enforce the one-vote-per-visitor rule. No personal data is collected, no raw IP addresses or user agents are stored (only salted HMAC-SHA256 hashes, for fraud prevention and rate limiting), and nothing is sent to any external service. A ready-made paragraph for your site's privacy policy is provided through the WordPress privacy policy helper.<\/p>\n\n<h4>External services and bundled libraries<\/h4>\n\n<p>This plugin does <strong>not<\/strong> connect to any external service. All processing happens on your own server, and all assets are bundled locally.<\/p>\n\n<p>It bundles one third-party library: <a href=\"https:\/\/www.chartjs.org\/\">Chart.js<\/a> (MIT licence), loaded only on the plugin's own admin statistics screens \u2014 never on the front end.<\/p>\n\n<h4>REST API<\/h4>\n\n<p>The plugin registers two endpoints under <code>sevendigits\/v1<\/code>:<\/p>\n\n<ul>\n<li><code>POST \/dilemmas\/{id}\/vote<\/code> \u2014 casts a vote. Protected by a REST nonce and rate-limited per IP.<\/li>\n<li><code>GET \/dilemmas\/{id}\/results<\/code> \u2014 returns the public vote counts for a published dilemma. This endpoint is intentionally public: it exposes only the same aggregate numbers already rendered on the page.<\/li>\n<\/ul>\n\n<h4>Support<\/h4>\n\n<p>Seven Digits Dilemmas is built and maintained by <strong><a href=\"https:\/\/7digits.net\">Seven Digits Media<\/a><\/strong>, a performance-driven digital marketing agency.<\/p>\n\n<p>Questions, bug reports, feature ideas, or help fitting dilemmas into your content strategy? Get in touch at <strong><a href=\"https:\/\/7digits.net\">7digits.net<\/a><\/strong> \u2014 we read everything, and we are happy to help.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from the WordPress.org plugin directory, or upload the <code>seven-digits-dilemmas<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu. Activation creates the plugin's database tables and grants the <code>sevendigits_manage_dilemmas<\/code> capability to Administrators and Editors.<\/li>\n<li>Go to <strong>Dilemmas \u2192 Add New<\/strong>, enter a question and two options, and publish.<\/li>\n<li>Copy the generated shortcode and paste it into any post or page, for example: <code>[sevendigits_dilemma id=\"1\"]<\/code><\/li>\n<li>Optionally visit <strong>Dilemmas \u2192 Settings<\/strong> to match colours, typography, and animations to your theme.<\/li>\n<\/ol>\n\n<p>Deactivating the plugin preserves all data. Deleting it removes the plugin's tables, options, and capability.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20a%20visitor%20vote%20more%20than%20once%3F\"><h3>Can a visitor vote more than once?<\/h3><\/dt>\n<dd><p>No. A first-party functional cookie plus a database-level unique index enforce exactly one vote per visitor. The database constraint holds even if the cookie is cleared or forged.<\/p><\/dd>\n<dt id=\"does%20it%20store%20ip%20addresses%20or%20personal%20data%3F\"><h3>Does it store IP addresses or personal data?<\/h3><\/dt>\n<dd><p>No. Only salted HMAC-SHA256 hashes of the IP and user agent are stored, used solely for fraud prevention and rate limiting \u2014 never for tracking or profiling. No personal data is collected.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20caching%3F\"><h3>Does it work with page caching?<\/h3><\/dt>\n<dd><p>Yes. The pre-vote markup is identical for every visitor, so it caches as a single version. Each visitor's own state (voted or not, and their choice) is hydrated client-side via a lightweight REST call.<\/p><\/dd>\n<dt id=\"does%20it%20require%20jquery%2C%20a%20build%20step%2C%20or%20a%20cdn%3F\"><h3>Does it require jQuery, a build step, or a CDN?<\/h3><\/dt>\n<dd><p>No. The plugin ships plain vanilla JavaScript and locally bundled assets only. It makes no requests to external services.<\/p><\/dd>\n<dt id=\"can%20i%20style%20the%20polls%20to%20match%20my%20theme%3F\"><h3>Can I style the polls to match my theme?<\/h3><\/dt>\n<dd><p>Yes. Colours, fonts, sizes, spacing, and animations are configurable from the Settings screen without any CSS. Theme developers can also target the plugin's BEM-style class names directly.<\/p><\/dd>\n<dt id=\"can%20i%20put%20more%20than%20one%20dilemma%20on%20a%20page%3F\"><h3>Can I put more than one dilemma on a page?<\/h3><\/dt>\n<dd><p>Yes. Each shortcode is independent, with its own question, voting period, animation, and results.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20a%20voting%20period%20ends%3F\"><h3>What happens when a voting period ends?<\/h3><\/dt>\n<dd><p>Voting closes automatically and the dilemma keeps displaying its final results with a \"closed\" badge. You can also set an explicit start date so a dilemma opens in the future.<\/p><\/dd>\n<dt id=\"is%20it%20translation-ready%3F\"><h3>Is it translation-ready?<\/h3><\/dt>\n<dd><p>Yes. All strings are translatable (text domain <code>seven-digits-dilemmas<\/code>) and translations are delivered automatically through translate.wordpress.org \u2014 no files to install. Separately, the visitor-facing labels (\"Total votes:\", the closed\/opens badges) are editable settings with independent Hungarian and English values, so those read correctly even before a language pack exists.<\/p><\/dd>\n<dt id=\"who%20can%20manage%20dilemmas%3F\"><h3>Who can manage dilemmas?<\/h3><\/dt>\n<dd><p>Users with the <code>sevendigits_manage_dilemmas<\/code> capability \u2014 Administrators and Editors by default. Every privileged action is recorded in an audit log.<\/p><\/dd>\n<dt id=\"where%20do%20i%20get%20help%3F\"><h3>Where do I get help?<\/h3><\/dt>\n<dd><p>Use the WordPress.org support forum for this plugin, or contact us directly at <a href=\"https:\/\/7digits.net\">7digits.net<\/a>.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Renamed the shortcode from <code>[dilemma]<\/code> to <code>[sevendigits_dilemma]<\/code> so the tag cannot collide with another plugin.<\/li>\n<li>Prefixed the plugin's transient keys (results cache and rate-limit counters) with <code>sevendigits_dilemmas_<\/code>.<\/li>\n<li>Renamed the three custom tables from the <code>7d_<\/code> prefix to <code>sevendigits_dilemmas*<\/code>, and the capability from <code>manage_dilemmas<\/code> to <code>sevendigits_manage_dilemmas<\/code>. Existing installs are migrated automatically on upgrade \u2014 tables are renamed in place (no data is copied or lost) and any role holding the old capability is moved to the new one.<\/li>\n<li>Hardened the inline CSS output: settings-driven values are now escaped with a dedicated CSS-context escaper instead of <code>esc_attr()<\/code>.<\/li>\n<li>Removed the bundled Hungarian translation files \u2014 translations are delivered through translate.wordpress.org.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Two-option dilemma polls in any post via shortcode: one-click voting, animated result bars, live statistics, and SEO-friendly server rendering.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/337042","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=337042"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/7digits"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=337042"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=337042"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=337042"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=337042"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=337042"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=337042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}