{"id":11273,"date":"2026-05-28T23:30:04","date_gmt":"2026-05-28T15:30:04","guid":{"rendered":"https:\/\/aeosub.com\/cronheart\/"},"modified":"2026-05-28T23:30:04","modified_gmt":"2026-05-28T15:30:04","slug":"cronheart","status":"publish","type":"post","link":"https:\/\/aeosub.com\/zh\/cronheart\/","title":{"rendered":"Cronheart"},"content":{"rendered":"<div class=\"plugin-info-card\" style=\"border: 1px solid #e2e8f0;border-radius: 10px;overflow: hidden;margin-bottom: 30px;font-family: -apple-system, system-ui, sans-serif;background: #fff\">\n<table style=\"width: 100%;border-collapse: collapse;font-size: 14px\">\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 15px 20px;text-align: left;width: 35%;color: #4a5568;background: #fcfcfc\"><img decoding=\"async\" src=\"https:\/\/s.w.org\/plugins\/geopattern-icon\/cronheart.svg\" style=\"width: 40px;height: 40px;border-radius: 6px;margin-right: 12px;vertical-align: middle\"> Developer<\/th>\n<td style=\"padding: 15px 20px;font-weight: 500\"><a href=\"https:\/\/profiles.wordpress.org\/cronheart\/\" target=\"_blank\" rel=\"noopener\">cronheart<\/a><\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Version<\/th>\n<td style=\"padding: 12px 20px\">v0.1.9<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Active Installs<\/th>\n<td style=\"padding: 12px 20px\">0 +<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Requires \/ Tested<\/th>\n<td style=\"padding: 12px 20px\">6.0 \/ 7.0<\/td>\n<\/tr>\n<tr style=\"border-bottom: 1px solid #edf2f7\">\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Last Updated<\/th>\n<td style=\"padding: 12px 20px\">2026-05-28 3:27pm GMT<\/td>\n<\/tr>\n<tr>\n<th style=\"padding: 12px 20px;text-align: left;color: #4a5568;background: #fcfcfc\">Official Link<\/th>\n<td style=\"padding: 12px 20px\"><a href=\"https:\/\/wordpress.org\/plugins\/cronheart\/\" target=\"_blank\" style=\"text-decoration: none;color: #4a3bca;font-weight: bold\" rel=\"noopener\">View Details \u2192<\/a><\/td>\n<\/tr>\n<\/table><\/div>\n<div class=\"plugin-short-desc\" style=\"margin: 20px 0;padding: 12px 15px;background: #f9fafb;border-left: 4px solid #4a3bca;border-radius: 6px;font-style: italic;color: #4a5568\">Dead-man-switch monitoring for WP-Cron. Get alerted when scheduled events stop firing \u2014 uptime monitors do not catch this.<\/div>\n<p><strong>WP-Cron is request-driven.<\/strong> On a low-traffic site no requests<br \/>\narrive, no events fire, and a scheduled backup can be stalled for<br \/>\nweeks before anyone notices. Uptime monitors do not catch this \u2014 the<br \/>\nsite responds to HTTPS just fine, it just is not running its jobs.<\/p>\n<p>Cronheart turns WP-Cron into a <strong>dead-man switch<\/strong>: the plugin pings<br \/>\n<a href=\"https:\/\/cronheart.com\" rel=\"nofollow ugc noopener\" target=\"_blank\">cronheart.com<\/a> every five minutes and on<br \/>\nevery individual event you register. If the pings stop, cronheart<br \/>\nalerts you via email, Telegram, Slack, Discord, or a custom webhook.<\/p>\n<h4>What it does<\/h4>\n<ul>\n<li><strong>Site heartbeat.<\/strong> A 5-minute custom WP-Cron event whose only job<br \/>\nis to ping cronheart. Proves WP-Cron itself is alive on this site.<\/li>\n<li><strong>Per-event monitoring.<\/strong> Register any scheduled hook for<br \/>\nstart \/ success \/ fail pings with one PHP one-liner:<br \/>\n  cronheart_monitor( &#8216;my_nightly_report&#8217;, &#8216;xxxxxxxx-\u2026&#8217; );<\/li>\n<li><strong>PHP fatal-error capture.<\/strong> When a scheduled callback fatals or<br \/>\nthrows, the fail-ping body includes the <code>error_get_last()<\/code><br \/>\nsummary \u2014 the cronheart dashboard shows the cause without you<br \/>\ntailing <code>debug.log<\/code>.<\/li>\n<li><strong>Settings page.<\/strong> A read-only &#8220;Monitored events&#8221; table at<br \/>\nSettings <span aria-hidden=\"true\" class=\"wp-exclude-emoji\">\u2192<\/span> Cronheart shows every hook the plugin is watching and<br \/>\nwhere its UUID came from (constant, option, filter).<\/li>\n<li><strong>Configuration through <code>wp-config.php<\/code> constants<\/strong> for production<br \/>\n(<code>CRONHEART_HEARTBEAT_UUID<\/code>, <code>CRONHEART_EVENT_&lt;HOOK&gt;_UUID<\/code>), with<br \/>\nadmin-UI fallback for sites where editing <code>wp-config.php<\/code> is not<br \/>\npractical.<\/li>\n<\/ul>\n<h4>Never breaks WP-Cron<\/h4>\n<p>The plugin&#8217;s hard contract: a broken cronheart backend, an<br \/>\nunreachable network, a misbehaving PSR-18 HTTP client \u2014 none of<br \/>\nthem may cause WP-Cron to fail. Every network \/ HTTP error is<br \/>\nswallowed into a logged warning. If cronheart goes down for a<br \/>\nday, your <code>wp_schedule_event<\/code> callbacks still run normally; you<br \/>\njust stop seeing pings on the dashboard.<\/p>\n<h4>External services<\/h4>\n<p>This plugin sends HTTP requests to <a href=\"https:\/\/cronheart.com\" rel=\"nofollow ugc noopener\" target=\"_blank\">cronheart.com<\/a><br \/>\non every scheduled WP-Cron run, but <strong>only when you supply a<br \/>\nmonitor UUID<\/strong>. Without configuration the plugin loads and does<br \/>\nnothing \u2014 no telemetry, no usage statistics, no anonymous reports.<\/p>\n<p>The exact data sent per ping:<\/p>\n<ul>\n<li>The per-monitor UUID you configured (path segment).<\/li>\n<li>A short body excerpt \u2014 capped at 10 KB \u2014 containing either an<br \/>\nexception summary (for <code>fail<\/code> pings) or nothing (for <code>start<\/code> \/<br \/>\n  success \/ <code>heartbeat<\/code>).<\/li>\n<li>The plugin \/ SDK version in a <code>User-Agent<\/code> header.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/cronheart.com\/terms\" rel=\"nofollow ugc noopener\" target=\"_blank\">Cronheart.com Terms of Service<\/a> \u00b7<br \/>\n<a href=\"https:\/\/cronheart.com\/privacy\" rel=\"nofollow ugc noopener\" target=\"_blank\">Privacy policy<\/a><\/p>\n<h4>Open source<\/h4>\n<p>Source code and issue tracker:<br \/>\n<a href=\"https:\/\/github.com\/alexander-po\/cronheart-wp\" rel=\"nofollow ugc noopener\" target=\"_blank\">github.com\/alexander-po\/cronheart-wp<\/a>.<\/p>\n<p>The plugin wraps the<br \/>\n<a href=\"https:\/\/github.com\/alexander-po\/cron-monitor-php\" rel=\"nofollow ugc noopener\" target=\"_blank\"><code>cron-monitor\/php-sdk<\/code><\/a><br \/>\nPHP package (also open source, MIT-licensed). Both projects are<br \/>\nmaintained independently.<\/p>","protected":false},"excerpt":{"rendered":"<p>Dead-man-switch monitoring for WP-Cron. Get alerted when scheduled events stop firing \u2014 uptime monitors do not catch this.<\/p>","protected":false},"author":1,"featured_media":9317,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[252],"tags":[1410,2401,2402,1093,555,1412],"class_list":["post-11273","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-trends","tag-cron","tag-deadman-switch","tag-healthcheck","tag-monitoring","tag-wordpress-plugin","tag-wp-cron"],"_links":{"self":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts\/11273","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/comments?post=11273"}],"version-history":[{"count":0,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/posts\/11273\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/media\/9317"}],"wp:attachment":[{"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/media?parent=11273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/categories?post=11273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/aeosub.com\/zh\/wp-json\/wp\/v2\/tags?post=11273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}