v0.4.0
This commit is contained in:
parent
681147e8e3
commit
38fbcf80a5
4 changed files with 97 additions and 10 deletions
|
|
@ -112,6 +112,8 @@ $compat_warnings = 0;
|
||||||
$raw_cost = $entry['price_annual'] ?? 0;
|
$raw_cost = $entry['price_annual'] ?? 0;
|
||||||
$raw_ver = $entry['current_version'] ?? '';
|
$raw_ver = $entry['current_version'] ?? '';
|
||||||
$raw_url = $entry['page_url'] ?? '';
|
$raw_url = $entry['page_url'] ?? '';
|
||||||
|
$raw_home = $entry['homepage'] ?? '';
|
||||||
|
$raw_desc = $entry['description'] ?? '';
|
||||||
$raw_rwp = $entry['requires_wp'] ?? '';
|
$raw_rwp = $entry['requires_wp'] ?? '';
|
||||||
$raw_rphp = $entry['requires_php'] ?? '';
|
$raw_rphp = $entry['requires_php'] ?? '';
|
||||||
|
|
||||||
|
|
@ -121,9 +123,15 @@ $compat_warnings = 0;
|
||||||
$cost = is_numeric( $raw_cost ) ? (float) ( $raw_cost + 0.0 ) : 0.0;
|
$cost = is_numeric( $raw_cost ) ? (float) ( $raw_cost + 0.0 ) : 0.0;
|
||||||
$remote_v = is_string( $raw_ver ) ? $raw_ver : '';
|
$remote_v = is_string( $raw_ver ) ? $raw_ver : '';
|
||||||
$page_url = is_string( $raw_url ) ? $raw_url : '';
|
$page_url = is_string( $raw_url ) ? $raw_url : '';
|
||||||
|
$homepage = is_string( $raw_home ) ? $raw_home : '';
|
||||||
|
$desc = is_string( $raw_desc ) ? trim( $raw_desc ) : '';
|
||||||
$req_wp = is_string( $raw_rwp ) ? $raw_rwp : '';
|
$req_wp = is_string( $raw_rwp ) ? $raw_rwp : '';
|
||||||
$req_php = is_string( $raw_rphp ) ? $raw_rphp : '';
|
$req_php = is_string( $raw_rphp ) ? $raw_rphp : '';
|
||||||
|
|
||||||
|
$website_url = '' !== $page_url ? $page_url : $homepage;
|
||||||
|
$expandable = ( '' !== $desc || '' !== $website_url );
|
||||||
|
$toggle_id = 'robotstxt-manager-toggle-' . esc_attr( $slug );
|
||||||
|
|
||||||
// Compatibility checks.
|
// Compatibility checks.
|
||||||
$wp_ok = '' === $req_wp || version_compare( $local_wp_version, $req_wp, '>=' );
|
$wp_ok = '' === $req_wp || version_compare( $local_wp_version, $req_wp, '>=' );
|
||||||
$php_ok = '' === $req_php || version_compare( $local_php_version, $req_php, '>=' );
|
$php_ok = '' === $req_php || version_compare( $local_php_version, $req_php, '>=' );
|
||||||
|
|
@ -148,7 +156,11 @@ $compat_warnings = 0;
|
||||||
$row_class = ( ! $wp_ok || ! $php_ok ) ? ' robotstxt-manager-row--incompatible' : '';
|
$row_class = ( ! $wp_ok || ! $php_ok ) ? ' robotstxt-manager-row--incompatible' : '';
|
||||||
?>
|
?>
|
||||||
<tr class="<?php echo esc_attr( ltrim( $row_class ) ); ?>">
|
<tr class="<?php echo esc_attr( ltrim( $row_class ) ); ?>">
|
||||||
<td>
|
<td class="robotstxt-manager-name-cell">
|
||||||
|
<?php if ( $expandable ) : ?>
|
||||||
|
<input type="checkbox" class="robotstxt-manager-toggle" id="<?php echo esc_attr( $toggle_id ); ?>" aria-label="<?php esc_attr_e( 'Show more information', 'robotstxt-manager' ); ?>" />
|
||||||
|
<label class="robotstxt-manager-toggle-label" for="<?php echo esc_attr( $toggle_id ); ?>"><span class="robotstxt-manager-toggle-arrow"></span></label>
|
||||||
|
<?php endif; ?>
|
||||||
<strong><?php echo esc_html( $name ); ?></strong>
|
<strong><?php echo esc_html( $name ); ?></strong>
|
||||||
<?php if ( '' !== $remote_v ) : ?>
|
<?php if ( '' !== $remote_v ) : ?>
|
||||||
<br /><span class="description"><?php echo esc_html( sprintf( 'v%s', $remote_v ) ); ?></span>
|
<br /><span class="description"><?php echo esc_html( sprintf( 'v%s', $remote_v ) ); ?></span>
|
||||||
|
|
@ -228,6 +240,18 @@ $compat_warnings = 0;
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<?php if ( $expandable ) : ?>
|
||||||
|
<tr class="robotstxt-manager-detail-row">
|
||||||
|
<td colspan="7">
|
||||||
|
<?php if ( '' !== $desc ) : ?>
|
||||||
|
<p class="robotstxt-manager-detail-description"><?php echo esc_html( $desc ); ?></p>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ( '' !== $website_url ) : ?>
|
||||||
|
<a href="<?php echo esc_url( $website_url ); ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Visit website', 'robotstxt-manager' ); ?> <span class="screen-reader-text"><?php echo esc_html( sprintf( /* translators: %s: plugin name. */ __( '(about %s)', 'robotstxt-manager' ), $name ) ); ?></span></a>
|
||||||
|
<?php endif; ?>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<?php endif; ?>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
@ -265,4 +289,13 @@ $compat_warnings = 0;
|
||||||
.robotstxt-manager-compat--fail { color: #d63638; font-weight: 600; }
|
.robotstxt-manager-compat--fail { color: #d63638; font-weight: 600; }
|
||||||
.robotstxt-manager-compat-warning { cursor: help; }
|
.robotstxt-manager-compat-warning { cursor: help; }
|
||||||
.robotstxt-manager-row--incompatible { background-color: #fef7f0 !important; }
|
.robotstxt-manager-row--incompatible { background-color: #fef7f0 !important; }
|
||||||
|
|
||||||
|
/* Expandable detail rows (CSS-only toggle). */
|
||||||
|
.robotstxt-manager-toggle { display: none; }
|
||||||
|
.robotstxt-manager-toggle-label { cursor: pointer; display: inline-block; width: 1.4em; }
|
||||||
|
.robotstxt-manager-toggle-arrow::before { content: "\25B8"; /* ▸ */ }
|
||||||
|
.robotstxt-manager-detail-row { display: none; }
|
||||||
|
.robotstxt-manager-detail-row td { border-top: none !important; }
|
||||||
|
tr:has(.robotstxt-manager-toggle:checked) + tr.robotstxt-manager-detail-row { display: table-row; }
|
||||||
|
tr:has(.robotstxt-manager-toggle:checked) .robotstxt-manager-toggle-arrow::before { content: "\25BE"; /* ▾ */ }
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,41 @@
|
||||||
== Changelog ==
|
== Changelog ==
|
||||||
|
|
||||||
|
= 0.4.0 =
|
||||||
|
|
||||||
|
_Release date: 2026-08-14_
|
||||||
|
|
||||||
|
**Highlights**
|
||||||
|
|
||||||
|
* Click-to-expand rows in the catalog table: clicking the ▸ next to a plugin's name reveals a detail row with the plugin's description and a link to its website on the store, so users can understand what each plugin does before installing. Pure CSS toggle (`:has()` + hidden checkbox) — no JavaScript, consistent with the classic-flow philosophy.
|
||||||
|
|
||||||
|
**Added**
|
||||||
|
|
||||||
|
* Detail row under each catalog entry, shown when the entry has a description or a website URL (Core 1.4.2+ exposes `description` in the catalog list; entries without either keep a plain, non-expandable row).
|
||||||
|
* "Visit website" link using `page_url` (falling back to `homepage`), opened in a new tab with `rel="noopener noreferrer"`.
|
||||||
|
|
||||||
|
**Changed**
|
||||||
|
|
||||||
|
* Plugin version 0.3.1 → 0.4.0. No database schema changes (no custom tables).
|
||||||
|
|
||||||
|
**Compatibility**
|
||||||
|
|
||||||
|
* WordPress: 7.0 - 7.1 (declared floor of the ecosystem; scan-confirmed lower)
|
||||||
|
* PHP: 8.4 - 8.5 (declared floor of the ecosystem; scan-confirmed lower)
|
||||||
|
|
||||||
= 0.3.1 =
|
= 0.3.1 =
|
||||||
|
|
||||||
_Release date: 2026-08-14_
|
_Release date: 2026-08-14_
|
||||||
|
|
||||||
|
**Changed**
|
||||||
|
|
||||||
* Default store URL is now `https://www.robotstxt.software` (was `https://plugins.robotstxt.es`). Applies to new activations and fresh installs; existing saved URLs are preserved. The catalog API at the new domain is verified live.
|
* Default store URL is now `https://www.robotstxt.software` (was `https://plugins.robotstxt.es`). Applies to new activations and fresh installs; existing saved URLs are preserved. The catalog API at the new domain is verified live.
|
||||||
* Plugin version 0.3.0 → 0.3.1.
|
* Plugin version 0.3.0 → 0.3.1.
|
||||||
|
|
||||||
|
**Compatibility**
|
||||||
|
|
||||||
|
* WordPress: 7.0 - 7.1 (declared floor of the ecosystem; scan-confirmed lower)
|
||||||
|
* PHP: 8.4 - 8.5 (declared floor of the ecosystem; scan-confirmed lower)
|
||||||
|
|
||||||
= 0.3.0 =
|
= 0.3.0 =
|
||||||
|
|
||||||
_Release date: 2026-08-13_
|
_Release date: 2026-08-13_
|
||||||
|
|
|
||||||
39
readme.txt
39
readme.txt
|
|
@ -3,9 +3,9 @@ Contributors: javiercasares, robotstxt
|
||||||
Tags: dashboard, catalog, updates, subscriptions, management
|
Tags: dashboard, catalog, updates, subscriptions, management
|
||||||
Requires at least: 4.7
|
Requires at least: 4.7
|
||||||
Tested up to: 7.1
|
Tested up to: 7.1
|
||||||
Stable tag: 0.3.1
|
Stable tag: 0.4.0
|
||||||
Requires PHP: 7.4
|
Requires PHP: 7.4
|
||||||
Version: 0.3.1
|
Version: 0.4.0
|
||||||
License: GPL-3.0-or-later
|
License: GPL-3.0-or-later
|
||||||
License URI: https://www.gnu.org/licenses/gpl-3.0.txt
|
License URI: https://www.gnu.org/licenses/gpl-3.0.txt
|
||||||
|
|
||||||
|
|
@ -17,12 +17,13 @@ Manager (by ROBOTSTXT) is a WordPress plugin that customers install on **their o
|
||||||
|
|
||||||
* Lists the full plugin catalog with name, type (free/premium), price, and current version.
|
* Lists the full plugin catalog with name, type (free/premium), price, and current version.
|
||||||
* For each catalog entry, shows the **local install state**: not installed, installed (inactive), up to date, or update available.
|
* For each catalog entry, shows the **local install state**: not installed, installed (inactive), up to date, or update available.
|
||||||
* One-click actions (Phase 2+): Install free plugins, Buy paid plugins (redirects to checkout on the store site), trigger native WordPress updates.
|
* Click a plugin's row to expand its description and a link to its website on the store.
|
||||||
|
* One-click actions: Install, Activate, and Update run on a classic page load with a standard admin notice (green/red) reporting the outcome; Buy redirects to checkout on the store site.
|
||||||
* Subscription health dashboard (Phase 4+): license expiring soon, payment failed, expired — surfaced as admin notices so issues are visible before updates silently stop.
|
* Subscription health dashboard (Phase 4+): license expiring soon, payment failed, expired — surfaced as admin notices so issues are visible before updates silently stop.
|
||||||
|
|
||||||
This plugin does **not** re-implement the per-plugin update mechanism. Every ROBOTSTXT plugin bundles its own copy of the `Robotstxt_Core_Plugin_Updater` SDK, so updates keep working even if Manager is deactivated. Manager's value is visibility and one place to click.
|
This plugin does **not** re-implement the per-plugin update mechanism. Every ROBOTSTXT plugin bundles its own copy of the `Robotstxt_Core_Plugin_Updater` SDK, so updates keep working even if Manager is deactivated. Manager's value is visibility and one place to click.
|
||||||
|
|
||||||
**Phase 1 (current):** Read-only catalog view with local install-state resolution. Settings screen with API key (encrypted at rest), store URL, cache TTL, and connection test. Install/Update/Buy buttons are present but disabled pending Phase 2+.
|
**Requires Core 1.4.2+** on the store for descriptions in the catalog list (older Core versions still work; rows simply show no description).
|
||||||
|
|
||||||
== Using the plugin ==
|
== Using the plugin ==
|
||||||
|
|
||||||
|
|
@ -41,13 +42,13 @@ Configure at **ROBOTSTXT → Settings**:
|
||||||
|
|
||||||
| Column | Description |
|
| Column | Description |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Plugin | Name and current version from the store. |
|
| Plugin | Name and current version from the store. Click ▸ to expand the description and website link. |
|
||||||
| Type | Free or Premium. |
|
| Type | Free or Premium. |
|
||||||
| Price | Annual price in EUR, or — for free plugins. |
|
| Price | Annual price in EUR, or — for free plugins. |
|
||||||
| Local state | Not installed / Installed (inactive) / Up to date / Update available (vX → vY). |
|
| Local state | Not installed / Installed (inactive) / Up to date / Update available (vX → vY). |
|
||||||
| Action | Install / Buy / Update (Phase 2+; disabled in Phase 1). |
|
| Action | Install / Activate / Update / Buy, depending on local state. |
|
||||||
|
|
||||||
Click "Refresh catalog" to force a fresh fetch from Core.
|
Click "Refresh catalog" to force a fresh fetch from Core. Install, Activate, and Update run on a classic page load (no JavaScript) and report the result as a standard admin notice.
|
||||||
|
|
||||||
== Extra Configurations ==
|
== Extra Configurations ==
|
||||||
|
|
||||||
|
|
@ -88,6 +89,30 @@ Encrypted at rest using AES-256-CBC with a key derived from your site's WordPres
|
||||||
|
|
||||||
== Changelog ==
|
== Changelog ==
|
||||||
|
|
||||||
|
= 0.4.0 =
|
||||||
|
|
||||||
|
_Release date: 2026-08-14_
|
||||||
|
|
||||||
|
* Click-to-expand rows in the catalog: each plugin's description and a link to its website are shown in a detail row under the plugin name (CSS-only toggle, no JavaScript). Requires Core 1.4.2+ on the store.
|
||||||
|
|
||||||
|
= 0.3.1 =
|
||||||
|
|
||||||
|
_Release date: 2026-08-14_
|
||||||
|
|
||||||
|
* Default store URL is now `https://www.robotstxt.software`. Existing saved URLs are preserved.
|
||||||
|
|
||||||
|
= 0.3.0 =
|
||||||
|
|
||||||
|
_Release date: 2026-08-13_
|
||||||
|
|
||||||
|
* Classic install/activate/update flow: actions run on a full page load (`admin-post.php` with per-action-and-slug nonces) and report the outcome through standard admin notices (green success / red error), replacing the previous AJAX flow.
|
||||||
|
|
||||||
|
= 0.2.0 =
|
||||||
|
|
||||||
|
_Release date: 2026-08-13_
|
||||||
|
|
||||||
|
* Install action: free and premium plugins install directly from the catalog, authenticated with the account-level API key against Core's `/download` endpoint (requires Core 1.4.0+).
|
||||||
|
|
||||||
= 0.1.3 =
|
= 0.1.3 =
|
||||||
|
|
||||||
_Release date: 2026-08-12_
|
_Release date: 2026-08-12_
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
* Plugin Name: Manager (by ROBOTSTXT)
|
* Plugin Name: Manager (by ROBOTSTXT)
|
||||||
* Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-manager
|
* Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-manager
|
||||||
* Description: Client-side dashboard for the ROBOTSTXT plugin ecosystem. Lists the catalog from a remote Plugins Core install, resolves local install/update state, and installs, activates, and updates plugins directly from the store.
|
* Description: Client-side dashboard for the ROBOTSTXT plugin ecosystem. Lists the catalog from a remote Plugins Core install, resolves local install/update state, and installs, activates, and updates plugins directly from the store.
|
||||||
* Version: 0.3.1
|
* Version: 0.4.0
|
||||||
* Requires at least: 4.7
|
* Requires at least: 4.7
|
||||||
* Requires PHP: 7.4
|
* Requires PHP: 7.4
|
||||||
* Author: ROBOTSTXT
|
* Author: ROBOTSTXT
|
||||||
|
|
@ -21,7 +21,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Plugin version. */
|
/** Plugin version. */
|
||||||
define( 'ROBOTSTXT_MANAGER_VERSION', '0.3.1' );
|
define( 'ROBOTSTXT_MANAGER_VERSION', '0.4.0' );
|
||||||
|
|
||||||
/** Absolute path to the plugin directory, with trailing slash. */
|
/** Absolute path to the plugin directory, with trailing slash. */
|
||||||
define( 'ROBOTSTXT_MANAGER_DIR', plugin_dir_path( __FILE__ ) );
|
define( 'ROBOTSTXT_MANAGER_DIR', plugin_dir_path( __FILE__ ) );
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue