{"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-05-28T16:55:31","modified_gmt":"2026-05-28T16:55:31","slug":"citatly-daily-quote","status":"publish","type":"plugin","link":"https:\/\/eu.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-05-28 16:55:31","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":52,"num_ratings":2,"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-05-28 16:55:31"}},"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":2},"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":"The quote output on the frontend \u2014 styled with a custom theme.","2":"The quote list in the WordPress admin.","3":"Adding or editing a quote \u2014 plain text fields for text, author, and extra.","4":"Import \/ Export page for bulk management of quotes via JSON.","5":"The help \/ documentation page inside the admin."}},"plugin_section":[],"plugin_tags":[22601,5055,16696,354,80],"plugin_category":[43],"plugin_contributors":[264827],"plugin_business_model":[],"class_list":["post-318226","plugin","type-plugin","status-publish","hentry","plugin_tags-daily-quote","plugin_tags-quote","plugin_tags-quote-of-the-day","plugin_tags-quotes","plugin_tags-shortcode","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":"The quote output on the frontend \u2014 styled with a custom theme."},{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-2.png?rev=3552531","caption":"The quote list in the WordPress admin."},{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-3.png?rev=3552531","caption":"Adding or editing a quote \u2014 plain text fields for text, author, and extra."},{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-4.png?rev=3552531","caption":"Import \/ Export page for bulk management of quotes via JSON."},{"src":"https:\/\/ps.w.org\/citatly-daily-quote\/assets\/screenshot-5.png?rev=3552531","caption":"The help \/ documentation page inside the admin."}],"raw_content":"<!--section=description-->\n<p>Citatly (Daily Quote) adds a dedicated custom post type for quotes and automatically displays one of them each day on your website.<\/p>\n\n<p>The displayed quote changes once per day and is selected deterministically based on the current date \u2014 no randomness involved, so every visitor sees the same quote on the same day. Delivery is cache-safe via a REST API endpoint that sends appropriate HTTP caching headers, making it fully compatible with full-page caches and CDNs.<\/p>\n\n<p><strong>Live demo &amp; documentation:<\/strong> See the plugin in action at https:\/\/citatly.com<\/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: https:\/\/citatly.com\/de\/<\/p>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Custom post type \"Quotes\" 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 consistent for all visitors<\/li>\n<li>Embed anywhere with the <code>[citatly]<\/code> shortcode<\/li>\n<li>Optional <code>class<\/code> parameter for individual styling: <code>[citatly class=\"my-style\"]<\/code><\/li>\n<li>Gutenberg block support (requires compiled <code>\/build<\/code> directory)<\/li>\n<li>REST API endpoint <code>\/wp-json\/citatly\/v1\/today<\/code> with HTTP caching headers<\/li>\n<li>Plain text only \u2014 no HTML stored or output, XSS-safe by design<\/li>\n<li>Auto-generated post title from quote text<\/li>\n<li>Import and export quotes as JSON (via admin menu)<\/li>\n<li>Clean uninstall \u2014 removes all plugin data when deleted<\/li>\n<li>Translation-ready (<code>.pot<\/code> file included)<\/li>\n<\/ul>\n\n<p><strong>How the daily quote is selected:<\/strong><\/p>\n\n<p>The plugin uses a deterministic algorithm: <code>crc32(date + site_url)<\/code> maps today's date to a fixed quote from your collection. A fallback mechanism ensures that the same quote never appears on two consecutive days. This means the quote is stable throughout the day, works correctly even with full-page caching, and does not require any session or cookie.<\/p>\n\n<p><strong>CSS structure:<\/strong><\/p>\n\n<p>The plugin does not style the quote output \u2014 all visual styling is left to your theme. The only included CSS handles the skeleton loader during page load.<\/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<h3>Source Code<\/h3>\n\n<p>The compiled file <code>build\/index.js<\/code> is generated from the human-readable source files in the <code>src\/<\/code> directory using <code>@wordpress\/scripts<\/code>.<\/p>\n\n<p>The full source code, including all build tools and configuration, is publicly available at:\nhttps:\/\/github.com\/dieterDG\/citatly-daily-quote<\/p>\n\n<p>To regenerate the build files:<\/p>\n\n<ol>\n<li>Clone the repository<\/li>\n<li>Run <code>npm install<\/code><\/li>\n<li>Run <code>npm run build<\/code><\/li>\n<\/ol>\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 the new \"Quotes\" menu item and add one or more quotes.<\/li>\n<li>Insert the shortcode <code>[citatly]<\/code> on any page, post, or widget area.<\/li>\n<\/ol>\n\n<p>The shortcode accepts an optional <code>class<\/code> parameter to add a custom CSS class:<\/p>\n\n<pre><code>[citatly class=\"my-style\"]\n<\/code><\/pre>\n\n<p>All styling of the output (<code>.citatly<\/code>, <code>.citatly__text<\/code>, <code>.citatly__separator<\/code>, <code>.citatly__author<\/code>, <code>.citatly__divider<\/code>, <code>.citatly__source<\/code>) is handled entirely by your theme.<\/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%20current%20quote%20change%3F\"><h3>Why might the current quote change?<\/h3><\/dt>\n<dd><p>The quote of the day is selected based on the date and the total number of published quotes. Adding, deleting, or unpublishing a quote may cause today's displayed 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=\"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 loads up to 5,000 published quote IDs into a transient cache (refreshed daily), which is sufficient for any practical use case.<\/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 \"Quotes \u2192 Import \/ Export\" 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 (matching 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 (text, author, extra) are stored and output as plain text only. This prevents XSS issues and keeps quotes portable. Line breaks entered in the text field are preserved in the frontend output.<\/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. Separators between author and source (dash and dot) have their own classes and can be hidden or replaced via CSS. Add your own styles in your theme's stylesheet or via the WordPress Customizer. Interactive examples are available at https:\/\/citatly.com\/docs\/css-styling<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20with%20the%20block%20editor%3F\"><h3>Does the plugin work with the block editor?<\/h3><\/dt>\n<dd><p>Yes, if the <code>\/build<\/code> directory with the compiled block files is present. The shortcode works independently of the block and is always available.<\/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 the export function (Quotes \u2192 Import \/ Export) before deleting the plugin if you want to keep your quotes.<\/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). The text domain is <code>citatly-daily-quote<\/code>.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20work%20when%20the%20rest%20api%20is%20disabled%3F\"><h3>Does the plugin work when the REST API is disabled?<\/h3><\/dt>\n<dd><p>The plugin loads the daily quote 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 provide a way to whitelist specific endpoints. Add <code>citatly\/v1\/today<\/code> as an exception to restore functionality. The exact method depends on the plugin or server configuration used \u2014 please refer to its documentation for details.<\/p>\n\n<p>Note: If you are using Perfmatters, the plugin registers the exception automatically \u2014 no manual configuration needed.<\/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 the REST API cache is enabled, the quote may not change daily as expected. To fix this, set \"Default REST TTL\" to 0 under LiteSpeed Cache \u2192 Cache settings. A fix for automatic compatibility is included in an upcoming LiteSpeed Cache release.<\/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 new quote every day \u2014 delivered cache-safely via the WordPress REST API.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/318226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=318226"}],"author":[{"embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dieter93"}],"wp:attachment":[{"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=318226"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=318226"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=318226"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=318226"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=318226"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/eu.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=318226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}