=== Image Alt Sync ===
Contributors: dufour_l
Tags: accessibility, images, alt text, seo, batch, wp-cli
Requires at least: 5.4
Tested up to: 6.8
Stable tag: 1.4.11
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Replace <img> tag alt attributes in posts with the alt stored in the media library. Batch processing, date/status filters, ID ranges, skip & exclude options, dry-run logs, and WP-CLI.
A fast admin utility to review posts and **safely synchronize `<img>` alt attributes** in post content with meaningful text (attachment alt, filename, post title, or a custom pattern). Includes batch processing, date/ID filters, dry‑run preview, and detailed logs.

== Description ==
**Image Alt Sync** scans selected posts and updates any `<img>` tags found in the post content that reference media items (class `wp-image-###`), and replaces their `alt` attributes with the attachment’s `_wp_attachment_image_alt` value:
- If the image is in the Media Library, it prefers the attachment’s Alt Text.
- If no attachment alt is set, it falls back to the image filename (without extension) or the post title (configurable in the UI).
- Optionally skip images that aren’t found in the Media Library.
- Optionally restrict by image file extensions (e.g. `jpg,webp`).

Run in **dry run** first to see exactly what would change. The log shows each post processed and any per-image alt changes.

**Highlights**
- Processes **per post** in **batches** with a **customizable delay** (default 100 posts, 1s).
- Filter by **post status** and **date range** (quick buttons: Today, Yesterday, Last week, Last month, YTD, All).
- **Validate** that “Date after” ≤ “Date before”.
- Limit by **Post ID range** with buttons to auto-fill **lowest** and **highest** post IDs.
- **Skip posts without `<img>`** (optional).
- **Exclude image extensions** (comma-separated, e.g. `.svg,.gif`).
- **Dry run** (browser & WP-CLI) shows clickable post IDs, post titles, **filenames**, and detailed **old → new** alt replacements.
- Only processes posts that have at least one **image attachment**.

For more details you can send mail with your suggestions, recommendation to dufour_l@hotmail.com


== Installation ==
1. Download the ZIP and install via **Plugins → Add New → Upload Plugin**.
2. Activate **Image Alt Sync**.
3. Go to **Tools → Image Alt Sync**.

== Usage ==
1. Choose your filters (date range, min/max post ID, or “Apply to all posts”).
2. Set **Batch size** and optional **Delay** between batches to throttle load.
3. Choose a **Date Range**, or click a shortcut button (autofills **Date after**/**Date before**).
4. (Optional) Enter **Lowest/Highest Post ID** or click the quick-fill buttons.
5. (Optional) Check **Skip posts without `<img>`**.
6. (Optional) Enter **Exclude extensions** like `.svg,.gif`.
7. Optionally enable **Dry run** to preview changes without saving.
8. Click **Start**. Progress and detailed per-post changes appear in the log.
9. If needed, click **Stop** to pause after the current batch finishes.

**Tips**
- Use the “Lowest ID” and “Highest ID” buttons to auto-fill the ID range.
- Use the extension filter (e.g. `jpg, jpeg, png, webp`) to target specific image types.
- Check “Skip images not in media library” to avoid external or missing files.

== Usage (WP-CLI) ==
From your WordPress root:

`wp image-alt-sync run --status=publish --after=2025-01-01 --before=2025-08-13 --batch-size=100 --delay=1 --dry-run --low-id=1 --high-id=9999 --skip-noimg=1 --exclude-ext=".svg,.gif"`

**Args**
- `--status=` publish|pending|draft|any (default: publish)
- `--after=` YYYY-MM-DD (optional)
- `--before=` YYYY-MM-DD (optional)
- `--batch-size=` integer (default: 100)
- `--delay=` seconds (float, default: 1)
- `--dry-run` flag (no changes saved if provided)
- `--low-id=` minimum post ID (optional)
- `--high-id=` maximum post ID (optional)
- `--skip-noimg=` 1|0 (default 0)
- `--exclude-ext=` comma-separated list like `.svg,.gif`


== Frequently Asked Questions ==
= Will it update the Media Library alt text? =
No. This tool updates `<img alt="">` **inside post content**. It does not edit attachment fields.

= Does Dry Run modify anything? =
No changes are saved during Dry Run. You’ll only see a preview in the log.

= Which `<img>` tags are updated? =
Tags containing a class `wp-image-###` so we can map to the attachment ID and read its media-library alt text.

= Does it also change the media alt in the library? =
No—this version focuses on replacing `alt` inside post content from the media library value.

= What if an `<img>` has no `alt`? =
The plugin injects `alt="..."` based on the media alt.

== Changelog ==

= 1.4.6 / 1.4.7 / 1.4.8 / 1.4.9 / 1.4.10 / 1.4.11 =
- Fix: Code cleanup

= 1.4.5 =
- Added two new date button ( last 4 weeks, since first of the month )

= 1.4.4 =
- Fix: Code cleanup


= 1.4.2 / 1.4.3 =
- Fix: Copyright sanitization.

= 1.4.1 =
- Fix: Ajax not working.
- Add private to the post status
- Tested in Wordpress 6.8.2

= 1.4 =
- Fix: Eliminated `[object Object]` messages by robust JSON/error-string logging.
- Improvement: Processing now **continues** when a post/batch fails; errors are reported in the log.
- Security: Added nonce checks to all AJAX endpoints.
- DX: Structured JavaScript in a separate file and passed `ajaxurl`/`nonce` via `wp_localize_script`.
- UI: Clearer batch progress messages and safer scrolling of the log.

= 1.3 =
- Restored the v1.1 UI while keeping the v1.2 functionality and enhancements.
- Post ID range quick-fill buttons; dry run shows filenames and detailed changes.
- Maintains batching, delay, status/date filters, and WP-CLI parity.

= 1.2 =
- Replace `alt` inside `<img>` tags using media alt; added ID ranges, skip & exclude options.

= 1.1 =
- Batch processing; status/date filters; dry run logging; WP-CLI support.

== Upgrade Notice ==
= 1.3 =
Same sleek UI as 1.1 with all the newer capabilities from 1.2.

== Credits ==
Crafted with ❤️ for accessible content.
