This commit is contained in:
Javier Casares 2026-09-23 06:11:14 +00:00
commit bb3beaa353
12 changed files with 465 additions and 147 deletions

View file

@ -25,6 +25,7 @@ if ( ! defined( 'ABSPATH' ) ) {
* @var array<string, array{installed:bool, active:bool, version:string}> $local
* @var array<string, array<string,mixed>> $manager_subscriptions
* @var list<array{type:string, message:string}> $manager_notices
* @var list<array{slug:string, name:string, installed:string, patch:string}> $manager_security_updates
* @var bool $manager_has_api_key
* @var string $manager_store_url
*/
@ -79,6 +80,25 @@ $compat_warnings = 0;
</div>
<?php endforeach; ?>
<?php foreach ( ( $manager_security_updates ?? array() ) as $manager_security ) : ?>
<div class="notice notice-error">
<p>
<?php
echo wp_kses_post(
sprintf(
/* translators: 1: plugin name, 2: installed version, 3: patch version, 4: update URL. */
__( '<strong>Security update available:</strong> %1$s (v%2$s → v%3$s). <a href="%4$s">Update now</a> — this is a security patch for the version this site runs, not a feature update.', 'robotstxt-manager' ),
esc_html( $manager_security['name'] ),
esc_html( $manager_security['installed'] ),
esc_html( $manager_security['patch'] ),
esc_url( Robotstxt_Manager_Admin::action_url( 'update', $manager_security['slug'] ) )
)
);
?>
</p>
</div>
<?php endforeach; ?>
<?php if ( empty( $manager_has_api_key ) && '' !== ( $manager_store_url ?? '' ) ) : ?>
<div class="notice notice-info">
<p>
@ -217,7 +237,15 @@ $compat_warnings = 0;
$l_version = is_string( $raw_lv ) ? $raw_lv : '';
$update_available = $l_installed && '' !== $remote_v && '' !== $l_version
&& version_compare( $l_version, $remote_v, '<' );
&& version_compare( $l_version, $remote_v, '<' );
// Security patch declared for exactly the installed version:
// the Update action installs the patch, not the mainline.
$security_patch = Robotstxt_Manager_Updater::security_patch_for( $entry, $l_version );
if ( '' !== $security_patch ) {
$update_available = true;
}
$row_class = ( ! $wp_ok || ! $php_ok ) ? ' robotstxt-manager-row--incompatible' : '';
?>
@ -346,6 +374,15 @@ $compat_warnings = 0;
echo '<span class="robotstxt-manager-state robotstxt-manager-state--not-installed">' . esc_html__( 'Not installed', 'robotstxt-manager' ) . '</span>';
} elseif ( ! $l_active ) {
echo '<span class="robotstxt-manager-state robotstxt-manager-state--inactive">' . esc_html__( 'Installed (inactive)', 'robotstxt-manager' ) . '</span>';
} elseif ( '' !== $security_patch ) {
echo '<span class="robotstxt-manager-state robotstxt-manager-state--security">' . esc_html(
sprintf(
/* translators: 1: installed version, 2: security patch version. */
__( 'Security update available (v%1$s → v%2$s)', 'robotstxt-manager' ),
$l_version,
$security_patch
)
) . '</span>';
} elseif ( $update_available ) {
echo '<span class="robotstxt-manager-state robotstxt-manager-state--update">' . esc_html(
sprintf(
@ -433,6 +470,7 @@ $compat_warnings = 0;
.robotstxt-manager-compat--fail { color: #d63638; font-weight: 600; }
.robotstxt-manager-compat-warning { cursor: help; }
.robotstxt-manager-row--incompatible { background-color: #fef7f0 !important; }
.robotstxt-manager-state--security { color: #d63638; font-weight: 600; }
/* Detail rows (always open): muted, attached to the row above. */
.robotstxt-manager-detail-row td { border-top: none !important; padding-top: 0; }