{"id":318226,"date":"2026-05-28T16:55:48","date_gmt":"2026-05-28T16:55:48","guid":{"rendered":"https:\/\/de.wordpress.org\/plugins\/qotd-quote-of-the-day\/"},"modified":"2026-06-01T12:27:38","modified_gmt":"2026-06-01T12:27:38","slug":"citatly-daily-quote","status":"publish","type":"plugin","link":"https:\/\/ur.wordpress.org\/plugins\/citatly-daily-quote\/","author":17159945,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3.5","stable_tag":"1.3.5","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Citatly - Daily Quote","header_author":"Dieter Geiling","header_description":"CPT for quotes + display as quote of the day (AJAX\/REST, cache-safe).","assets_banners_color":"acc1d2","last_updated":"2026-06-01 12:27:38","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/citatly.com","header_author_uri":"https:\/\/www.space-in.de","rating":5,"author_block_rating":0,"active_installs":0,"downloads":63,"num_ratings":3,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.5":{"tag":"1.3.5","author":"dieter93","date":"2026-06-01 12:27:38"}},"upgrade_notice":{"1.3.5":"<p>New CSS classes for separator elements. Existing custom CSS continues to work. No manual steps required.<\/p>","1.3.4":"<p>Fixes a bug where deleting a quote could leave the frontend empty until the cache expired.<\/p>","1.3.3":"<p>Block name updated to English. No manual steps required.<\/p>","1.3.2":"<p>Improved quote rotation. No manual steps required.<\/p>","1.3.1":"<p>Compatibility update for Perfmatters users. No manual steps required.<\/p>","1.3.0":"<p>Performance update with CLS optimization. No manual steps required. The new skeleton loader improves loading experience and reduces layout shift.<\/p>","1.2.0":"<p>Feature update \u2014 no manual steps required.<\/p>","1.1.0":"<p>First public release. No upgrade steps required.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":3},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3552548,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3552548,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3552531,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3552531,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"citatly\/daily-quote":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"citatly\/daily-quote","version":"1.0.0","title":"Daily Quote","category":"widgets","icon":"format-quote","description":"Displays the daily quote dynamically via REST API.","textdomain":"citatly-daily-quote","editorScript":"file:.\/index.js","editorStyle":"file:.\/index.css"}},"tagged_versions":["1.3.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3552531,"resolution":"1","location":"assets","locale":"","width":1200,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3552531,"resolution":"2","location":"assets","locale":"","width":1200,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3552531,"resolution":"3","location":"assets","locale":"","width":1200,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3552531,"resolution":"4","location":"assets","locale":"","width":1200,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3552531,"resolution":"5","location":"assets","locale":"","width":1200,"height":900}},"screenshots":{"1":"Frontend output \u2014 the daily quote displayed on a page, styled with a custom theme.","2":"Quote list in the WordPress admin \u2014 an overview of all your quotes.","3":"Add or edit a quote \u2014 plain text fields for quote text, author, and an optional extra field.","4":"Import \/ Export \u2014 bulk manage your quotes via JSON file upload and download.","5":"Built-in help page \u2014 quick reference for shortcode, block, CSS classes, and the REST API endpoint."}},"plugin_section":[],"plugin_tags":[1220,22601,5055,16696,354],"plugin_category":[43],"plugin_contributors":[264827],"plugin_business_model":[],"class_list":["post-318226","plugin","type-plugin","status-publish","hentry","plugin_tags-block","plugin_tags-daily-quote","plugin_tags-quote","plugin_tags-quote-of-the-day","plugin_tags-quotes","plugin_category-customization","plugin_contributors-dieter93","plugin_committers-dieter93"],"banners":{"banner":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/banner-772x250.jpg?rev=3552531","banner_2x":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/banner-1544x500.jpg?rev=3552531","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/icon-128x128.png?rev=3552548","icon_2x":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/icon-256x256.png?rev=3552548","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-1.png?rev=3552531","caption":"Frontend output \u2014 the daily quote displayed on a page, styled with a custom theme."},{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-2.png?rev=3552531","caption":"Quote list in the WordPress admin \u2014 an overview of all your quotes."},{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-3.png?rev=3552531","caption":"Add or edit a quote \u2014 plain text fields for quote text, author, and an optional extra field."},{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-4.png?rev=3552531","caption":"Import \/ Export \u2014 bulk manage your quotes via JSON file upload and download."},{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-5.png?rev=3552531","caption":"Built-in help page \u2014 quick reference for shortcode, block, CSS classes, and the REST API endpoint."}],"raw_content":"<!--section=description-->\n<p>Citatly lets you manage your own quote collection and automatically displays a fresh one each day on your website \u2014 cache-safe, without any external services or API keys.<\/p>\n\n<p>The daily quote is selected based on the current date, so every visitor sees the same quote throughout the day regardless of caching. It is delivered via a REST API endpoint with proper HTTP caching headers, making it fully compatible with full-page caches and CDNs like WP Rocket, LiteSpeed Cache, or Cloudflare.<\/p>\n\n<p><strong>Live demo &amp; documentation:<\/strong> <a href=\"https:\/\/citatly.com\">citatly.com<\/a><\/p>\n\n<p><strong>F\u00fcr deutschsprachige Nutzer:<\/strong><\/p>\n\n<p>Das Plugin \u201eZitat des Tages\" ist vollst\u00e4ndig auf Deutsch \u00fcbersetzt (de_DE). Es zeigt t\u00e4glich ein neues Zitat aus deiner eigenen Sammlung \u2014 cache-sicher, ohne externe Abh\u00e4ngigkeiten und ohne API-Schl\u00fcssel. Live-Demo &amp; Dokumentation auf Deutsch: <a href=\"https:\/\/citatly.com\/de\/\">citatly.com\/de\/<\/a><\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Manage your quotes via a dedicated custom post type in the WordPress admin<\/li>\n<li>Fields for quote text, author, and an optional extra field (e.g. source, year, or context)<\/li>\n<li>Daily quote rotation \u2014 same quote for all visitors throughout the day<\/li>\n<li>Embed anywhere with the <code>[citatly]<\/code> shortcode or the Gutenberg block<\/li>\n<li>Optional <code>class<\/code> parameter for custom styling: <code>[citatly class=\"my-style\"]<\/code><\/li>\n<li>REST API endpoint <code>\/wp-json\/citatly\/v1\/today<\/code> with HTTP caching headers<\/li>\n<li>Import and export your quotes as JSON<\/li>\n<li>Plain text only \u2014 no HTML stored or output, safe by design<\/li>\n<li>Clean uninstall \u2014 removes all plugin data when deleted<\/li>\n<li>Fully translated into German (de_DE)<\/li>\n<\/ul>\n\n<h3>Source Code<\/h3>\n\n<p>The full source code, including all build tools and configuration, is publicly available at:\n<a href=\"https:\/\/github.com\/dieterDG\/citatly-daily-quote\">github.com\/dieterDG\/citatly-daily-quote<\/a><\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>citatly-daily-quote<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin via the \"Plugins\" menu in the WordPress admin.<\/li>\n<li>Go to <strong>Quotes \u2192 Add New<\/strong> and add one or more quotes.<\/li>\n<li>Insert the shortcode <code>[citatly]<\/code> on any page, post, or widget area \u2014 or use the Gutenberg block.<\/li>\n<\/ol>\n\n<p>The quote changes automatically at midnight (site timezone).<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20quote%20change%20for%20every%20page%20load%3F\"><h3>Does the quote change for every page load?<\/h3><\/dt>\n<dd><p>No. The quote is selected once per day based on the current date. All visitors see the same quote throughout the day, regardless of caching.<\/p><\/dd>\n<dt id=\"why%20might%20the%20displayed%20quote%20unexpectedly%20change%3F\"><h3>Why might the displayed quote unexpectedly change?<\/h3><\/dt>\n<dd><p>The daily quote is selected based on the current date and the total number of published quotes. Adding, deleting, or unpublishing a quote may cause today's quote to change. From the next day on, everything works as normal again.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20compatible%20with%20caching%20plugins%20and%20cdns%3F\"><h3>Is the plugin compatible with caching plugins and CDNs?<\/h3><\/dt>\n<dd><p>Yes. The REST endpoint returns proper <code>Cache-Control<\/code> and <code>Expires<\/code> headers that expire at midnight. It works correctly with WP Rocket, W3 Total Cache, LiteSpeed Cache, Cloudflare, and similar solutions.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20with%20litespeed%20cache%3F\"><h3>Does the plugin work with LiteSpeed Cache?<\/h3><\/dt>\n<dd><p>Yes. However, if REST API caching is enabled in LiteSpeed Cache, the quote may not change daily as expected. To fix this, set \"Default REST TTL\" to 0 under LiteSpeed Cache \u2192 Cache \u2192 TTL.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20when%20the%20rest%20api%20is%20restricted%3F\"><h3>Does the plugin work when the REST API is restricted?<\/h3><\/dt>\n<dd><p>The daily quote is loaded via a REST API request in the visitor's browser. If the REST API is restricted or disabled for unauthenticated visitors, the quote will not be displayed.<\/p>\n\n<p>Most performance and security plugins that restrict the REST API also allow whitelisting specific endpoints. Add <code>citatly\/v1\/today<\/code> as an exception to restore functionality.<\/p>\n\n<p>Note: If you are using Perfmatters, the exception is registered automatically \u2014 no manual configuration needed.<\/p><\/dd>\n<dt id=\"does%20the%20gutenberg%20block%20work%3F\"><h3>Does the Gutenberg block work?<\/h3><\/dt>\n<dd><p>Yes. The block is available in the editor right away after activation. The shortcode <code>[citatly]<\/code> works independently of the block and is always available.<\/p><\/dd>\n<dt id=\"can%20i%20style%20the%20output%3F\"><h3>Can I style the output?<\/h3><\/dt>\n<dd><p>Yes. The plugin outputs a simple HTML structure with BEM-style CSS classes that you can target in your theme's stylesheet:<\/p>\n\n<pre><code>.citatly \u2014 outer wrapper\n.citatly__text \u2014 the quote text\n.citatly__meta \u2014 wraps author and source\n.citatly__separator \u2014 dash before author (default: \"\u2014 \")\n.citatly__author \u2014 author name\n.citatly__divider \u2014 dot between author and source (default: \" \u00b7 \")\n.citatly__source \u2014 optional extra field\n<\/code><\/pre>\n\n<p>Interactive styling examples are available at <a href=\"https:\/\/citatly.com\/docs\/css-styling\">citatly.com\/docs\/css-styling<\/a><\/p><\/dd>\n<dt id=\"how%20many%20quotes%20can%20i%20add%3F\"><h3>How many quotes can I add?<\/h3><\/dt>\n<dd><p>There is no hard limit. The plugin handles up to 5,000 published quotes without any issues.<\/p><\/dd>\n<dt id=\"can%20i%20import%20existing%20quotes%3F\"><h3>Can I import existing quotes?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Quotes \u2192 Import \/ Export<\/strong> in the admin. Upload a JSON file containing an array of objects with the fields <code>text<\/code>, <code>author<\/code>, and <code>extra<\/code>. Duplicate quotes (same text) are automatically skipped.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20store%20html%20in%20quotes%3F\"><h3>Does the plugin store HTML in quotes?<\/h3><\/dt>\n<dd><p>No. All fields are stored and output as plain text only. Line breaks entered in the text field are preserved in the frontend output.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20the%20plugin%20is%20deleted%3F\"><h3>What happens when the plugin is deleted?<\/h3><\/dt>\n<dd><p>All plugin data is permanently removed: all quote posts, their meta fields, and the transient cache. Use <strong>Quotes \u2192 Import \/ Export<\/strong> to export your quotes before deleting the plugin.<\/p><\/dd>\n<dt id=\"is%20the%20plugin%20available%20in%20german%3F\"><h3>Is the plugin available in German?<\/h3><\/dt>\n<dd><p>Yes. The plugin is fully translated into German (de_DE). If you installed it from wordpress.org, the translation is downloaded automatically by WordPress.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Separators (dash and dot) are now wrapped in their own BEM elements (<code>.citatly__separator<\/code>, <code>.citatly__divider<\/code>) and can be hidden or replaced via CSS<\/li>\n<li>All meta elements (separator, author, divider, source) are now built dynamically by JavaScript \u2014 only elements with content are rendered<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Fix: Transient cache for quote IDs is now invalidated when a quote is trashed or deleted. Previously, deleting a quote could result in no quote being displayed until the cache expired on its own<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>Block: Title and block name changed to English (\"Daily Quote\") for consistency with the plugin name on wordpress.org. The editor preview text remains translated<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Improved daily quote selection: a fallback mechanism now ensures that the same quote never appears on two consecutive days<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>REST endpoint automatically registered as exception when Perfmatters restricts the REST API<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added CLS-optimized skeleton loader with shimmer animation<\/li>\n<li>Dynamic min-height calculation prevents layout shift during quote loading<\/li>\n<li>New citatly.css for skeleton loader styling<\/li>\n<li>Responsive min-height adjustment for mobile and desktop viewports<\/li>\n<li>CSS custom properties for easy skeleton customization (--citatly-skeleton-base, --citatly-skeleton-shine)<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Gutenberg block support<\/li>\n<li>JSON import and export via admin submenu<\/li>\n<li>Admin help \/ documentation page<\/li>\n<li>Auto-generated post title from quote text<\/li>\n<li>Clean uninstall routine<\/li>\n<li>Full German translation (de_DE)<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Shortcode with optional class parameter<\/li>\n<li>REST API endpoint with HTTP caching headers<\/li>\n<li>Deterministic daily selection<\/li>\n<li>Custom post type with plain text meta fields<\/li>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Display a fresh quote every day from your own collection \u2014 cache-safe, no external services, no API key required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/318226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=318226"}],"author":[{"embeddable":true,"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dieter93"}],"wp:attachment":[{"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=318226"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=318226"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=318226"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=318226"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=318226"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ur.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=318226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}