=== SheetFusion === Contributors: isomite Tags: google sheets, table, data table, embed, spreadsheet Requires at least: 5.8 Tested up to: 6.9 Requires PHP: 7.4 Stable tag: 2.1.0 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html Display any public Google Sheet as an interactive, sortable, searchable table — no API key required. Zero setup. == Description == SheetFusion turns any publicly published Google Sheet into a fully interactive table on your WordPress site in seconds — no API key, no OAuth, no complicated setup. Publish your sheet, paste the shortcode, done. **No personal visitor data is ever transmitted to external servers.** **Features** * **Client-side search** — full-text search across all columns * **Sortable columns** — click any header to sort * **Pagination** — configurable rows per page * **Export buttons** — CSV, Excel, PDF, and Print * **Column visibility toggle** — let readers show/hide columns * **Server-side filtering** — pre-filter rows by any column value * **Auto-link columns** — automatically turn bare URLs into clickable links in any column you choose * **Row cap** — configurable maximum rows per table prevents memory issues on large sheets * **Four visual themes** — Default, Stripe, Minimal, and Dark * **Transient caching** — reduces Google requests; configurable duration * **Conditional asset loading** — DataTables scripts load only on pages that contain a [sheetfusion] shortcode; zero overhead everywhere else * **Admin dashboard** — save and manage all your sheets with one-click shortcode copying * **Accessible** — semantic HTML, ARIA attributes, keyboard-navigable tables **How it works** SheetFusion fetches your sheet in CSV format via Google's public `gviz/tq` endpoint. No authentication is required as long as the sheet is published to the web. **External Services & Third-Party Libraries** This plugin connects to the following external service: * **Google Sheets** (`docs.google.com`) — your WordPress server fetches the sheet data directly using the Sheet ID you provide. No personal visitor data is sent; only the Sheet ID and tab name are included in the request. Please review [Google's Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms). The following third-party JavaScript and CSS libraries are **bundled locally** within the plugin (no external CDN requests are made to your visitors' browsers): * **DataTables 1.13.8** — [datatables.net](https://datatables.net/license/) — MIT licence * **DataTables Buttons 2.4.2** — MIT licence * **pdfmake 0.2.7** — [pdfmake.org](http://pdfmake.org) — MIT licence * **JSZip 3.10.1** — [stuk.github.io/jszip](https://stuk.github.io/jszip/) — MIT licence **Support** Have a question or found a bug? Post in the Support tab above and we'll get back to you. == Installation == **Via the WordPress plugin installer (recommended)** 1. In your WordPress dashboard go to *Plugins → Add New*. 2. Search for **SheetFusion** and click **Install Now**, then **Activate**. 3. Go to **SheetFusion → My Sheets** in the admin menu and add your first sheet. **Manual installation via FTP** 1. Download the plugin zip and extract it. 2. Upload the `sheetfusion` folder to `/wp-content/plugins/`. 3. Activate SheetFusion via *Plugins → Installed Plugins*. 4. Go to **SheetFusion → My Sheets** in the admin menu and add your first sheet. **Publish your Google Sheet first** In Google Sheets: *File → Share → Publish to the web → select your sheet tab → Publish.* == Frequently Asked Questions == = Where do I find my Sheet ID? = It's the long string in your Google Sheets URL between `/d/` and `/edit`: `https://docs.google.com/spreadsheets/d/{SHEET_ID}/edit` = My sheet is not loading — what should I check? = Make sure the sheet is published to the web (File → Share → Publish to the web). The plugin cannot access private sheets. = Can I display multiple sheets on the same page? = Yes. Each shortcode renders a completely independent table with a unique ID. = How do I filter rows to only show certain data? = Use the `filter_column` and `filter_value` attributes. For example, to show only rows where column 2 contains "London": `[sheetfusion id="..." sheet="Sheet1" filter_column="2" filter_value="London" filter_mode="contains"]` = Can I disable the export buttons? = Yes — set `export=""` to hide all buttons, or pass a specific list: `export="csv,print"`. = How do I change the theme? = Add `theme="dark"` (or `stripe` / `minimal`) to your shortcode. You can also set a site-wide default in SheetFusion → Settings. = How do I make URLs in my sheet clickable? = Use the `link_columns` attribute with a comma-separated list of 1-based column numbers. For example, to auto-link URLs in columns 1 and 3: `[sheetfusion id="..." sheet="Sheet1" link_columns="1,3"]` = My sheet has tens of thousands of rows — will it work? = SheetFusion renders tables in the browser, so very large sheets can affect page performance. A configurable row cap (default 5,000) is applied to prevent memory issues. Increase or decrease it in SheetFusion → Settings. = Can I force a cache refresh? = Yes, but only administrators can do this. Add `refresh="1"` to your shortcode. This bypasses the cache for that render only. = Does this plugin collect or transmit visitor data? = No. SheetFusion does not collect, store, or transmit any personal data about your site's visitors. The only external request it makes is from your server to Google to fetch the sheet content — no visitor IP addresses or identifiers are included. == Screenshots == 1. Front-end table with export and column-visibility buttons — Stripe theme. 2. Admin: My Sheets dashboard with one-click shortcode copy. 3. Admin: Settings page including cache duration and row cap. 4. Admin: Help & Shortcode Reference. == Changelog == = 2.1.0 — 2026-03-01 = * Security: removed `style=` attribute from `wp_kses` allowlist in cell output — eliminates a CSS injection vector from sheet data * Performance: DataTables assets now load conditionally only on pages that contain a [sheetfusion] shortcode (zero overhead on all other pages) * Standards: replaced raw inline `