=== Ghost Update === Contributors: ipodguy79 Tags: SEO, Indexing API, Scheduled Updates, Recrawl, Post Refresh Requires at least: 5.8 Tested up to: 6.9 Requires PHP: 7.2 Stable tag: 1.2.2 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Auto-refresh post/page, encourage recrawls by refreshing timestamps and optionally notifying Google. Boost SEO visibility without changing your content. == Description == 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. This is perfect for older blogs, abandoned content, or static websites that haven’t changed in a while and are now suffering in search rankings. Ghost Update offers: - ✅ Automatic post/page timestamp refresh (without touching content) - ✅ Optional random or sequential update order - ✅ Force update + recrawl button - ✅ Manual Google JSON auth upload & secure storage - ✅ Enforced 10-minute cooldown between Google Indexing API pings (for safety) - ✅ Simple log viewer + log clearing - ✅ Cron toggle — enable/disable auto mode - ✅ No product updates, no WooCommerce, no content edits == Installation == 1. Upload the plugin folder to `/wp-content/plugins/` or install via the Plugins > Add New screen 2. Activate the plugin through the 'Plugins' menu 3. Visit **Settings → Ghost Update** to configure: - Upload your Google `.json` service account file - Enable automatic updating - Set your desired interval (in seconds) - Exclude posts/pages (optional) - View logs of all update and ping activity == Frequently Asked Questions == = What does this plugin actually do? = Ghost Update refreshes your post/page `post_date` and `post_modified` fields on a schedule (e.g. every 8 hours). Optionally, it will also notify Google using the Indexing API to request a recrawl. = Does it change content? = No. It does **not** alter content, metadata, taxonomy, SEO fields, or anything else. It only updates timestamps and optionally triggers a Google ping. = What’s the cooldown logic for Google API pings? = Ghost Update enforces **1 request every 10 minutes**. This is to protect your quota and avoid abuse detection. If an update is triggered while in cooldown, the post is still refreshed — but the Google ping is skipped and logged as: `🔒 Cooldown active. Skipping GSC for post ID 1234.` = Can I control which posts/pages get updated? = Yes — exclude any number of posts or pages via ID in the plugin settings. = How do I authenticate with Google? = 1. Create a Google Cloud project 2. Enable the **Indexing API** 3. Create a **service account**, and download the `.json` key 4. Upload it in the plugin settings 5. Add the `client_email` from the `.json` file as an **Owner** in your Google Search Console property = How do I add the service account as an Owner in GSC? = 1. Open your `.json` file and find: `"client_email": "your-service-account@project.iam.gserviceaccount.com"` 2. Go to **Google Search Console → Settings → Users and Permissions** 3. Click **Add User** and paste the service account email 4. Set permission to **Owner** = Google gave me an HTML file for verification — what do I do? = You don’t need it. Just uploaded securely via the plugin settings. this will add the file to "your-site"/uploads/ghostupdate == Cron Behavior == 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. If DISABLE_WP_CRON is enabled in wp-config.php, you must run WordPress cron via a real server cron job. === Key Points === 🔁 WordPress cron is visitor-based No visitors = no cron runs. It only triggers when a page is loaded by a real user or bot. 🕓 Missed runs = delayed schedules Cron tasks won’t fire in the background unless triggered by activity. This can cause delays in updates on low-traffic sites. 🧠 One run = one reschedule A cron job must fire before WordPress will schedule the next one. They don’t “queue up” in advance. === Options for Low-Traffic Sites === ✅ Keep the plugin’s settings page open in your browser This keeps cron alive by generating regular page loads. ✅ Use the “Force Update + Recrawl Now” button Instant update and ping, no waiting or cooldown. === Reminder === This behavior is core to how WordPress works. GhostUpdate doesn’t change or override it — it works with it. == 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 == Changelog == = 1.1.0 = Tested and updated to work with wp 6.9 = 1.0 = * Initial release * Scheduled updates with interval + randomization * Google Indexing API ping integration * Rate-limited GSC API calls (1 per 10 min) * Service account JSON file support * Logging system with viewer + cleaner * Admin UI with force button and exclusion filter * Enable/Disable toggle for plugin scheduler * Works with pages and posts (not WooCommerce) == External Services == This plugin connects to multiple endpoints from Google’s 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. === What data is sent === The plugin sends the URL of the updated post or page to the following Google API endpoints. No personal data is transmitted. === When data is sent === Data is sent only when a post/page is programmatically republished by the plugin or when triggered manually by the admin. === External domains contacted === - `https://oauth2.googleapis.com/token` — used to obtain an OAuth 2.0 token with a service account - `https://indexing.googleapis.com/v3/urlNotifications:publish` — used to send the updated URL to Google for recrawling - `https://www.googleapis.com/auth/indexing` — used as the OAuth scope to limit access to Indexing API only === Service Provider === - Google LLC - [Terms of Service](https://policies.google.com/terms) - [Privacy Policy](https://policies.google.com/privacy) 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. == Notes == - Posts/pages skipped due to cooldown are **still updated**, just not pinged. - Google will still crawl updated content eventually even if not directly pinged. == License == GPL v2 — use, modify, share freely.