=== Rssemble Cards for RSS Feeds ===
Contributors: masakimori
Tags: rss, feed, grid, ogp, cards
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.0.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Display multiple RSS feeds as OGP image card grids. No external service dependencies.

== Description ==

Rssemble Cards for RSS Feeds fetches multiple RSS feeds and displays them as image card grids using OGP images. It runs entirely on WordPress built-in features (SimplePie, transients, DOMDocument) — no external services required.

Key features:

* Aggregates multiple RSS feeds with URL-based deduplication (newest date wins)
* Automatic OGP image retrieval (priority: media:content → enclosure → og:image → default image)
* Parallel OGP fetching via curl_multi (respects WP proxy settings and SSL verification)
* 8 layout types: grid, list, list_vertical, text, text_line, image_only, carousel, popup_grid
* Responsive layout (3 columns on desktop, 2 on tablet, 1 on mobile — configurable)
* FSE theme color variable support (--wp--preset--color--*) with fallback
* Hover zoom + shadow effect on cards
* Transient-based caching (no WP-Cron required)
* Configurable RSS cache duration (12 hours / 1 day / 1 week / 1 month)
* OGP image URL cached for 1 month (includes negative cache for failed fetches)
* Stale cache fallback when a feed fetch fails
* Admin UI with live preview (desktop / tablet / mobile width switching)
* Compatible with object cache (Redis, Memcached) and Cloudflare

== Installation ==

1. Upload the `rssemble-cards-for-rss-feeds` folder to `/wp-content/plugins/`, or install via **Plugins > Add New > Upload Plugin**.
2. Activate the plugin from the **Plugins** screen.
3. Go to **Settings > Rssemble Cards** and configure your feed URLs.
4. Add the shortcode to any post, page, or widget.

== Usage ==

Basic:

`[rssecafo]`

With parameters:

`[rssecafo columns="4" count="8"]`
`[rssecafo columns="2" count="6" feed="https://example.com/feed"]`
`[rssecafo orderby="random" target="_self"]`

Parameter reference:

* columns    : Number of columns (2 / 3 / 4). Default: admin setting.
* count      : Number of items to display. Default: admin setting.
* feed       : Comma-separated feed URL(s). Default: all registered feeds.
* orderby    : Sort order (date / random). Default: date.
* target     : Link target (_blank / _self). Default: admin setting.
* type       : Display type (grid / list / list_vertical / text / text_line / image_only / carousel / popup_grid).
* date       : Show date (1 / 0). Default: 1.
* site       : Show site name (1 / 0). Default: 0.
* desc       : Show description (1 / 0). Default: 0.
* bold       : Bold title (1 / 0). Default: 0.
* responsive : Responsive columns (1 / 0). Default: 1.
* title_lines: Maximum title lines (1 / 2 / 3). Default: admin setting.
* img        : Override default image URL.

== Frequently Asked Questions ==

= No image is displayed =

If the RSS feed contains no image and the article's og:image cannot be fetched, the default image configured in the admin settings (or the bundled placeholder) is shown.

= How do I clear the cache immediately? =

Go to **Settings > Rssemble Cards** and click **Refresh Now**. This clears the RSS cache; OGP image cache (1-month fixed) is not affected.

= Does it use WP-Cron? =

No. Feeds are fetched on demand when the shortcode runs and the cache is missing or expired.

== Screenshots ==

1. Card grid display on the front end.
2. Admin settings screen.

== Changelog ==

= 1.0.2 =
* Fixed: Admin feed URL input now rejects non-http/https schemes (mirrors the shortcode SSRF guard).
* Fixed: Carousel and popup_grid JavaScript event listeners no longer accumulate on repeated admin preview refreshes (dataset init guard added).
* Fixed: Admin preview carousel/popup now initializes correctly on first load (moved init call into $.ajax callback).
* Fixed: OGP fetcher `to_absolute_url()` now normalizes `../` segments in relative paths without over-popping past the root, preventing malformed image URLs.
* Fixed: popup_grid modal overlay (`position:fixed`) now renders outside the `container-type` wrapper to correctly cover the full viewport.
* Fixed: carousel/popup_grid global event listeners (`window resize`, `document keydown`) are now properly torn down when nodes are removed from the DOM (AbortController + MutationObserver).
* Improved: Responsive layout now uses CSS Container Queries (`@container`) instead of `@media`, so the admin preview device-width switcher correctly triggers layout changes. A `@supports not (container-type: inline-size)` fallback ensures older browsers retain responsive behavior.

= 1.0.1 =
* Fixed: Shortcode name in readme (was `[rss_display]`, now correctly `[rssecafo]`).
* Improved: Admin help text and Usage tab now clarify the difference between admin-panel feed registration and the `feed=` shortcode attribute.
* Code: Removed dead `data-i18n` attributes on child elements inside i18n-translated parents (docs page).
* Code: Admin notice markup refactored to use shared CSS class instead of inline styles.

= 1.0.0 =
* Initial release.

== Upgrade Notice ==

= 1.0.0 =
Initial release.
