{"id":231200,"date":"2025-05-04T00:59:56","date_gmt":"2025-05-04T00:59:56","guid":{"rendered":"https:\/\/en-ca.wordpress.org\/plugins\/ghost-update\/"},"modified":"2026-01-27T20:35:17","modified_gmt":"2026-01-27T20:35:17","slug":"ghost-update","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/ghost-update\/","author":15364867,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.2","stable_tag":"1.2.2","tested":"6.9.4","requires":"5.8","requires_php":"7.2","requires_plugins":null,"header_name":"Ghost Update","header_author":"IpodGuy79","header_description":"Keeps your WordPress site fresh by rotating post\/page publish dates & pinging Google Search Console.","assets_banners_color":"4e5573","last_updated":"2026-01-27 20:35:17","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/github.com\/ipodguy79","rating":0,"author_block_rating":0,"active_installs":0,"downloads":528,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"ipodguy79","date":"2025-05-04 00:59:23"},"1.1.0":{"tag":"1.1.0","author":"ipodguy79","date":"2025-11-29 02:22:21"},"1.2.2":{"tag":"1.2.2","author":"ipodguy79","date":"2026-01-27 20:35:17"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3287022,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3287022,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3287022,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3287022,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3287022,"resolution":"1","location":"assets","locale":""}},"screenshots":{"1":"Ghost Update Settings Panel","2":"Google JSON upload section","3":"Force Update and Clear Log buttons","4":"Recrawl log output with 200\/403\/Cooldown results"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[176598,241761,241760,234706,186],"plugin_category":[],"plugin_contributors":[227757],"plugin_business_model":[],"class_list":["post-231200","plugin","type-plugin","status-publish","hentry","plugin_tags-indexing-api","plugin_tags-post-refresh","plugin_tags-recrawl","plugin_tags-scheduled-updates","plugin_tags-seo","plugin_contributors-ipodguy79","plugin_committers-ipodguy79"],"banners":{"banner":"https:\/\/ps.w.org\/ghost-update\/assets\/banner-772x250.png?rev=3287022","banner_2x":"https:\/\/ps.w.org\/ghost-update\/assets\/banner-1544x500.png?rev=3287022","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ghost-update\/assets\/icon-128x128.png?rev=3287022","icon_2x":"https:\/\/ps.w.org\/ghost-update\/assets\/icon-256x256.png?rev=3287022","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ghost-update\/assets\/screenshot-1.png?rev=3287022","caption":"Ghost Update Settings Panel"}],"raw_content":"<!--section=description-->\n<p>Ghost Update is a simple but powerful plugin that makes your WordPress site look alive again by systematically updating post\/page timestamps and alerting Google Search to come check it out.<\/p>\n\n<p>This is perfect for older blogs, abandoned content, or static websites that haven\u2019t changed in a while and are now suffering in search rankings.<\/p>\n\n<p>Ghost Update offers:<\/p>\n\n<ul>\n<li>\u2705 Automatic post\/page timestamp refresh (without touching content)<\/li>\n<li>\u2705 Optional random or sequential update order<\/li>\n<li>\u2705 Force update + recrawl button<\/li>\n<li>\u2705 Manual Google JSON auth upload &amp; secure storage<\/li>\n<li>\u2705 Enforced 10-minute cooldown between Google Indexing API pings (for safety)<\/li>\n<li>\u2705 Simple log viewer + log clearing<\/li>\n<li>\u2705 Cron toggle \u2014 enable\/disable auto mode<\/li>\n<li>\u2705 No product updates, no WooCommerce, no content edits<\/li>\n<\/ul>\n\n<h3>Cron Behavior<\/h3>\n\n<p>GhostUpdate uses WordPress' built-in \"pseudo-cron\" system, which means scheduled tasks only run when someone visits your site. This includes both automatic post updates and Google Search Console pings.\nIf DISABLE_WP_CRON is enabled in wp-config.php, you must run WordPress cron via a real server cron job.<\/p>\n\n<h3>Key Points<\/h3>\n\n<p>\ud83d\udd01 WordPress cron is visitor-based\nNo visitors = no cron runs. It only triggers when a page is loaded by a real user or bot.<\/p>\n\n<p>\ud83d\udd53 Missed runs = delayed schedules\nCron tasks won\u2019t fire in the background unless triggered by activity. This can cause delays in updates on low-traffic sites.<\/p>\n\n<p>\ud83e\udde0 One run = one reschedule\nA cron job must fire before WordPress will schedule the next one. They don\u2019t \u201cqueue up\u201d in advance.<\/p>\n\n<h3>Options for Low-Traffic Sites<\/h3>\n\n<p>\u2705 Keep the plugin\u2019s settings page open in your browser\nThis keeps cron alive by generating regular page loads.<\/p>\n\n<p>\u2705 Use the \u201cForce Update + Recrawl Now\u201d button\nInstant update and ping, no waiting or cooldown.<\/p>\n\n<h3>Reminder<\/h3>\n\n<p>This behavior is core to how WordPress works. GhostUpdate doesn\u2019t change or override it \u2014 it works with it.<\/p>\n\n<h3>External Services<\/h3>\n\n<p>This plugin connects to multiple endpoints from Google\u2019s Indexing API to notify Google that a post or page has been updated. This functionality is required to trigger recrawls in Google's search index.<\/p>\n\n<h3>What data is sent<\/h3>\n\n<p>The plugin sends the URL of the updated post or page to the following Google API endpoints. No personal data is transmitted.<\/p>\n\n<h3>When data is sent<\/h3>\n\n<p>Data is sent only when a post\/page is programmatically republished by the plugin or when triggered manually by the admin.<\/p>\n\n<h3>External domains contacted<\/h3>\n\n<ul>\n<li><code>https:\/\/oauth2.googleapis.com\/token<\/code> \u2014 used to obtain an OAuth 2.0 token with a service account<\/li>\n<li><code>https:\/\/indexing.googleapis.com\/v3\/urlNotifications:publish<\/code> \u2014 used to send the updated URL to Google for recrawling<\/li>\n<li><code>https:\/\/www.googleapis.com\/auth\/indexing<\/code> \u2014 used as the OAuth scope to limit access to Indexing API only<\/li>\n<\/ul>\n\n<h3>Service Provider<\/h3>\n\n<ul>\n<li>Google LLC<\/li>\n<li><a href=\"https:\/\/policies.google.com\/terms\">Terms of Service<\/a><\/li>\n<li><a href=\"https:\/\/policies.google.com\/privacy\">Privacy Policy<\/a><\/li>\n<\/ul>\n\n<p>By using this plugin, you agree to Google's API terms and policies. The authentication is performed using a Google Cloud service account which you manually upload to the plugin.<\/p>\n\n<h3>Notes<\/h3>\n\n<ul>\n<li>Posts\/pages skipped due to cooldown are <strong>still updated<\/strong>, just not pinged.<\/li>\n<li>Google will still crawl updated content eventually even if not directly pinged.<\/li>\n<\/ul>\n\n<h3>License<\/h3>\n\n<p>GPL v2 \u2014 use, modify, share freely.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install via the Plugins &gt; Add New screen<\/li>\n<li>Activate the plugin through the 'Plugins' menu<\/li>\n<li><p>Visit <strong>Settings \u2192 Ghost Update<\/strong> to configure:<\/p>\n\n<ul>\n<li>Upload your Google <code>.json<\/code> service account file<\/li>\n<li>Enable automatic updating<\/li>\n<li>Set your desired interval (in seconds)<\/li>\n<li>Exclude posts\/pages (optional)<\/li>\n<li>View logs of all update and ping activity<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20does%20this%20plugin%20actually%20do%3F\"><h3>What does this plugin actually do?<\/h3><\/dt>\n<dd><p>Ghost Update refreshes your post\/page <code>post_date<\/code> and <code>post_modified<\/code> fields on a schedule (e.g. every 8 hours). Optionally, it will also notify Google using the Indexing API to request a recrawl.<\/p><\/dd>\n<dt id=\"does%20it%20change%20content%3F\"><h3>Does it change content?<\/h3><\/dt>\n<dd><p>No. It does <strong>not<\/strong> alter content, metadata, taxonomy, SEO fields, or anything else. It only updates timestamps and optionally triggers a Google ping.<\/p><\/dd>\n<dt id=\"what%E2%80%99s%20the%20cooldown%20logic%20for%20google%20api%20pings%3F\"><h3>What\u2019s the cooldown logic for Google API pings?<\/h3><\/dt>\n<dd><p>Ghost Update enforces <strong>1 request every 10 minutes<\/strong>. This is to protect your quota and avoid abuse detection.<\/p>\n\n<p>If an update is triggered while in cooldown, the post is still refreshed \u2014 but the Google ping is skipped and logged as:<\/p>\n\n<pre><code>\ud83d\udd12 Cooldown active. Skipping GSC for post ID 1234.\n<\/code><\/pre><\/dd>\n<dt id=\"can%20i%20control%20which%20posts%2Fpages%20get%20updated%3F\"><h3>Can I control which posts\/pages get updated?<\/h3><\/dt>\n<dd><p>Yes \u2014 exclude any number of posts or pages via ID in the plugin settings.<\/p><\/dd>\n<dt id=\"how%20do%20i%20authenticate%20with%20google%3F\"><h3>How do I authenticate with Google?<\/h3><\/dt>\n<dd><ol>\n<li>Create a Google Cloud project<\/li>\n<li>Enable the <strong>Indexing API<\/strong><\/li>\n<li>Create a <strong>service account<\/strong>, and download the <code>.json<\/code> key<\/li>\n<li>Upload it in the plugin settings<\/li>\n<li>Add the <code>client_email<\/code> from the <code>.json<\/code> file as an <strong>Owner<\/strong> in your Google Search Console property<\/li>\n<\/ol><\/dd>\n<dt id=\"how%20do%20i%20add%20the%20service%20account%20as%20an%20owner%20in%20gsc%3F\"><h3>How do I add the service account as an Owner in GSC?<\/h3><\/dt>\n<dd><ol>\n<li>Open your <code>.json<\/code> file and find:\n   \"client_email\": \"your-service-account@project.iam.gserviceaccount.com\"<\/li>\n<li>Go to <strong>Google Search Console \u2192 Settings \u2192 Users and Permissions<\/strong><\/li>\n<li>Click <strong>Add User<\/strong> and paste the service account email<\/li>\n<li>Set permission to <strong>Owner<\/strong><\/li>\n<\/ol><\/dd>\n<dt id=\"google%20gave%20me%20an%20html%20file%20for%20verification%20%E2%80%94%20what%20do%20i%20do%3F\"><h3>Google gave me an HTML file for verification \u2014 what do I do?<\/h3><\/dt>\n<dd><p>You don\u2019t need it.<\/p>\n\n<p>Just uploaded securely via the plugin settings. \nthis will add the file to \"your-site\"\/uploads\/ghostupdate<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<p>Tested and updated to work with wp 6.9<\/p>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Scheduled updates with interval + randomization<\/li>\n<li>Google Indexing API ping integration<\/li>\n<li>Rate-limited GSC API calls (1 per 10 min)<\/li>\n<li>Service account JSON file support<\/li>\n<li>Logging system with viewer + cleaner<\/li>\n<li>Admin UI with force button and exclusion filter<\/li>\n<li>Enable\/Disable toggle for plugin scheduler<\/li>\n<li>Works with pages and posts (not WooCommerce)<\/li>\n<\/ul>","raw_excerpt":"Auto-refresh post\/page, encourage recrawls by refreshing timestamps and optionally notifying Google. Boost SEO visibility without changing your conten &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/231200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=231200"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ipodguy79"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=231200"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=231200"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=231200"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=231200"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=231200"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=231200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}