Compare commits

...
Author SHA1 Message Date
d34408cbd8 v1.1.5 2026-08-24 13:44:58 +00:00
e4518812c3 v1.1.4 2026-08-20 14:31:43 +00:00
22 changed files with 3602 additions and 1105 deletions

View file

@ -1,5 +1,126 @@
== Changelog ==
= 1.1.5 =
_Release date: 2026-08-24_
**Changed**
* Manager (by ROBOTSTXT) detection uses the ecosystem presence constant `ROBOTSTXT_MANAGER_NOTICED` (Manager 1.6.2+) instead of scanning the installed-plugin list on every check; the plugin-list scan is kept as a fallback for older Manager versions and now also matches single-file Manager installs by basename
**Compatibility**
* WordPress: 4.0 - 7.1
* PHP: 5.6 - 8.5
* MariaDB: 10.6+
* Multisite: compatible (Per-site and Global modes)
**Tests**
* PHPUnit: 22 tests, 53 assertions (6 new tests covering both Manager-detection paths: presence constant and plugin-list fallback)
* WordPress Coding Standards, PHPCompatibilityWP (PHP 5.6 - 8.5), and PHPStan level 9: zero errors
* Environment: PHP 8.5.9, MariaDB 11.8.8
= 1.1.4 =
_Release date: 2026-08-20_
**Highlights**
* Security and compatibility review of the whole code base, with static analysis raised to PHPStan level 9
**Added**
* Development: PHPStan (level 9) with the WordPress stubs and the wp-compat rules, PHPUnit with the polyfills, and the missing PHPCS utilities; `bin/preflight.sh` runs every automatable pre-deploy check
* Tests: plugin header test suite (15 tests) verifying the required headers, the readme consistency (Stable tag, Requires at least, Requires PHP, Tested up to, License), the contributor order, the changelog URL, and the absence of the removed self-updater files
**Changed**
* Development: the full code base passes WordPress Coding Standards with zero errors and warnings, PHPStan level 9 with zero errors, and PHPCompatibilityWP for PHP 5.6 - 8.5 with zero errors
* Type safety: every parameter and return type documented (PHP 5.6-compatible phpDoc generics), all input paths narrowed before sanitization, and two always-dead branches removed (the logs list parameters column helper and the caller backtrace object check)
* License header of the main plugin file aligned with readme.txt ("GPL-3.0-or-later")
**Fixed**
* The User-Agent masking keeps the previous value when the regular expression replacement fails instead of returning null
* The Multisite main-site fallback (WordPress 4.8 and older) reads the network's blog_id only when it is set
**Security**
* Full review following OWASP and WordPress Plugin Security guidelines: capabilities, nonces, validation, sanitization, output escaping, database access, and uninstall cleanup re-audited with the new tooling; no vulnerabilities found, and the type hardening above was applied
**Compatibility**
* WordPress: 4.0 - 7.1
* PHP: 5.6 - 8.5
* MariaDB: 10.6+
* Multisite: compatible (Per-site and Global modes)
**Tests**
* WordPress 7.2-alpha-63320, PHP 8.5.9, MariaDB 11.8.8
* Verified live: plugin active on the staging site with no PHP notices, warnings, or deprecated messages
* PHP Coding Standards: 3.13.6
* WordPress Coding Standards: 3.4.1
* PHPCompatibilityWP (PHP 5.6 - 8.5) and wp-since (WordPress 4.0) static reviews for the floor versions
* PHPStan level 9 with the WordPress stubs: zero errors
= 1.1.3 =
_Release date: 2026-08-20_
**Highlights**
* Security and compatibility review of the 1.1.2 settings-save rewrite
**Security**
* Full review of the tab-scoped save handler (per-site and Network Admin) following OWASP and WordPress Plugin Security guidelines: nonce pairing, capability ordering (the capability check precedes every save branch, so site administrators cannot write network options in Global mode), tab whitelisting, hardcoded option names, per-value sanitization, and safe redirects with no open-redirect surface; all areas passed with no findings
**Compatibility**
* WordPress: 4.0 - 7.1
* PHP: 5.6 - 8.5
* MariaDB: 10.6+
* Multisite: compatible (Per-site and Global modes)
**Tests**
* WordPress 7.2-alpha-63320, PHP 8.5.9, MariaDB 11.8.8
* PHP Coding Standards: 3.13.6
* WordPress Coding Standards: 3.4.1
* PHPCompatibilityWP (PHP 5.6 - 8.5) and wp-since (WordPress 4.0) static reviews for the floor versions
= 1.1.2 =
_Release date: 2026-08-18_
**Highlights**
* Cross-tab settings saves fixed on the per-site Settings screen
**Fixed**
* Saving one tab of the per-site Settings screen no longer resets the other tabs: WordPress core sets every unposted option of a settings group to null since WordPress 5.5, so saving any tab was wiping the options of the other tabs back to their defaults (or, for the User-Agent mode, to the legacy pre-0.9 value). Each tab now saves through its own tab-scoped, nonce- and capability-protected handler shared with the Network Admin screen, updating only the options of the tab being saved
**Changed**
* The per-site Settings screen no longer posts through options.php; the Settings API registration of the options was removed along with it (the sanitizers are unchanged and still applied by the save handler)
**Compatibility**
* WordPress: 4.0 - 7.1
* PHP: 5.6 - 8.5
* MariaDB: 10.6+
* Multisite: compatible (Per-site and Global modes)
**Tests**
* WordPress 7.2-alpha-63320, PHP 8.5.9, MariaDB 11.8.8
* Verified live: main tab values survive saves of the Plugins, Logs, and General tabs and vice versa; hidden plugins, retention, and uninstall options each preserved
* PHP Coding Standards: 3.13.6
* WordPress Coding Standards: 3.4.1
= 1.1.1 =
_Release date: 2026-08-18_

View file

@ -17,11 +17,12 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Register hooks.
*
* @return void
*/
public function register() {
add_action( 'admin_menu', array( $this, 'register_menu' ) );
add_action( 'network_admin_menu', array( $this, 'register_network_menu' ) );
add_action( 'admin_init', array( $this, 'register_settings' ) );
add_action( 'admin_init', array( $this, 'handle_actions' ) );
add_action( 'admin_notices', array( $this, 'render_saved_notice' ) );
add_action( 'network_admin_notices', array( $this, 'render_saved_notice' ) );
@ -32,6 +33,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
*
* In global mode the per-site screens are replaced by the
* Network Admin ones.
*
* @return void
*/
public function register_menu() {
if ( Robotstxt_Telemetry_Network::is_global() ) {
@ -47,33 +50,33 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
'dashicons-admin-generic'
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Settings', 'robotstxt-telemetry' ),
__( 'Settings', 'robotstxt-telemetry' ),
'manage_options',
'robotstxt-telemetry',
array( $this, 'render_settings_page' )
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Settings', 'robotstxt-telemetry' ),
__( 'Settings', 'robotstxt-telemetry' ),
'manage_options',
'robotstxt-telemetry',
array( $this, 'render_settings_page' )
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Plugins', 'robotstxt-telemetry' ),
__( 'Plugins', 'robotstxt-telemetry' ),
'manage_options',
'robotstxt-telemetry-plugins',
array( $this, 'render_plugins_page' )
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Plugins', 'robotstxt-telemetry' ),
__( 'Plugins', 'robotstxt-telemetry' ),
'manage_options',
'robotstxt-telemetry-plugins',
array( $this, 'render_plugins_page' )
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Logs', 'robotstxt-telemetry' ),
__( 'Logs', 'robotstxt-telemetry' ),
'manage_options',
'robotstxt-telemetry-logs',
array( $this, 'render_logs_page' )
);
}
add_submenu_page(
'robotstxt-telemetry',
__( 'Logs', 'robotstxt-telemetry' ),
__( 'Logs', 'robotstxt-telemetry' ),
'manage_options',
'robotstxt-telemetry-logs',
array( $this, 'render_logs_page' )
);
}
/**
* Register the Network Admin menus (Multisite only).
@ -81,6 +84,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
* The Network Settings screen always exposes the configuration
* mode; when the network runs in global mode it also hosts the
* shared settings and the central Logs screen.
*
* @return void
*/
public function register_network_menu() {
if ( ! is_multisite() ) {
@ -96,25 +101,25 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
'dashicons-admin-generic'
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Settings', 'robotstxt-telemetry' ),
__( 'Settings', 'robotstxt-telemetry' ),
'manage_network_options',
'robotstxt-telemetry',
array( $this, 'render_network_settings_page' )
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Settings', 'robotstxt-telemetry' ),
__( 'Settings', 'robotstxt-telemetry' ),
'manage_network_options',
'robotstxt-telemetry',
array( $this, 'render_network_settings_page' )
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Plugins', 'robotstxt-telemetry' ),
__( 'Plugins', 'robotstxt-telemetry' ),
'manage_network_options',
'robotstxt-telemetry-plugins',
array( $this, 'render_plugins_page' )
);
add_submenu_page(
'robotstxt-telemetry',
__( 'Plugins', 'robotstxt-telemetry' ),
__( 'Plugins', 'robotstxt-telemetry' ),
'manage_network_options',
'robotstxt-telemetry-plugins',
array( $this, 'render_plugins_page' )
);
if ( Robotstxt_Telemetry_Network::is_global() ) {
if ( Robotstxt_Telemetry_Network::is_global() ) {
add_submenu_page(
'robotstxt-telemetry',
__( 'Logs', 'robotstxt-telemetry' ),
@ -127,31 +132,54 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
}
/**
* Register the plugin settings.
* Save the settings of a single tab (per-site and network screens).
*
* Only the options of the given tab are read from the POST and
* updated, so the other tabs keep their values. WordPress core
* options.php cannot be used for this: it updates every registered
* option of the group, setting the ones missing from the POST to null.
*
* @param string $tab Settings tab: 'main', 'plugins', 'logs', or 'general'.
* @return void
*/
public function register_settings() {
$settings = array(
'robotstxt_telemetry_useragent_url' => array( 'string', 'hash', 'sanitize_useragent_mode' ),
'robotstxt_telemetry_wp_version' => array( 'string', 'actual', 'sanitize_version_mode' ),
'robotstxt_telemetry_mask_locale' => array( 'boolean', false, 'sanitize_checkbox' ),
'robotstxt_telemetry_replace_news_feed' => array( 'boolean', true, 'sanitize_checkbox' ),
'robotstxt_telemetry_replace_events_api' => array( 'boolean', true, 'sanitize_checkbox' ),
'robotstxt_telemetry_disable_browse_happy' => array( 'boolean', true, 'sanitize_checkbox' ),
'robotstxt_telemetry_wp_core_check' => array( 'string', 'safe', 'sanitize_mode' ),
'robotstxt_telemetry_wp_themes_check' => array( 'string', 'safe', 'sanitize_mode' ),
'robotstxt_telemetry_wp_plugins_check' => array( 'string', 'safe', 'sanitize_mode' ),
'robotstxt_telemetry_hidden_plugins' => array( 'array', array(), 'sanitize_hidden_plugins' ),
'robotstxt_telemetry_retention_period' => array( 'string', '12hours', 'sanitize_retention' ),
'robotstxt_telemetry_delete_on_uninstall' => array( 'boolean', false, 'sanitize_checkbox' ),
);
private function save_tab_settings( $tab ) {
// phpcs:disable WordPress.Security.NonceVerification.Missing -- Callers verified the nonce.
if ( 'logs' === $tab ) {
$retention = isset( $_POST['robotstxt_telemetry_retention_period'] ) && is_string( $_POST['robotstxt_telemetry_retention_period'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_retention_period'] ) ) : '12hours';
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_retention_period', $this->sanitize_retention( $retention ) );
} elseif ( 'plugins' === $tab ) {
$hidden = isset( $_POST['robotstxt_telemetry_hidden_plugins'] ) ? array_map(
function ( $value ) {
return is_string( $value ) ? sanitize_text_field( $value ) : '';
},
(array) wp_unslash( $_POST['robotstxt_telemetry_hidden_plugins'] ) // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- Each value is sanitized in the callback above.
) : array();
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_hidden_plugins', $this->sanitize_hidden_plugins( $hidden ) );
} elseif ( 'general' === $tab ) {
$delete = ! empty( $_POST['robotstxt_telemetry_delete_on_uninstall'] );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_delete_on_uninstall', $delete );
} else {
$useragent_mode = isset( $_POST['robotstxt_telemetry_useragent_url'] ) && is_string( $_POST['robotstxt_telemetry_useragent_url'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_useragent_url'] ) ) : 'hash';
$version_mode = isset( $_POST['robotstxt_telemetry_wp_version'] ) && is_string( $_POST['robotstxt_telemetry_wp_version'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_wp_version'] ) ) : 'actual';
$mask_locale = ! empty( $_POST['robotstxt_telemetry_mask_locale'] );
$replace_news = ! empty( $_POST['robotstxt_telemetry_replace_news_feed'] );
$replace_events = ! empty( $_POST['robotstxt_telemetry_replace_events_api'] );
$disable_browse_happy = ! empty( $_POST['robotstxt_telemetry_disable_browse_happy'] );
$core = isset( $_POST['robotstxt_telemetry_wp_core_check'] ) && is_string( $_POST['robotstxt_telemetry_wp_core_check'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_wp_core_check'] ) ) : 'safe';
$themes = isset( $_POST['robotstxt_telemetry_wp_themes_check'] ) && is_string( $_POST['robotstxt_telemetry_wp_themes_check'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_wp_themes_check'] ) ) : 'safe';
$plugins = isset( $_POST['robotstxt_telemetry_wp_plugins_check'] ) && is_string( $_POST['robotstxt_telemetry_wp_plugins_check'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_wp_plugins_check'] ) ) : 'safe';
foreach ( $settings as $name => $config ) {
register_setting(
'robotstxt_telemetry_settings',
$name,
array( $this, $config[2] )
);
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_useragent_url', $this->sanitize_useragent_mode( $useragent_mode ) );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_wp_version', $this->sanitize_version_mode( $version_mode ) );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_mask_locale', $mask_locale );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_replace_news_feed', $replace_news );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_replace_events_api', $replace_events );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_disable_browse_happy', $disable_browse_happy );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_wp_core_check', $this->sanitize_mode( $core ) );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_wp_themes_check', $this->sanitize_mode( $themes ) );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_wp_plugins_check', $this->sanitize_mode( $plugins ) );
}
// phpcs:enable
}
/**
@ -206,7 +234,11 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
$hidden = array();
foreach ( $value as $basename ) {
$basename = sanitize_text_field( (string) $basename );
if ( ! is_string( $basename ) ) {
continue;
}
$basename = sanitize_text_field( $basename );
if ( in_array( $basename, $installed, true ) ) {
$hidden[] = $basename;
@ -230,23 +262,15 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
return in_array( $value, $valid, true ) ? $value : '12hours';
}
/**
* Sanitize a checkbox value.
*
* @param mixed $value Raw input value.
* @return bool
*/
public function sanitize_checkbox( $value ) {
return (bool) $value;
}
/**
* Handle admin actions.
*
* @return void
*/
public function handle_actions() {
// phpcs:disable WordPress.Security.NonceVerification.Recommended -- State changes are protected by check_admin_referer() below.
$page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';
$action = isset( $_REQUEST['action'] ) ? sanitize_key( wp_unslash( $_REQUEST['action'] ) ) : '';
$page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';
$action = isset( $_REQUEST['action'] ) && is_string( $_REQUEST['action'] ) ? sanitize_key( wp_unslash( $_REQUEST['action'] ) ) : '';
// Network-level actions are always restricted to super administrators.
if ( 'save_network_mode' === $action || 'save_network_settings' === $action ) {
@ -270,6 +294,13 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
return;
}
if ( 'save_site_settings' === $action ) {
if ( 'robotstxt-telemetry' === $page ) {
$this->handle_site_settings_save();
}
return;
}
if ( 'robotstxt-telemetry-logs' !== $page ) {
return;
}
@ -295,7 +326,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
return;
}
$log_id = isset( $_GET['log'] ) ? absint( wp_unslash( $_GET['log'] ) ) : 0;
$log_id = isset( $_GET['log'] ) && is_string( $_GET['log'] ) ? absint( wp_unslash( $_GET['log'] ) ) : 0;
// phpcs:enable
if ( 0 === $log_id ) {
return;
@ -321,13 +352,14 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
* Handle Network Admin settings actions.
*
* @param string $action Action name.
* @return void
*/
private function handle_network_actions( $action ) {
if ( 'save_network_mode' === $action ) {
check_admin_referer( 'robotstxt_telemetry_network_mode' );
// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Verified by check_admin_referer() above.
$new_mode = isset( $_POST['robotstxt_telemetry_config_mode'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_config_mode'] ) ) : 'per-site';
$new_mode = isset( $_POST['robotstxt_telemetry_config_mode'] ) && is_string( $_POST['robotstxt_telemetry_config_mode'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_config_mode'] ) ) : 'per-site';
$new_mode = Robotstxt_Telemetry_Network::sanitize_mode( $new_mode );
$old_mode = get_site_option( Robotstxt_Telemetry_Network::MODE_OPTION, 'per-site' );
@ -343,41 +375,11 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
if ( 'save_network_settings' === $action ) {
check_admin_referer( 'robotstxt_telemetry_network_settings' );
// phpcs:disable WordPress.Security.NonceVerification.Missing -- Verified by check_admin_referer() above.
$tab = isset( $_POST['tab'] ) ? sanitize_key( wp_unslash( $_POST['tab'] ) ) : 'main';
// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Verified by check_admin_referer() above.
$tab = isset( $_POST['tab'] ) && is_string( $_POST['tab'] ) ? sanitize_key( wp_unslash( $_POST['tab'] ) ) : 'main';
$tab = in_array( $tab, array( 'main', 'plugins', 'logs', 'general' ), true ) ? $tab : 'main';
if ( 'logs' === $tab ) {
$retention = isset( $_POST['robotstxt_telemetry_retention_period'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_retention_period'] ) ) : '12hours';
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_retention_period', $this->sanitize_retention( $retention ) );
} elseif ( 'plugins' === $tab ) {
$hidden = isset( $_POST['robotstxt_telemetry_hidden_plugins'] ) ? array_map( 'sanitize_text_field', (array) wp_unslash( $_POST['robotstxt_telemetry_hidden_plugins'] ) ) : array();
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_hidden_plugins', $this->sanitize_hidden_plugins( $hidden ) );
} elseif ( 'general' === $tab ) {
$delete = ! empty( $_POST['robotstxt_telemetry_delete_on_uninstall'] );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_delete_on_uninstall', $delete );
} else {
$useragent_mode = isset( $_POST['robotstxt_telemetry_useragent_url'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_useragent_url'] ) ) : 'hash';
$version_mode = isset( $_POST['robotstxt_telemetry_wp_version'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_wp_version'] ) ) : 'actual';
$mask_locale = ! empty( $_POST['robotstxt_telemetry_mask_locale'] );
$replace_news = ! empty( $_POST['robotstxt_telemetry_replace_news_feed'] );
$replace_events = ! empty( $_POST['robotstxt_telemetry_replace_events_api'] );
$disable_browse_happy = ! empty( $_POST['robotstxt_telemetry_disable_browse_happy'] );
$core = isset( $_POST['robotstxt_telemetry_wp_core_check'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_wp_core_check'] ) ) : 'safe';
$themes = isset( $_POST['robotstxt_telemetry_wp_themes_check'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_wp_themes_check'] ) ) : 'safe';
$plugins = isset( $_POST['robotstxt_telemetry_wp_plugins_check'] ) ? sanitize_key( wp_unslash( $_POST['robotstxt_telemetry_wp_plugins_check'] ) ) : 'safe';
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_useragent_url', $this->sanitize_useragent_mode( $useragent_mode ) );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_wp_version', $this->sanitize_version_mode( $version_mode ) );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_mask_locale', $mask_locale );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_replace_news_feed', $replace_news );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_replace_events_api', $replace_events );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_disable_browse_happy', $disable_browse_happy );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_wp_core_check', $this->sanitize_mode( $core ) );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_wp_themes_check', $this->sanitize_mode( $themes ) );
Robotstxt_Telemetry_Network::update_setting( 'robotstxt_telemetry_wp_plugins_check', $this->sanitize_mode( $plugins ) );
}
// phpcs:enable
$this->save_tab_settings( $tab );
$this->redirect_network_settings( 'settings-updated', $tab );
}
@ -388,6 +390,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
*
* @param string $flag Query flag to append.
* @param string $tab Settings tab to return to.
* @return void
*/
private function redirect_network_settings( $flag, $tab = 'main' ) {
wp_safe_redirect(
@ -405,6 +408,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Render the settings saved notice.
*
* @return void
*/
public function render_saved_notice() {
if ( ! current_user_can( Robotstxt_Telemetry_Network::manage_capability() ) ) {
@ -412,9 +417,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
}
// phpcs:disable WordPress.Security.NonceVerification.Recommended -- Read-only rendering of an admin screen.
$settings_updated = isset( $_GET['settings-updated'] ) ? sanitize_key( wp_unslash( $_GET['settings-updated'] ) ) : '';
$mode_updated = isset( $_GET['mode-updated'] ) ? sanitize_key( wp_unslash( $_GET['mode-updated'] ) ) : '';
$page = isset( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';
$settings_updated = isset( $_GET['settings-updated'] ) && is_string( $_GET['settings-updated'] ) ? sanitize_key( wp_unslash( $_GET['settings-updated'] ) ) : '';
$mode_updated = isset( $_GET['mode-updated'] ) && is_string( $_GET['mode-updated'] ) ? sanitize_key( wp_unslash( $_GET['mode-updated'] ) ) : '';
$page = isset( $_GET['page'] ) && is_string( $_GET['page'] ) ? sanitize_key( wp_unslash( $_GET['page'] ) ) : '';
// phpcs:enable
if ( 'robotstxt-telemetry' !== $page ) {
@ -432,6 +437,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Render the Network Admin settings page (Multisite only).
*
* @return void
*/
public function render_network_settings_page() {
if ( ! current_user_can( 'manage_network_options' ) ) {
@ -501,7 +508,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
*/
private function get_current_tab() {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only navigation state.
$tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : 'main';
$tab = isset( $_GET['tab'] ) && is_string( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : 'main';
return in_array( $tab, array( 'main', 'plugins', 'logs', 'general' ), true ) ? $tab : 'main';
}
@ -510,6 +517,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
* Render the settings screen tabs.
*
* @param string $current_tab Current tab slug.
* @return void
*/
private function render_tabs( $current_tab ) {
$tabs = array(
@ -544,6 +552,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Render settings page.
*
* @return void
*/
public function render_settings_page() {
if ( ! current_user_can( Robotstxt_Telemetry_Network::manage_capability() ) ) {
@ -560,8 +570,11 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
$this->render_tabs( $tab );
echo '<form method="post" action="options.php">';
settings_fields( 'robotstxt_telemetry_settings' );
echo '<form method="post" action="">';
wp_nonce_field( 'robotstxt_telemetry_settings' );
echo '<input type="hidden" name="action" value="save_site_settings" />';
echo '<input type="hidden" name="page" value="robotstxt-telemetry" />';
echo '<input type="hidden" name="tab" value="' . esc_attr( $tab ) . '" />';
$this->render_settings_fields( $tab );
@ -578,6 +591,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
* given tab are rendered, so each tab saves independently.
*
* @param string $tab Tab slug: 'main', 'logs', or 'general'.
* @return void
*/
private function render_settings_fields( $tab = 'main' ) {
echo '<table class="form-table" role="presentation">';
@ -585,126 +599,126 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
if ( 'main' === $tab ) {
$url_mode = Robotstxt_Telemetry_Network::get_useragent_url_mode();
$url_mode = Robotstxt_Telemetry_Network::get_useragent_url_mode();
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'Outbound requests', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<fieldset>';
echo '<legend class="screen-reader-text">' . esc_html__( 'Outbound requests', 'robotstxt-telemetry' ) . '</legend>';
echo '<p style="margin: 0;">';
$useragent_options = array(
'url' => __( 'Send your URL', 'robotstxt-telemetry' ),
'hash' => __( 'Send a hash', 'robotstxt-telemetry' ),
'none' => __( 'Do not send anything', 'robotstxt-telemetry' ),
);
foreach ( $useragent_options as $value => $label ) {
echo '<label style="display: block; margin: 0;"><input type="radio" name="robotstxt_telemetry_useragent_url" value="' . esc_attr( $value ) . '" ' . checked( $url_mode, $value, false ) . '/> ' . esc_html( $label ) . '</label>';
}
echo '</p>';
echo '<p class="description">' . esc_html__( 'Outbound requests normally identify this site in the User-Agent with its URL (for example "WordPress/6.9; https://example.com/"). "Send a hash" (default) replaces it with a fixed hash so the site is no longer identifiable; "Do not send anything" removes it completely.', 'robotstxt-telemetry' ) . '</p>';
echo '</fieldset>';
echo '</td>';
echo '</tr>';
$version_mode = Robotstxt_Telemetry_Network::get_wp_version_mode();
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'WordPress version', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<fieldset>';
echo '<legend class="screen-reader-text">' . esc_html__( 'WordPress version', 'robotstxt-telemetry' ) . '</legend>';
echo '<p style="margin: 0;">';
$version_options = array(
'actual' => __( 'Actual version', 'robotstxt-telemetry' ),
'major' => __( 'Major version', 'robotstxt-telemetry' ),
'nulled' => __( 'Nulled version', 'robotstxt-telemetry' ),
);
foreach ( $version_options as $value => $label ) {
echo '<label style="display: block; margin: 0;"><input type="radio" name="robotstxt_telemetry_wp_version" value="' . esc_attr( $value ) . '" ' . checked( $version_mode, $value, false ) . '/> ' . esc_html( $label ) . '</label>';
}
echo '</p>';
echo '<p class="description">' . esc_html__( 'The version reported in the User-Agent and in the WordPress.org version fields: the actual version (default), the major version with the rest masked (for example "7.2.n"), or a nulled version ("0.0.0"). The checksum and translation requests always use the real version so updates keep working.', 'robotstxt-telemetry' ) . '</p>';
echo '</fieldset>';
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'Installation language', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<label for="robotstxt-telemetry-mask-locale">';
echo '<input type="checkbox" id="robotstxt-telemetry-mask-locale" name="robotstxt_telemetry_mask_locale" value="1" ' . checked( (bool) Robotstxt_Telemetry_Network::get_setting( 'robotstxt_telemetry_mask_locale', false ), true, false ) . '/>';
echo '<span>' . esc_html__( 'Send en_US as the language of outbound requests', 'robotstxt-telemetry' ) . '</span>';
echo '</label>';
echo '<p class="description">' . esc_html__( 'When enabled, requests to WordPress.org report English (United States) instead of the installation language. The translation endpoints keep using the real language so installed language packs keep receiving updates.', 'robotstxt-telemetry' ) . '</p>';
echo '</td>';
echo '</tr>';
$dashboard_services = array(
'robotstxt_telemetry_replace_news_feed' => array(
'label' => __( 'Replace the WordPress News feed', 'robotstxt-telemetry' ),
'title' => __( 'Use WordPress Planet by Fair (planet.fair.pm) instead of wordpress.org/news for the Events and News dashboard widget', 'robotstxt-telemetry' ),
),
'robotstxt_telemetry_replace_events_api' => array(
'label' => __( 'Replace the WordPress Events service', 'robotstxt-telemetry' ),
'title' => __( 'Use WordPress Events by The WP World (api.fair.pm) instead of api.wordpress.org/events, sending the same request data', 'robotstxt-telemetry' ),
),
'robotstxt_telemetry_disable_browse_happy' => array(
'label' => __( 'Disable the WordPress browser check', 'robotstxt-telemetry' ),
'title' => __( 'Do not send the browser version to api.wordpress.org/core/browse-happy; the browser is always reported as compatible', 'robotstxt-telemetry' ),
),
);
foreach ( $dashboard_services as $option_name => $service ) {
echo '<tr>';
echo '<th scope="row">' . esc_html( $service['label'] ) . '</th>';
echo '<td>';
echo '<label for="robotstxt-telemetry-' . esc_attr( str_replace( 'robotstxt_telemetry_', '', $option_name ) ) . '">';
echo '<input type="checkbox" id="robotstxt-telemetry-' . esc_attr( str_replace( 'robotstxt_telemetry_', '', $option_name ) ) . '" name="' . esc_attr( $option_name ) . '" value="1" ' . checked( (bool) Robotstxt_Telemetry_Network::get_setting( $option_name, true ), true, false ) . '/>';
echo '<span>' . esc_html( $service['title'] ) . '</span>';
echo '</label>';
echo '</td>';
echo '</tr>';
}
$wp_checks = array(
'robotstxt_telemetry_wp_core_check' => array(
'label' => __( 'WordPress Core version check', 'robotstxt-telemetry' ),
'desc' => __( 'Safe sends only the WordPress version, PHP version, locale, MySQL version, and update channel. Original also sends site counts, database history, PHP extensions, and platform details.', 'robotstxt-telemetry' ),
),
'robotstxt_telemetry_wp_themes_check' => array(
'label' => __( 'WordPress Themes version check', 'robotstxt-telemetry' ),
'desc' => __( 'Safe sends only the theme name, version, update URI, template, and stylesheet, plus the translation revision date and site locale. Original also sends author details and other theme metadata.', 'robotstxt-telemetry' ),
),
'robotstxt_telemetry_wp_plugins_check' => array(
'label' => __( 'WordPress Plugins version check', 'robotstxt-telemetry' ),
'desc' => __( 'Safe sends only the plugin version, update URI, and requirements, plus the translation revision date, locale, and the "all" flag. Original also sends names, descriptions, authors, and other plugin metadata.', 'robotstxt-telemetry' ),
),
);
foreach ( $wp_checks as $option_name => $check ) {
$mode = Robotstxt_Telemetry_Network::get_setting( $option_name, 'safe' );
echo '<tr>';
echo '<th scope="row">' . esc_html( $check['label'] ) . '</th>';
echo '<th scope="row">' . esc_html__( 'Outbound requests', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<fieldset>';
echo '<legend class="screen-reader-text">' . esc_html( $check['label'] ) . '</legend>';
echo '<legend class="screen-reader-text">' . esc_html__( 'Outbound requests', 'robotstxt-telemetry' ) . '</legend>';
echo '<p style="margin: 0;">';
echo '<label><input type="radio" name="' . esc_attr( $option_name ) . '" value="original" ' . checked( $mode, 'original', false ) . '/> ' . esc_html__( 'Original', 'robotstxt-telemetry' ) . '</label>';
echo '&nbsp;&nbsp;';
echo '<label><input type="radio" name="' . esc_attr( $option_name ) . '" value="safe" ' . checked( $mode, 'safe', false ) . '/> ' . esc_html__( 'Safe', 'robotstxt-telemetry' ) . '</label>';
$useragent_options = array(
'url' => __( 'Send your URL', 'robotstxt-telemetry' ),
'hash' => __( 'Send a hash', 'robotstxt-telemetry' ),
'none' => __( 'Do not send anything', 'robotstxt-telemetry' ),
);
foreach ( $useragent_options as $value => $label ) {
echo '<label style="display: block; margin: 0;"><input type="radio" name="robotstxt_telemetry_useragent_url" value="' . esc_attr( $value ) . '" ' . checked( $url_mode, $value, false ) . '/> ' . esc_html( $label ) . '</label>';
}
echo '</p>';
echo '<p class="description">' . esc_html( $check['desc'] ) . '</p>';
echo '<p class="description">' . esc_html__( 'Outbound requests normally identify this site in the User-Agent with its URL (for example "WordPress/6.9; https://example.com/"). "Send a hash" (default) replaces it with a fixed hash so the site is no longer identifiable; "Do not send anything" removes it completely.', 'robotstxt-telemetry' ) . '</p>';
echo '</fieldset>';
echo '</td>';
echo '</tr>';
}
$version_mode = Robotstxt_Telemetry_Network::get_wp_version_mode();
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'WordPress version', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<fieldset>';
echo '<legend class="screen-reader-text">' . esc_html__( 'WordPress version', 'robotstxt-telemetry' ) . '</legend>';
echo '<p style="margin: 0;">';
$version_options = array(
'actual' => __( 'Actual version', 'robotstxt-telemetry' ),
'major' => __( 'Major version', 'robotstxt-telemetry' ),
'nulled' => __( 'Nulled version', 'robotstxt-telemetry' ),
);
foreach ( $version_options as $value => $label ) {
echo '<label style="display: block; margin: 0;"><input type="radio" name="robotstxt_telemetry_wp_version" value="' . esc_attr( $value ) . '" ' . checked( $version_mode, $value, false ) . '/> ' . esc_html( $label ) . '</label>';
}
echo '</p>';
echo '<p class="description">' . esc_html__( 'The version reported in the User-Agent and in the WordPress.org version fields: the actual version (default), the major version with the rest masked (for example "7.2.n"), or a nulled version ("0.0.0"). The checksum and translation requests always use the real version so updates keep working.', 'robotstxt-telemetry' ) . '</p>';
echo '</fieldset>';
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'Installation language', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<label for="robotstxt-telemetry-mask-locale">';
echo '<input type="checkbox" id="robotstxt-telemetry-mask-locale" name="robotstxt_telemetry_mask_locale" value="1" ' . checked( (bool) Robotstxt_Telemetry_Network::get_setting( 'robotstxt_telemetry_mask_locale', false ), true, false ) . '/>';
echo '<span>' . esc_html__( 'Send en_US as the language of outbound requests', 'robotstxt-telemetry' ) . '</span>';
echo '</label>';
echo '<p class="description">' . esc_html__( 'When enabled, requests to WordPress.org report English (United States) instead of the installation language. The translation endpoints keep using the real language so installed language packs keep receiving updates.', 'robotstxt-telemetry' ) . '</p>';
echo '</td>';
echo '</tr>';
$dashboard_services = array(
'robotstxt_telemetry_replace_news_feed' => array(
'label' => __( 'Replace the WordPress News feed', 'robotstxt-telemetry' ),
'title' => __( 'Use WordPress Planet by Fair (planet.fair.pm) instead of wordpress.org/news for the Events and News dashboard widget', 'robotstxt-telemetry' ),
),
'robotstxt_telemetry_replace_events_api' => array(
'label' => __( 'Replace the WordPress Events service', 'robotstxt-telemetry' ),
'title' => __( 'Use WordPress Events by The WP World (api.fair.pm) instead of api.wordpress.org/events, sending the same request data', 'robotstxt-telemetry' ),
),
'robotstxt_telemetry_disable_browse_happy' => array(
'label' => __( 'Disable the WordPress browser check', 'robotstxt-telemetry' ),
'title' => __( 'Do not send the browser version to api.wordpress.org/core/browse-happy; the browser is always reported as compatible', 'robotstxt-telemetry' ),
),
);
foreach ( $dashboard_services as $option_name => $service ) {
echo '<tr>';
echo '<th scope="row">' . esc_html( $service['label'] ) . '</th>';
echo '<td>';
echo '<label for="robotstxt-telemetry-' . esc_attr( str_replace( 'robotstxt_telemetry_', '', $option_name ) ) . '">';
echo '<input type="checkbox" id="robotstxt-telemetry-' . esc_attr( str_replace( 'robotstxt_telemetry_', '', $option_name ) ) . '" name="' . esc_attr( $option_name ) . '" value="1" ' . checked( (bool) Robotstxt_Telemetry_Network::get_setting( $option_name, true ), true, false ) . '/>';
echo '<span>' . esc_html( $service['title'] ) . '</span>';
echo '</label>';
echo '</td>';
echo '</tr>';
}
$wp_checks = array(
'robotstxt_telemetry_wp_core_check' => array(
'label' => __( 'WordPress Core version check', 'robotstxt-telemetry' ),
'desc' => __( 'Safe sends only the WordPress version, PHP version, locale, MySQL version, and update channel. Original also sends site counts, database history, PHP extensions, and platform details.', 'robotstxt-telemetry' ),
),
'robotstxt_telemetry_wp_themes_check' => array(
'label' => __( 'WordPress Themes version check', 'robotstxt-telemetry' ),
'desc' => __( 'Safe sends only the theme name, version, update URI, template, and stylesheet, plus the translation revision date and site locale. Original also sends author details and other theme metadata.', 'robotstxt-telemetry' ),
),
'robotstxt_telemetry_wp_plugins_check' => array(
'label' => __( 'WordPress Plugins version check', 'robotstxt-telemetry' ),
'desc' => __( 'Safe sends only the plugin version, update URI, and requirements, plus the translation revision date, locale, and the "all" flag. Original also sends names, descriptions, authors, and other plugin metadata.', 'robotstxt-telemetry' ),
),
);
foreach ( $wp_checks as $option_name => $check ) {
$mode = Robotstxt_Telemetry_Network::get_setting( $option_name, 'safe' );
echo '<tr>';
echo '<th scope="row">' . esc_html( $check['label'] ) . '</th>';
echo '<td>';
echo '<fieldset>';
echo '<legend class="screen-reader-text">' . esc_html( $check['label'] ) . '</legend>';
echo '<p style="margin: 0;">';
echo '<label><input type="radio" name="' . esc_attr( $option_name ) . '" value="original" ' . checked( $mode, 'original', false ) . '/> ' . esc_html__( 'Original', 'robotstxt-telemetry' ) . '</label>';
echo '&nbsp;&nbsp;';
echo '<label><input type="radio" name="' . esc_attr( $option_name ) . '" value="safe" ' . checked( $mode, 'safe', false ) . '/> ' . esc_html__( 'Safe', 'robotstxt-telemetry' ) . '</label>';
echo '</p>';
echo '<p class="description">' . esc_html( $check['desc'] ) . '</p>';
echo '</fieldset>';
echo '</td>';
echo '</tr>';
}
} // End of the 'main' tab.
if ( 'plugins' === $tab ) {
@ -714,44 +728,44 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
$retention = Robotstxt_Telemetry_Network::get_setting( 'robotstxt_telemetry_retention_period', '12hours' );
if ( 'logs' === $tab ) {
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'Log retention', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<label class="screen-reader-text" for="robotstxt-telemetry-retention">' . esc_html__( 'Log retention', 'robotstxt-telemetry' ) . '</label>';
echo '<select id="robotstxt-telemetry-retention" name="robotstxt_telemetry_retention_period">';
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'Log retention', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<label class="screen-reader-text" for="robotstxt-telemetry-retention">' . esc_html__( 'Log retention', 'robotstxt-telemetry' ) . '</label>';
echo '<select id="robotstxt-telemetry-retention" name="robotstxt_telemetry_retention_period">';
$retention_options = array(
'12hours' => __( '12 hours', 'robotstxt-telemetry' ),
'1day' => __( '1 day', 'robotstxt-telemetry' ),
'3days' => __( '3 days', 'robotstxt-telemetry' ),
);
foreach ( $retention_options as $value => $label ) {
printf(
'<option value="%s" %s>%s</option>',
esc_attr( $value ),
selected( $retention, $value, false ),
esc_html( $label )
$retention_options = array(
'12hours' => __( '12 hours', 'robotstxt-telemetry' ),
'1day' => __( '1 day', 'robotstxt-telemetry' ),
'3days' => __( '3 days', 'robotstxt-telemetry' ),
);
}
echo '</select>';
echo '<p class="description">' . esc_html__( 'Logs older than the selected period are deleted (12 hours by default). A maximum of 1000 entries is always kept; the cleanup runs when browsing the logs and twice a day automatically.', 'robotstxt-telemetry' ) . '</p>';
echo '</td>';
echo '</tr>';
foreach ( $retention_options as $value => $label ) {
printf(
'<option value="%s" %s>%s</option>',
esc_attr( $value ),
selected( $retention, $value, false ),
esc_html( $label )
);
}
echo '</select>';
echo '<p class="description">' . esc_html__( 'Logs older than the selected period are deleted (12 hours by default). A maximum of 1000 entries is always kept; the cleanup runs when browsing the logs and twice a day automatically.', 'robotstxt-telemetry' ) . '</p>';
echo '</td>';
echo '</tr>';
} // End of the 'logs' tab.
if ( 'general' === $tab ) {
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'Uninstall behavior', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<label for="robotstxt-telemetry-delete-on-uninstall">';
echo '<input type="checkbox" id="robotstxt-telemetry-delete-on-uninstall" name="robotstxt_telemetry_delete_on_uninstall" value="1" ' . checked( (bool) Robotstxt_Telemetry_Network::get_setting( 'robotstxt_telemetry_delete_on_uninstall', false ), true, false ) . '/>';
echo '<span>' . esc_html__( 'Delete all telemetry logs and plugin options on uninstall', 'robotstxt-telemetry' ) . '</span>';
echo '</label>';
echo '<p class="description">' . esc_html__( 'By default, all telemetry logs are preserved when the plugin is uninstalled.', 'robotstxt-telemetry' ) . '</p>';
echo '</td>';
echo '</tr>';
echo '<tr>';
echo '<th scope="row">' . esc_html__( 'Uninstall behavior', 'robotstxt-telemetry' ) . '</th>';
echo '<td>';
echo '<label for="robotstxt-telemetry-delete-on-uninstall">';
echo '<input type="checkbox" id="robotstxt-telemetry-delete-on-uninstall" name="robotstxt_telemetry_delete_on_uninstall" value="1" ' . checked( (bool) Robotstxt_Telemetry_Network::get_setting( 'robotstxt_telemetry_delete_on_uninstall', false ), true, false ) . '/>';
echo '<span>' . esc_html__( 'Delete all telemetry logs and plugin options on uninstall', 'robotstxt-telemetry' ) . '</span>';
echo '</label>';
echo '<p class="description">' . esc_html__( 'By default, all telemetry logs are preserved when the plugin is uninstalled.', 'robotstxt-telemetry' ) . '</p>';
echo '</td>';
echo '</tr>';
} // End of the 'general' tab.
echo '</tbody>';
@ -760,6 +774,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Render the Plugins page.
*
* @return void
*/
public function render_plugins_page() {
$capability = Robotstxt_Telemetry_Network::is_global() ? 'manage_network_options' : Robotstxt_Telemetry_Network::manage_capability();
@ -833,8 +849,37 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
<?php
}
/**
* Save the per-site settings screen form.
*
* @return void
*/
private function handle_site_settings_save() {
check_admin_referer( 'robotstxt_telemetry_settings' );
// phpcs:ignore WordPress.Security.NonceVerification.Missing -- Verified by check_admin_referer() above.
$tab = isset( $_POST['tab'] ) && is_string( $_POST['tab'] ) ? sanitize_key( wp_unslash( $_POST['tab'] ) ) : 'main';
$tab = in_array( $tab, array( 'main', 'plugins', 'logs', 'general' ), true ) ? $tab : 'main';
$this->save_tab_settings( $tab );
wp_safe_redirect(
add_query_arg(
array(
'page' => 'robotstxt-telemetry',
'tab' => $tab,
'settings-updated' => 'true',
),
Robotstxt_Telemetry_Network::base_url()
)
);
exit;
}
/**
* Save the per-plugin safe-mode settings.
*
* @return void
*/
private function handle_plugin_modes_save() {
check_admin_referer( 'robotstxt_telemetry_plugin_modes' );
@ -894,6 +939,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
* A widefat table lists every installed plugin with a hide checkbox
* (disabled and checked for this plugin), its status, its name,
* and its version.
*
* @return void
*/
private function render_plugins_tab() {
if ( ! function_exists( 'get_plugins' ) ) {
@ -956,6 +1003,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Render logs page.
*
* @return void
*/
public function render_logs_page() {
$capability = Robotstxt_Telemetry_Network::is_global() ? 'manage_network_options' : Robotstxt_Telemetry_Network::manage_capability();
@ -967,8 +1016,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
require_once ROBOTSTXT_TELEMETRY_PLUGIN_DIR . '/includes/class-robotstxt-telemetry-logs-table.php';
// phpcs:disable WordPress.Security.NonceVerification.Recommended -- Read-only rendering of an admin screen.
$view_action = isset( $_GET['action'] ) ? sanitize_key( wp_unslash( $_GET['action'] ) ) : '';
$log_id = isset( $_GET['log'] ) ? absint( wp_unslash( $_GET['log'] ) ) : 0;
$view_action = isset( $_GET['action'] ) && is_string( $_GET['action'] ) ? sanitize_key( wp_unslash( $_GET['action'] ) ) : '';
$log_id = isset( $_GET['log'] ) && is_string( $_GET['log'] ) ? absint( wp_unslash( $_GET['log'] ) ) : 0;
echo '<div class="wrap">';
echo '<h1>' . esc_html__( 'Telemetry Logs', 'robotstxt-telemetry' ) . '</h1>';
@ -988,7 +1037,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
// Apply the retention policy before listing.
Robotstxt_Telemetry_DB::cleanup();
$deleted_notice = isset( $_GET['deleted'] ) ? sanitize_key( wp_unslash( $_GET['deleted'] ) ) : '';
$deleted_notice = isset( $_GET['deleted'] ) && is_string( $_GET['deleted'] ) ? sanitize_key( wp_unslash( $_GET['deleted'] ) ) : '';
// phpcs:enable
if ( 'all' === $deleted_notice ) {
echo '<div class="notice notice-success is-dismissible"><p>' . esc_html__( 'All log entries deleted.', 'robotstxt-telemetry' ) . '</p></div>';
@ -1021,6 +1070,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Render the delete-all confirmation screen.
*
* @return void
*/
private function render_delete_all_confirm() {
check_admin_referer( 'robotstxt_telemetry_delete_all_confirm' );
@ -1042,6 +1093,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
* Render a single log entry.
*
* @param int $log_id Log ID.
* @return void
*/
private function render_single_log( $log_id ) {
$log = Robotstxt_Telemetry_DB::get_log( $log_id );
@ -1061,7 +1113,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
$this->render_log_row( __( 'Host', 'robotstxt-telemetry' ), $log['host'] );
$this->render_log_row( __( 'Path', 'robotstxt-telemetry' ), $log['path'] );
$this->render_log_row( __( 'Body Params', 'robotstxt-telemetry' ), $this->format_params_field( $log, 'body' ) );
$this->render_log_row( __( 'Headers', 'robotstxt-telemetry' ), $this->format_json_field( $log['headers_json'] ) );
$this->render_log_row( __( 'Headers', 'robotstxt-telemetry' ), $this->format_json_field( is_string( $log['headers_json'] ) ? $log['headers_json'] : null ) );
$this->render_log_row( __( 'User Agent', 'robotstxt-telemetry' ), $log['user_agent'] );
$this->render_log_row( __( 'Raw Body', 'robotstxt-telemetry' ), $log['raw_body'] );
$this->render_log_row( __( 'Caller', 'robotstxt-telemetry' ), $log['caller'] );
@ -1075,7 +1127,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Render telemetry analysis section.
*
* @param array $log Log data.
* @param array<string,mixed> $log Log data.
* @return void
*/
private function render_telemetry_analysis( $log ) {
$sections = Robotstxt_Telemetry_Analysis::build_sections( $log );
@ -1100,12 +1153,13 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
* Render a table row.
*
* @param string $label Label.
* @param string $value Value.
* @param mixed $value Value.
* @return void
*/
private function render_log_row( $label, $value ) {
echo '<tr>';
echo '<th scope="row" style="width: 180px; vertical-align: top;">' . esc_html( $label ) . '</th>';
echo '<td><pre style="white-space: pre-wrap; margin: 0;">' . esc_html( (string) $value ) . '</pre></td>';
echo '<td><pre style="white-space: pre-wrap; margin: 0;">' . esc_html( is_string( $value ) ? $value : '' ) . '</pre></td>';
echo '</tr>';
}
@ -1131,8 +1185,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Admin' ) ) {
/**
* Format query/body params as line-per-parameter output.
*
* @param array $log Log data.
* @param string $type Param source.
* @param array<string,mixed> $log Log data.
* @param string $type Param source.
* @return string
*/
private function format_params_field( $log, $type ) {

View file

@ -18,8 +18,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis_Api_WordPress_Org' ) ) {
/**
* Build analysis sections for api.wordpress.org.
*
* @param array $log Log data.
* @return array
* @param array<string,mixed> $log Log data.
* @return array<string,string>
*/
public static function build_sections( $log ) {
$sections = array();
@ -40,8 +40,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis_Api_WordPress_Org' ) ) {
/**
* Group query parameters.
*
* @param array $params Query parameters.
* @return array
* @param array<int|string,mixed> $params Query parameters.
* @return array<string,string>
*/
private static function group_query_params( $params ) {
$sections = array();
@ -96,8 +96,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis_Api_WordPress_Org' ) ) {
/**
* Group body parameters.
*
* @param array $params Body parameters.
* @return array
* @param array<int|string,mixed> $params Body parameters.
* @return array<string,string>
*/
private static function group_body_params( $params ) {
$sections = array();
@ -114,8 +114,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis_Api_WordPress_Org' ) ) {
}
if ( is_array( $translations ) ) {
$sections[ __( 'Translations', 'robotstxt-telemetry' ) ] = Robotstxt_Telemetry_Analysis::format_params_lines( $translations );
} else {
$sections[ __( 'Translations', 'robotstxt-telemetry' ) ] = Robotstxt_Telemetry_Analysis::format_params_lines( Robotstxt_Telemetry_Analysis::normalize_params( $translations ) );
} elseif ( is_scalar( $translations ) ) {
$sections[ __( 'Translations', 'robotstxt-telemetry' ) ] = (string) $translations;
}
}
@ -130,14 +130,16 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis_Api_WordPress_Org' ) ) {
/**
* Extract bracketed parameters into a nested array.
*
* @param array $params Parameters (will be mutated).
* @param string $prefix Prefix name.
* @return array
* @param array<int|string,mixed> $params Parameters (will be mutated).
* @param string $prefix Prefix name.
* @return array<string,mixed>
*/
private static function pluck_bracketed( &$params, $prefix ) {
$result = array();
foreach ( $params as $key => $value ) {
$key = (string) $key;
if ( 0 !== strpos( $key, $prefix . '[' ) ) {
continue;
}

View file

@ -18,11 +18,11 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis' ) ) {
/**
* Build analysis sections for a log entry.
*
* @param array $log Log data.
* @return array
* @param array<string,mixed> $log Log data.
* @return array<string,string>
*/
public static function build_sections( $log ) {
$host = isset( $log['host'] ) ? strtolower( (string) $log['host'] ) : '';
$host = isset( $log['host'] ) && is_string( $log['host'] ) ? strtolower( $log['host'] ) : '';
if ( 'api.wordpress.org' === $host ) {
return Robotstxt_Telemetry_Analysis_Api_WordPress_Org::build_sections( $log );
@ -34,8 +34,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis' ) ) {
/**
* Build generic analysis sections.
*
* @param array $log Log data.
* @return array
* @param array<string,mixed> $log Log data.
* @return array<string,string>
*/
private static function build_generic_sections( $log ) {
$sections = array();
@ -58,22 +58,25 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis' ) ) {
*
* Prefers the redacted query_json column over re-parsing the raw URL.
*
* @param array $log Log data.
* @return array
* @param array<string,mixed> $log Log data.
* @return array<int|string,mixed>
*/
public static function extract_query_params( $log ) {
if ( empty( $log['url'] ) && empty( $log['query_json'] ) ) {
$url = isset( $log['url'] ) && is_string( $log['url'] ) ? $log['url'] : '';
$query_json = isset( $log['query_json'] ) && is_string( $log['query_json'] ) ? $log['query_json'] : '';
if ( '' === $url && '' === $query_json ) {
return array();
}
if ( ! empty( $log['query_json'] ) ) {
$decoded = json_decode( $log['query_json'], true );
if ( '' !== $query_json ) {
$decoded = json_decode( $query_json, true );
if ( is_array( $decoded ) && ! empty( $decoded ) ) {
return $decoded;
return self::normalize_params( $decoded );
}
}
$parts = explode( '?', (string) $log['url'], 2 );
$parts = explode( '?', $url, 2 );
$query = isset( $parts[1] ) ? $parts[1] : '';
if ( '' === $query ) {
@ -86,14 +89,17 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis' ) ) {
/**
* Extract parameters from the body.
*
* @param array $log Log data.
* @return array
* @param array<string,mixed> $log Log data.
* @return array<int|string,mixed>
*/
public static function extract_body_params( $log ) {
if ( ! empty( $log['body_json'] ) ) {
$decoded = json_decode( $log['body_json'], true );
$body_json = isset( $log['body_json'] ) && is_string( $log['body_json'] ) ? $log['body_json'] : '';
$raw_body = isset( $log['raw_body'] ) && is_string( $log['raw_body'] ) ? $log['raw_body'] : '';
if ( '' !== $body_json ) {
$decoded = json_decode( $body_json, true );
if ( is_array( $decoded ) ) {
return $decoded;
return self::normalize_params( $decoded );
}
if ( is_string( $decoded ) ) {
@ -101,18 +107,34 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis' ) ) {
}
}
if ( ! empty( $log['raw_body'] ) ) {
return self::parse_query_string_flat( $log['raw_body'] );
if ( '' !== $raw_body ) {
return self::parse_query_string_flat( $raw_body );
}
return array();
}
/**
* Normalize a decoded parameter array to integer or string keys.
*
* @param array<mixed,mixed> $params Decoded parameters.
* @return array<int|string,mixed>
*/
public static function normalize_params( array $params ) {
$normalized = array();
foreach ( $params as $key => $value ) {
$normalized[ $key ] = $value;
}
return $normalized;
}
/**
* Parse a query string into a flat key/value array.
*
* @param string $query Query string.
* @return array
* @return array<string,string|array<int,string>>
*/
public static function parse_query_string_flat( $query ) {
$params = array();
@ -149,7 +171,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis' ) ) {
/**
* Format parameters as line-per-entry output.
*
* @param array $params Parameters.
* @param array<int|string,mixed> $params Parameters.
* @return string
*/
public static function format_params_lines( $params ) {
@ -161,7 +183,15 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis' ) ) {
$value = wp_json_encode( $value );
}
$lines[] = sprintf( '%s=%s', $key, $value );
if ( null === $value ) {
$value = '';
} elseif ( is_scalar( $value ) ) {
$value = (string) $value;
}
if ( is_string( $value ) ) {
$lines[] = sprintf( '%s=%s', $key, $value );
}
}
return implode( "\n", $lines );
@ -170,9 +200,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Analysis' ) ) {
/**
* Flatten nested parameters into bracketed keys.
*
* @param array $params Parameters to flatten.
* @param string|null $prefix Current prefix.
* @return array
* @param array<int|string,mixed> $params Parameters to flatten.
* @param string|null $prefix Current prefix.
* @return array<string,mixed>
*/
public static function flatten_params( $params, $prefix = null ) {
$flat = array();

View file

@ -48,6 +48,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_DB' ) ) {
/**
* Activation hook.
*
* @return void
*/
public static function activate() {
self::create_table();
@ -56,6 +58,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_DB' ) ) {
/**
* Ensure the database schema is up to date.
*
* @return void
*/
public static function maybe_upgrade() {
if ( self::$did_check ) {
@ -78,6 +82,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_DB' ) ) {
/**
* Create or update the logs table.
*
* @return void
*/
public static function create_table() {
global $wpdb;
@ -115,7 +121,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_DB' ) ) {
/**
* Insert a log row.
*
* @param array $data Log data.
* @param array<string,mixed> $data Log data.
* @return void
*/
public static function insert_log( array $data ) {
global $wpdb;
@ -144,7 +151,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_DB' ) ) {
* Fetch a single log row.
*
* @param int $log_id Log ID.
* @return array|null
* @return array<string,mixed>|null
*/
public static function get_log( $log_id ) {
global $wpdb;
@ -221,7 +228,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_DB' ) ) {
'3days' => 3 * DAY_IN_SECONDS,
);
if ( isset( $periods[ $retention ] ) ) {
if ( is_string( $retention ) && isset( $periods[ $retention ] ) ) {
$cutoff = gmdate( 'Y-m-d H:i:s', time() - $periods[ $retention ] );
$wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- Delete from the plugin's custom table via the wpdb API.

View file

@ -44,6 +44,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Endpoints' ) ) {
/**
* Register hooks.
*
* @return void
*/
public function register() {
add_filter( 'pre_http_request', array( $this, 'intercept' ), 10, 3 );
@ -52,10 +54,10 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Endpoints' ) ) {
/**
* Intercept outbound WordPress.org requests.
*
* @param false|array|WP_Error $preempt Short-circuit value from other filters.
* @param array $args HTTP request arguments.
* @param string $url Request URL.
* @return false|array|WP_Error
* @param false|array<string,mixed>|WP_Error $preempt Short-circuit value from other filters.
* @param array{body?:string|array<mixed,mixed>,headers?:string|array<mixed,mixed>} $args HTTP request arguments.
* @param string $url Request URL.
* @return false|array<string,mixed>|WP_Error
*/
public function intercept( $preempt, $args, $url ) {
if ( false !== $preempt ) {
@ -112,20 +114,20 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Endpoints' ) ) {
* Build a successful Browse Happy response marking the browser
* as up to date and secure, so no browser nag is shown.
*
* @return array
* @return array<string,mixed>
*/
private function mock_browse_happy_response() {
$body = wp_json_encode(
array(
'platform' => 'other',
'name' => 'Browser',
'version' => '1.0',
'platform' => 'other',
'name' => 'Browser',
'version' => '1.0',
'current_version' => '1.0',
'upgrade' => false,
'insecure' => false,
'update_url' => '',
'img_src' => '',
'img_src_ssl' => '',
'upgrade' => false,
'insecure' => false,
'update_url' => '',
'img_src' => '',
'img_src_ssl' => '',
)
);

View file

@ -38,6 +38,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
/**
* Register hooks.
*
* @return void
*/
public function register() {
add_filter( 'http_request_args', array( $this, 'capture_request' ), 10, 2 );
@ -46,12 +48,12 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
/**
* Capture outbound request arguments.
*
* @param array $args HTTP request arguments.
* @param string $url Request URL.
* @return array
* @param array<string,mixed> $args HTTP request arguments.
* @param string $url Request URL.
* @return array<string,mixed>
*/
public function capture_request( $args, $url ) {
if ( empty( $url ) || ! is_array( $args ) ) {
if ( empty( $url ) ) {
return $args;
}
@ -72,21 +74,25 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
/**
* Prepare log data for storage.
*
* @param array $args Request args.
* @param string $url Request URL.
* @return array
* @param array<string,mixed> $args Request args.
* @param string $url Request URL.
* @return array<string,mixed>
*/
private function prepare_log_data( $args, $url ) {
$method = isset( $args['method'] ) ? strtoupper( sanitize_text_field( (string) $args['method'] ) ) : 'GET';
$method = isset( $args['method'] ) && is_string( $args['method'] ) ? strtoupper( sanitize_text_field( $args['method'] ) ) : 'GET';
$url = esc_url_raw( $url );
$parsed_url = wp_parse_url( $url );
$host = isset( $parsed_url['host'] ) ? sanitize_text_field( $parsed_url['host'] ) : '';
$path = isset( $parsed_url['path'] ) ? sanitize_text_field( $parsed_url['path'] ) : '';
if ( ! is_array( $parsed_url ) ) {
$parsed_url = array();
}
$host = isset( $parsed_url['host'] ) ? sanitize_text_field( $parsed_url['host'] ) : '';
$path = isset( $parsed_url['path'] ) ? sanitize_text_field( $parsed_url['path'] ) : '';
$query_params = array();
if ( ! empty( $parsed_url['query'] ) ) {
$query_params = wp_parse_args( $parsed_url['query'] );
$query_params = $this->normalize_keys( wp_parse_args( $parsed_url['query'] ) );
}
$query_params = $this->redact_array( $query_params );
@ -110,7 +116,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
if ( isset( $args['body'] ) ) {
$body_data = $args['body'];
if ( is_array( $body_data ) ) {
$redacted_body = $this->redact_array( $body_data );
$redacted_body = $this->redact_array( $this->normalize_keys( $body_data ) );
$body_json = $this->encode_json_limited( $redacted_body, $this->max_json_bytes );
if ( empty( $body_json ) ) {
@ -147,11 +153,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
// phpcs:ignore WordPress.PHP.DevelopmentFunctions -- Needed for caller context logging.
$caller = wp_debug_backtrace_summary( null, 0, false );
if ( is_array( $caller ) || is_object( $caller ) ) {
$caller = wp_json_encode( $caller );
}
$caller = $this->truncate_string( (string) $caller, $this->max_caller_bytes );
$caller = wp_json_encode( $caller );
$caller = $this->truncate_string( is_string( $caller ) ? $caller : '', $this->max_caller_bytes );
return array(
'created_at' => current_time( 'mysql', true ),
@ -172,30 +175,31 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
/**
* Rebuild a URL with a redacted query string and without credentials.
*
* @param array $parts URL parts from wp_parse_url().
* @param string $query Redacted query string.
* @param array<string,mixed> $parts URL parts from wp_parse_url().
* @param string $query Redacted query string.
* @return string
*/
private function build_redacted_url( $parts, $query ) {
$url = '';
$scheme = isset( $parts['scheme'] ) && is_string( $parts['scheme'] ) ? $parts['scheme'] : '';
$host = isset( $parts['host'] ) && is_string( $parts['host'] ) ? $parts['host'] : '';
if ( ! empty( $parts['scheme'] ) && ! empty( $parts['host'] ) ) {
$url = $parts['scheme'] . '://' . $parts['host'];
} else {
if ( '' === $scheme || '' === $host ) {
return '';
}
if ( ! empty( $parts['port'] ) ) {
$url .= ':' . (int) $parts['port'];
$url = $scheme . '://' . $host;
if ( isset( $parts['port'] ) && is_int( $parts['port'] ) ) {
$url .= ':' . $parts['port'];
}
$url .= isset( $parts['path'] ) ? $parts['path'] : '';
$url .= isset( $parts['path'] ) && is_string( $parts['path'] ) ? $parts['path'] : '';
if ( '' !== $query ) {
$url .= '?' . $query;
}
if ( ! empty( $parts['fragment'] ) ) {
if ( isset( $parts['fragment'] ) && is_string( $parts['fragment'] ) ) {
$url .= '#' . $parts['fragment'];
}
@ -206,7 +210,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
* Normalize request headers into a simple array.
*
* @param mixed $headers Headers value.
* @return array
* @return array<string,mixed>
*/
private function normalize_headers( $headers ) {
if ( is_object( $headers ) && method_exists( $headers, 'getAll' ) ) {
@ -230,20 +234,24 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
/**
* Extract the user agent from request args.
*
* @param array $args Request args.
* @param array<string,mixed> $args Request args.
* @return string|null
*/
private function extract_user_agent( $args ) {
$user_agent = '';
if ( isset( $args['user-agent'] ) ) {
$user_agent = (string) $args['user-agent'];
} elseif ( isset( $args['user_agent'] ) ) {
$user_agent = (string) $args['user_agent'];
} elseif ( isset( $args['headers']['user-agent'] ) ) {
$user_agent = (string) $args['headers']['user-agent'];
} elseif ( isset( $args['headers']['User-Agent'] ) ) {
$user_agent = (string) $args['headers']['User-Agent'];
if ( isset( $args['user-agent'] ) && is_string( $args['user-agent'] ) ) {
$user_agent = $args['user-agent'];
} elseif ( isset( $args['user_agent'] ) && is_string( $args['user_agent'] ) ) {
$user_agent = $args['user_agent'];
} elseif ( isset( $args['headers'] ) && is_array( $args['headers'] ) ) {
$headers = $args['headers'];
if ( isset( $headers['user-agent'] ) && is_string( $headers['user-agent'] ) ) {
$user_agent = $headers['user-agent'];
} elseif ( isset( $headers['User-Agent'] ) && is_string( $headers['User-Agent'] ) ) {
$user_agent = $headers['User-Agent'];
}
}
if ( '' === $user_agent ) {
@ -257,33 +265,49 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
* Parse body strings into arrays when possible.
*
* @param string $body Raw body.
* @return array|null
* @return array<int|string,mixed>|null
*/
private function parse_body_string( $body ) {
$decoded = json_decode( $body, true );
if ( is_array( $decoded ) ) {
return $decoded;
return $this->normalize_keys( $decoded );
}
$parsed = wp_parse_args( $body );
if ( ! empty( $parsed ) ) {
return $parsed;
return $this->normalize_keys( $parsed );
}
return null;
}
/**
* Normalize an array to integer or string keys.
*
* @param array<mixed,mixed> $data Input array.
* @return array<int|string,mixed>
*/
private function normalize_keys( array $data ) {
$normalized = array();
foreach ( $data as $key => $value ) {
$normalized[ $key ] = $value;
}
return $normalized;
}
/**
* Redact sensitive keys in arrays.
*
* @param array $data Data to sanitize.
* @return array
* @param array<int|string,mixed> $data Data to sanitize.
* @return array<int|string,mixed>
*/
private function redact_array( $data ) {
$redacted = array();
foreach ( $data as $key => $value ) {
$normalized_key = is_string( $key ) ? strtolower( $key ) : (string) $key;
$normalized_key = strtolower( (string) $key );
if ( $this->is_sensitive_key( $normalized_key ) ) {
$redacted[ $key ] = '[redacted]';
@ -348,14 +372,16 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
return $value;
}
return sanitize_text_field( wp_json_encode( $value ) );
$encoded = wp_json_encode( $value );
return false === $encoded ? '' : sanitize_text_field( $encoded );
}
/**
* Encode JSON with size limits.
*
* @param array $data Data to encode.
* @param int $limit Max size in bytes.
* @param array<int|string,mixed> $data Data to encode.
* @param int $limit Max size in bytes.
* @return string|null
*/
private function encode_json_limited( $data, $limit ) {
@ -375,9 +401,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logger' ) ) {
/**
* Truncate array values to keep payloads manageable.
*
* @param array $data Data to trim.
* @param int $max_len Max length per string value.
* @return array
* @param array<int|string,mixed> $data Data to trim.
* @param int $max_len Max length per string value.
* @return array<int|string,mixed>
*/
private function truncate_array_values( $data, $max_len ) {
$trimmed = array();

View file

@ -42,7 +42,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logs_Table' ) ) {
/**
* Get columns.
*
* @return array
* @return array<string,string>
*/
public function get_columns() {
return array(
@ -55,6 +55,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logs_Table' ) ) {
/**
* Prepare items for display.
*
* @return void
*/
public function prepare_items() {
global $wpdb;
@ -119,18 +121,19 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logs_Table' ) ) {
/**
* Render default column output.
*
* @param array $item Column data.
* @param string $column_name Column name.
* @param array<string,mixed> $item Column data.
* @param string $column_name Column name.
* @return string
*/
public function column_default( $item, $column_name ) {
switch ( $column_name ) {
case 'created_at':
return esc_html( isset( $item[ $column_name ] ) ? $item[ $column_name ] : '' );
case 'method':
case 'host':
case 'path':
return esc_html( isset( $item[ $column_name ] ) ? $item[ $column_name ] : '' );
$value = isset( $item[ $column_name ] ) && is_string( $item[ $column_name ] ) ? $item[ $column_name ] : '';
return esc_html( $value );
default:
return '';
}
@ -139,11 +142,11 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logs_Table' ) ) {
/**
* Add row actions.
*
* @param array $item Item data.
* @param array<string,mixed> $item Item data.
* @return string
*/
public function column_created_at( $item ) {
$log_id = (int) $item['id'];
$log_id = isset( $item['id'] ) && is_numeric( $item['id'] ) ? (int) $item['id'] : 0;
$view_url = add_query_arg(
array(
@ -171,23 +174,27 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logs_Table' ) ) {
'delete' => '<a href="' . esc_url( $delete_url ) . '">' . esc_html__( 'Delete', 'robotstxt-telemetry' ) . '</a>',
);
return esc_html( $item['created_at'] ) . $this->row_actions( $actions );
$created_at = isset( $item['created_at'] ) && is_string( $item['created_at'] ) ? $item['created_at'] : '';
return esc_html( $created_at ) . $this->row_actions( $actions );
}
/**
* Render the URL column without query parameters.
*
* @param array $item Item data.
* @param array<string,mixed> $item Item data.
* @return string
*/
public function column_url( $item ) {
if ( empty( $item['url'] ) ) {
$url = isset( $item['url'] ) && is_string( $item['url'] ) ? $item['url'] : '';
if ( '' === $url ) {
return '';
}
$parsed_url = wp_parse_url( $item['url'] );
if ( empty( $parsed_url ) || empty( $parsed_url['host'] ) ) {
return esc_html( $item['url'] );
$parsed_url = wp_parse_url( $url );
if ( ! is_array( $parsed_url ) || empty( $parsed_url['host'] ) ) {
return esc_html( $url );
}
$scheme = isset( $parsed_url['scheme'] ) ? $parsed_url['scheme'] : 'https';
@ -198,91 +205,11 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logs_Table' ) ) {
return esc_html( $base );
}
/**
* Format parameters column output.
*
* @param array $item Item data.
* @return string
*/
private function format_params_column( $item ) {
$params = array();
if ( ! empty( $item['url'] ) ) {
$parsed_url = wp_parse_url( $item['url'] );
if ( ! empty( $parsed_url['query'] ) ) {
$fallback_query = wp_parse_args( $parsed_url['query'] );
$params = array_merge( $params, $fallback_query );
}
}
$query_params = $this->decode_json_params( isset( $item['query_json'] ) ? $item['query_json'] : '' );
if ( ! empty( $query_params ) ) {
$params = array_merge( $params, $query_params );
}
$body_params = $this->decode_json_params( isset( $item['body_json'] ) ? $item['body_json'] : '' );
if ( ! empty( $body_params ) ) {
$params = array_merge( $params, $body_params );
}
if ( empty( $body_params ) && ! empty( $item['raw_body'] ) ) {
$fallback_body = wp_parse_args( $item['raw_body'] );
if ( ! empty( $fallback_body ) ) {
$params = array_merge( $params, $fallback_body );
}
}
if ( empty( $params ) ) {
return '';
}
$lines = array();
foreach ( $params as $key => $value ) {
if ( is_array( $value ) ) {
$value = wp_json_encode( $value );
}
$lines[] = sprintf( '%s=%s', $key, $value );
}
return '<pre style="white-space: pre-wrap; margin: 0;">' . esc_html( implode( "\n", $lines ) ) . '</pre>';
}
/**
* Decode JSON parameters into arrays.
*
* @param string $value JSON string.
* @return array
*/
private function decode_json_params( $value ) {
if ( empty( $value ) ) {
return array();
}
$decoded = json_decode( $value, true );
if ( is_array( $decoded ) ) {
return $decoded;
}
if ( is_string( $decoded ) ) {
$parsed = wp_parse_args( $decoded );
if ( ! empty( $parsed ) ) {
return $parsed;
}
}
$parsed = wp_parse_args( $value );
if ( ! empty( $parsed ) ) {
return $parsed;
}
return array();
}
/**
* Extra controls for filtering.
*
* @param string $which Top or bottom.
* @return void
*/
public function extra_tablenav( $which ) {
if ( 'top' !== $which ) {
@ -344,7 +271,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Logs_Table' ) ) {
*/
private function get_filter_value( $key ) {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only list filters.
if ( ! isset( $_GET[ $key ] ) ) {
if ( ! isset( $_GET[ $key ] ) || ! is_string( $_GET[ $key ] ) ) {
return '';
}

View file

@ -18,13 +18,6 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Manager_Notice' ) ) {
*/
class Robotstxt_Telemetry_Manager_Notice {
/**
* Manager plugin basename.
*
* @var string
*/
const MANAGER_PLUGIN_BASENAME = 'robotstxt-manager/robotstxt-manager.php';
/**
* User meta key storing the dismissal state.
*
@ -34,6 +27,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Manager_Notice' ) ) {
/**
* Register hooks.
*
* @return void
*/
public function register() {
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
@ -43,21 +38,41 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Manager_Notice' ) ) {
}
/**
* Whether the Manager (by ROBOTSTXT) plugin is active.
* Returns whether Manager (by ROBOTSTXT) is installed and active.
*
* @return bool
* Uses the ecosystem presence constant (Manager 1.6.2+) and falls back
* to a plugin-list scan for older Manager versions.
*
* @return bool True when Manager is present and activated.
*/
public static function is_manager_active() {
if ( ! function_exists( 'is_plugin_active' ) ) {
if ( defined( 'ROBOTSTXT_MANAGER_NOTICED' ) && ROBOTSTXT_MANAGER_NOTICED ) {
return true;
}
if ( ! function_exists( 'get_plugins' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
return is_plugin_active( self::MANAGER_PLUGIN_BASENAME )
|| is_plugin_active_for_network( self::MANAGER_PLUGIN_BASENAME );
foreach ( get_plugins() as $file => $data ) {
$slug = dirname( $file );
if ( '.' === $slug ) {
$slug = basename( $file, '.php' );
}
if ( 'robotstxt-manager' === $slug ) {
return is_plugin_active( $file );
}
}
return false;
}
/**
* Enqueue the inline dismissal script on the plugins list screen.
*
* @return void
*/
public function enqueue_scripts() {
if ( ! $this->should_show_notice() ) {
@ -93,6 +108,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Manager_Notice' ) ) {
/**
* Render the dismissible notice on the plugins list screen.
*
* @return void
*/
public function render_plugins_page_notice() {
if ( ! $this->should_show_notice() ) {
@ -104,6 +121,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Manager_Notice' ) ) {
/**
* Render a permanent notice for the settings screen.
*
* @return void
*/
public function render_settings_notice() {
$this->render_notice( 'notice-info', '' );
@ -114,6 +133,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Manager_Notice' ) ) {
*
* @param string $classes Extra CSS classes.
* @param string $id Optional DOM id for the notice container.
* @return void
*/
private function render_notice( $classes, $id ) {
if ( self::is_manager_active() ) {
@ -159,6 +179,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Manager_Notice' ) ) {
/**
* Persist the notice dismissal for the current user.
*
* @return void
*/
public function handle_dismiss() {
check_ajax_referer( 'robotstxt_telemetry_manager_notice' );

View file

@ -33,22 +33,22 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Network' ) ) {
/**
* Plugin settings and their defaults.
*
* @var array
* @var array<string,mixed>
*/
const SETTINGS = array(
'robotstxt_telemetry_useragent_url' => 'hash',
'robotstxt_telemetry_wp_version' => 'actual',
'robotstxt_telemetry_mask_locale' => false,
'robotstxt_telemetry_replace_news_feed' => true,
'robotstxt_telemetry_replace_events_api' => true,
'robotstxt_telemetry_disable_browse_happy' => true,
'robotstxt_telemetry_wp_core_check' => 'safe',
'robotstxt_telemetry_wp_themes_check' => 'safe',
'robotstxt_telemetry_wp_plugins_check' => 'safe',
'robotstxt_telemetry_hidden_plugins' => array(),
'robotstxt_telemetry_plugin_modes' => array(),
'robotstxt_telemetry_retention_period' => '12hours',
'robotstxt_telemetry_delete_on_uninstall' => false,
'robotstxt_telemetry_useragent_url' => 'hash',
'robotstxt_telemetry_wp_version' => 'actual',
'robotstxt_telemetry_mask_locale' => false,
'robotstxt_telemetry_replace_news_feed' => true,
'robotstxt_telemetry_replace_events_api' => true,
'robotstxt_telemetry_disable_browse_happy' => true,
'robotstxt_telemetry_wp_core_check' => 'safe',
'robotstxt_telemetry_wp_themes_check' => 'safe',
'robotstxt_telemetry_wp_plugins_check' => 'safe',
'robotstxt_telemetry_hidden_plugins' => array(),
'robotstxt_telemetry_plugin_modes' => array(),
'robotstxt_telemetry_retention_period' => '12hours',
'robotstxt_telemetry_delete_on_uninstall' => false,
);
/**
@ -134,6 +134,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Network' ) ) {
/**
* The main site ID of the current network.
*
* On WordPress 4.8 and older the current network object exposes the
* main site ID through its magic "blog_id" property.
*
* @return int
*/
public static function main_site_id() {
@ -143,7 +146,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Network' ) ) {
$current_site = get_current_site();
return max( 1, (int) $current_site->blog_id );
$blog_id = isset( $current_site->blog_id ) ? (int) $current_site->blog_id : 0;
return max( 1, $blog_id );
}
/**
@ -194,10 +199,15 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Network' ) ) {
* @return string[]
*/
public static function get_hidden_plugins() {
$hidden = self::get_setting( 'robotstxt_telemetry_hidden_plugins', array() );
$stored = self::get_setting( 'robotstxt_telemetry_hidden_plugins', array() );
$hidden = array();
if ( ! is_array( $hidden ) ) {
$hidden = array();
if ( is_array( $stored ) ) {
foreach ( $stored as $basename ) {
if ( is_string( $basename ) ) {
$hidden[] = $basename;
}
}
}
$hidden[] = 'robotstxt-telemetry/robotstxt-telemetry.php';
@ -208,12 +218,24 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Network' ) ) {
/**
* Get the per-plugin safe-mode map (slug => safe|original).
*
* @return array
* @return array<string,string>
*/
public static function get_plugin_modes() {
$modes = self::get_setting( 'robotstxt_telemetry_plugin_modes', array() );
$stored = self::get_setting( 'robotstxt_telemetry_plugin_modes', array() );
return is_array( $modes ) ? $modes : array();
if ( ! is_array( $stored ) ) {
return array();
}
$modes = array();
foreach ( $stored as $slug => $mode ) {
if ( is_string( $slug ) && is_string( $mode ) ) {
$modes[ $slug ] = $mode;
}
}
return $modes;
}
/**

View file

@ -29,6 +29,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
/**
* Register hooks.
*
* @return void
*/
public function register() {
add_filter( 'pre_http_request', array( $this, 'apply_guards' ), 4, 3 );
@ -37,10 +39,10 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
/**
* Apply the Safe profiles to an outbound request.
*
* @param false|array|WP_Error $preempt Preempt value.
* @param array $args Request arguments.
* @param string $url Request URL.
* @return false|array|WP_Error
* @param false|array<string,mixed>|WP_Error $preempt Preempt value.
* @param array{body?:string|array<mixed,mixed>,headers?:string|array<mixed,mixed>,user-agent?:string} $args Request arguments.
* @param string $url Request URL.
* @return false|array<string,mixed>|WP_Error
*/
public function apply_guards( $preempt, $args, $url ) {
if ( false !== $preempt || self::$busy ) {
@ -75,7 +77,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
}
if ( 'strip_query' === $action ) {
$new_url = $this->strip_query_keys( $url, $matcher['keys'] );
$new_url = $this->strip_query_keys( $url, isset( $matcher['keys'] ) ? $matcher['keys'] : array() );
if ( $new_url !== $url ) {
$url = $new_url;
$modified = true;
@ -84,8 +86,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
}
if ( 'strip_body' === $action ) {
$new_body = $this->strip_body_keys( $args, $matcher['keys'] );
if ( null !== $new_body ) {
$new_body = $this->strip_body_keys( $args, isset( $matcher['keys'] ) ? $matcher['keys'] : array() );
if ( is_string( $new_body ) || is_array( $new_body ) ) {
$args['body'] = $new_body;
$modified = true;
}
@ -93,7 +95,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
}
if ( 'strip_headers' === $action ) {
$new_headers = $this->strip_header_keys( $args, $matcher['headers'] );
$new_headers = $this->strip_header_keys( $args, isset( $matcher['headers'] ) ? $matcher['headers'] : array() );
if ( null !== $new_headers ) {
$args['headers'] = $new_headers;
$modified = true;
@ -127,7 +129,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
*
* @param string $host Request host.
* @param string $path Request path.
* @return array Slug => list of matching matchers.
* @return array<string,array<int,array{host?:string,host_contains?:string,path?:string,do?:string,keys?:string[],headers?:string[],mock?:string}>> Slug => list of matching matchers.
*/
private function match_profiles( $host, $path ) {
$candidates = array();
@ -160,8 +162,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
* Matchers without a host restriction (path-only) apply to any host;
* the caller attribution keeps them scoped to their own plugin.
*
* @param string $host Request host.
* @param array $matcher Matcher.
* @param string $host Request host.
* @param array{host?:string,host_contains?:string} $matcher Matcher.
* @return bool
*/
private function host_matches( $host, $matcher ) {
@ -179,7 +181,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
/**
* Find which of the candidate plugins issued the request.
*
* @param array $slugs Candidate plugin slugs.
* @param array<int,string> $slugs Candidate plugin slugs.
* @return string Plugin slug or an empty string.
*/
private function find_calling_plugin( $slugs ) {
@ -187,7 +189,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
$backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS );
foreach ( $backtrace as $frame ) {
if ( empty( $frame['file'] ) || ! is_string( $frame['file'] ) ) {
if ( empty( $frame['file'] ) ) {
continue;
}
@ -207,7 +209,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
* Build a mock response for a blocked endpoint.
*
* @param string $body Mock body.
* @return array
* @return array<string,mixed>
*/
private function mock_response( $body ) {
return array(
@ -225,8 +227,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
/**
* Remove keys from the URL query string.
*
* @param string $url Request URL.
* @param array $keys Keys to remove.
* @param string $url Request URL.
* @param array<int,string> $keys Keys to remove.
* @return string
*/
private function strip_query_keys( $url, $keys ) {
@ -256,8 +258,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
*
* Returns null when nothing changed.
*
* @param array $args Request arguments.
* @param array $keys Keys to remove.
* @param array<string,mixed> $args Request arguments.
* @param array<int,string> $keys Keys to remove.
* @return mixed|null
*/
private function strip_body_keys( $args, $keys ) {
@ -300,9 +302,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
/**
* Remove keys from an array (case-insensitive).
*
* @param array $data Source array.
* @param array $keys Keys to remove.
* @return array
* @param array<mixed> $data Source array.
* @param array<int,string> $keys Keys to remove.
* @return array<mixed>
*/
private function remove_keys( $data, $keys ) {
$lower = array_map( 'strtolower', array_values( $keys ) );
@ -321,9 +323,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
/**
* Remove headers from the request arguments.
*
* @param array $args Request arguments.
* @param array $headers Header names to remove.
* @return array|null
* @param array<string,mixed> $args Request arguments.
* @param array<int,string> $headers Header names to remove.
* @return array<mixed>|null
*/
private function strip_header_keys( $args, $headers ) {
if ( ! isset( $args['headers'] ) || ! is_array( $args['headers'] ) ) {
@ -350,7 +352,7 @@ if ( ! class_exists( 'Robotstxt_Telemetry_Plugin_Guards' ) ) {
*
* Returns null when there is nothing to strip.
*
* @param array $args Request arguments.
* @param array<string,mixed> $args Request arguments.
* @return string|null
*/
private function strip_user_agent( $args ) {

File diff suppressed because it is too large Load diff

View file

@ -42,6 +42,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
/**
* Register hooks.
*
* @return void
*/
public function register() {
add_filter( 'core_version_check_query_args', array( $this, 'filter_core_query_args' ) );
@ -51,8 +53,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
/**
* Limit the core version check query arguments in safe mode.
*
* @param array $query Query arguments.
* @return array
* @param array<string,mixed> $query Query arguments.
* @return array<string,mixed>
*/
public function filter_core_query_args( $query ) {
if ( ! $this->is_safe( self::OPT_CORE ) ) {
@ -74,9 +76,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
/**
* Filter update check request arguments.
*
* @param array $args HTTP request arguments.
* @param string $url Request URL.
* @return array
* @param array<string,mixed> $args HTTP request arguments.
* @param string $url Request URL.
* @return array<string,mixed>
*/
public function filter_request_args( $args, $url ) {
$parsed = wp_parse_url( $url );
@ -115,17 +117,19 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
* Removes the wp_install/wp_blog headers and reduces the translations
* payload to its project dates.
*
* @param array $args HTTP request arguments.
* @return array
* @param array<string,mixed> $args HTTP request arguments.
* @return array<string,mixed>
*/
private function filter_core_request( $args ) {
if ( ! $this->is_safe( self::OPT_CORE ) ) {
return $args;
}
unset( $args['headers']['wp_install'], $args['headers']['wp_blog'] );
if ( isset( $args['headers'] ) && is_array( $args['headers'] ) ) {
unset( $args['headers']['wp_install'], $args['headers']['wp_blog'] );
}
if ( isset( $args['body']['translations'] ) && is_string( $args['body']['translations'] ) ) {
if ( isset( $args['body'] ) && is_array( $args['body'] ) && isset( $args['body']['translations'] ) && is_string( $args['body']['translations'] ) ) {
$args['body']['translations'] = $this->filter_translations( $args['body']['translations'] );
}
@ -135,15 +139,15 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
/**
* Limit the themes update check payload in safe mode.
*
* @param array $args HTTP request arguments.
* @return array
* @param array<string,mixed> $args HTTP request arguments.
* @return array<string,mixed>
*/
private function filter_themes_request( $args ) {
if ( ! $this->is_safe( self::OPT_THEMES ) ) {
return $args;
}
if ( ! isset( $args['body']['themes'] ) || ! is_string( $args['body']['themes'] ) ) {
if ( ! isset( $args['body'] ) || ! is_array( $args['body'] ) || ! isset( $args['body']['themes'] ) || ! is_string( $args['body']['themes'] ) ) {
return $args;
}
@ -180,15 +184,15 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
/**
* Limit the plugins update check payload in safe mode.
*
* @param array $args HTTP request arguments.
* @return array
* @param array<string,mixed> $args HTTP request arguments.
* @return array<string,mixed>
*/
private function filter_plugins_request( $args ) {
if ( ! $this->is_safe( self::OPT_PLUGINS ) ) {
return $args;
}
if ( ! isset( $args['body']['plugins'] ) || ! is_string( $args['body']['plugins'] ) ) {
if ( ! isset( $args['body'] ) || ! is_array( $args['body'] ) || ! isset( $args['body']['plugins'] ) || ! is_string( $args['body']['plugins'] ) ) {
return $args;
}
@ -231,13 +235,13 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
* the active list, nor their translation projects), which also
* means they stop receiving WordPress.org update notifications.
*
* @param array $args HTTP request arguments.
* @return array
* @param array<string,mixed> $args HTTP request arguments.
* @return array<string,mixed>
*/
private function exclude_hidden_plugins( $args ) {
$hidden = Robotstxt_Telemetry_Network::get_hidden_plugins();
if ( empty( $hidden ) || empty( $args['body']['plugins'] ) || ! is_string( $args['body']['plugins'] ) ) {
if ( empty( $hidden ) || ! isset( $args['body'] ) || ! is_array( $args['body'] ) || empty( $args['body']['plugins'] ) || ! is_string( $args['body']['plugins'] ) ) {
return $args;
}
@ -250,10 +254,16 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
$hidden_slugs = array();
foreach ( $hidden as $basename ) {
$slug = dirname( $basename );
$slug = dirname( $basename );
$hidden_slugs[ $slug ] = true;
unset( $data['plugins'][ $basename ], $data['active'][ $basename ] );
if ( isset( $data['plugins'] ) && is_array( $data['plugins'] ) ) {
unset( $data['plugins'][ $basename ] );
}
if ( isset( $data['active'] ) && is_array( $data['active'] ) ) {
unset( $data['active'][ $basename ] );
}
}
if ( isset( $args['body']['translations'] ) && is_string( $args['body']['translations'] ) ) {
@ -290,11 +300,11 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
* Handles the JSON-encoded locale arrays of the update checks
* (for example `["es_ES","en_US"]`) and plain locale strings.
*
* @param array $args HTTP request arguments.
* @return array
* @param array<string,mixed> $args HTTP request arguments.
* @return array<string,mixed>
*/
private function mask_locale_in_body( $args ) {
if ( ! isset( $args['body']['locale'] ) || ! is_array( $args['body'] ) ) {
if ( ! isset( $args['body'] ) || ! is_array( $args['body'] ) || ! isset( $args['body']['locale'] ) ) {
return $args;
}
@ -324,13 +334,13 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
/**
* Read a string field from the request body arguments.
*
* @param array $args HTTP request arguments.
* @param string $key Body field name.
* @param string $fallback_value Default value when missing.
* @param array<string,mixed> $args HTTP request arguments.
* @param string $key Body field name.
* @param string $fallback_value Default value when missing.
* @return string
*/
private function body_field( $args, $key, $fallback_value ) {
if ( isset( $args['body'][ $key ] ) && is_string( $args['body'][ $key ] ) ) {
if ( isset( $args['body'] ) && is_array( $args['body'] ) && isset( $args['body'][ $key ] ) && is_string( $args['body'][ $key ] ) ) {
return $args['body'][ $key ];
}
@ -377,7 +387,13 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
return $json;
}
return wp_json_encode( $filtered );
$encoded = wp_json_encode( $filtered );
if ( false === $encoded ) {
return $json;
}
return $encoded;
}
/**
@ -385,9 +401,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
*
* Matching is case-insensitive; original keys are preserved.
*
* @param array $fields Fields of the entry.
* @param array $allowed Lowercase allowed field names.
* @return array
* @param array<mixed,mixed> $fields Fields of the entry.
* @param array<int,string> $allowed Lowercase allowed field names.
* @return array<mixed,mixed>
*/
private function keep_fields( $fields, $allowed ) {
$kept = array();
@ -409,8 +425,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry_WordPress_Api' ) ) {
* SHA-256 truncation of the URI, so the plugin or theme source is
* no longer identifiable while staying consistent across requests.
*
* @param array $fields Fields of a plugin or theme entry.
* @return array
* @param array<mixed,mixed> $fields Fields of a plugin or theme entry.
* @return array<mixed,mixed>
*/
private function hash_update_uri( $fields ) {
foreach ( $fields as $key => $value ) {

View file

@ -17,6 +17,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry' ) ) {
/**
* Initialize the plugin.
*
* @return void
*/
public static function init() {
$instance = new self();
@ -25,6 +27,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry' ) ) {
/**
* Register hooks.
*
* @return void
*/
private function register_hooks() {
add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
@ -67,9 +71,9 @@ if ( ! class_exists( 'Robotstxt_Telemetry' ) ) {
* Runs at priority 9 so the telemetry logger records the value that
* is actually sent on the wire.
*
* @param array $args HTTP request arguments.
* @param string $url Request URL.
* @return array
* @param array<string,mixed> $args HTTP request arguments.
* @param string $url Request URL.
* @return array<string,mixed>
*/
public function filter_useragent( $args, $url ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter -- Second argument required by the http_request_args filter signature.
$url_mode = Robotstxt_Telemetry_Network::get_useragent_url_mode();
@ -85,9 +89,11 @@ if ( ! class_exists( 'Robotstxt_Telemetry' ) ) {
$args['user-agent'] = $this->mask_user_agent( $args['user-agent'], $url_mode, $version_mode, $site_url );
}
foreach ( array( 'User-Agent', 'user-agent' ) as $header ) {
if ( isset( $args['headers'][ $header ] ) && is_string( $args['headers'][ $header ] ) ) {
$args['headers'][ $header ] = $this->mask_user_agent( $args['headers'][ $header ], $url_mode, $version_mode, $site_url );
if ( isset( $args['headers'] ) && is_array( $args['headers'] ) ) {
foreach ( array( 'User-Agent', 'user-agent' ) as $header ) {
if ( isset( $args['headers'][ $header ] ) && is_string( $args['headers'][ $header ] ) ) {
$args['headers'][ $header ] = $this->mask_user_agent( $args['headers'][ $header ], $url_mode, $version_mode, $site_url );
}
}
}
@ -128,11 +134,15 @@ if ( ! class_exists( 'Robotstxt_Telemetry' ) ) {
$user_agent = trim( $user_agent );
if ( 'actual' !== $version_mode && preg_match( '#^WordPress/(\d+[^\s;]*)#', $user_agent, $matches ) ) {
$user_agent = preg_replace(
$masked = preg_replace(
'#^WordPress/[^\s;]+#',
'WordPress/' . Robotstxt_Telemetry_Network::mask_wp_version( $matches[1], $version_mode ),
$user_agent
);
if ( null !== $masked ) {
$user_agent = $masked;
}
}
return $user_agent;
@ -142,6 +152,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry' ) ) {
*
* In global mode the shared table is cleaned from the main site
* only, so subsites do not schedule the event.
*
* @return void
*/
public function schedule_cleanup() {
if ( Robotstxt_Telemetry_Network::is_global() && ! is_main_site() ) {
@ -155,6 +167,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry' ) ) {
/**
* Deactivation handler: clear the scheduled cleanup event.
*
* @return void
*/
public static function deactivate() {
wp_clear_scheduled_hook( 'robotstxt_telemetry_cleanup' );
@ -170,6 +184,8 @@ if ( ! class_exists( 'Robotstxt_Telemetry' ) ) {
/**
* Load plugin translations.
*
* @return void
*/
public function load_textdomain() {
load_plugin_textdomain(

Binary file not shown.

View file

@ -0,0 +1,879 @@
# Translation of Telemetry disabler (by ROBOTSTXT) in Catalan.
# This file is distributed under the GPL-3.0-or-later.
msgid ""
msgstr ""
"Project-Id-Version: Telemetry disabler (by ROBOTSTXT) 1.1.4\n"
"Report-Msgid-Bugs-To: https://www.robotstxt.software/plugins/robotstxt-telemetry/\n"
"Last-Translator: ROBOTSTXT <hola@robotstxt.software>\n"
"Language-Team: CA <hola@robotstxt.software>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"PO-Revision-Date: 2026-08-20 14:25+0000\n"
"X-Generator: manual\n"
"X-Domain: robotstxt-telemetry\n"
#. Description of the plugin
#: robotstxt-telemetry.php
msgid "Reduces the telemetry WordPress sends out and logs every outbound HTTP request, so your site shares less and you can see everything."
msgstr "Redueix la telemetría que el WordPress envia i registra totes les peticions HTTP sortints, de manera que el lloc comparteix menys i ho podeu veure tot."
#: includes/class-robotstxt-telemetry-admin.php:45
#: includes/class-robotstxt-telemetry-admin.php:46
#: includes/class-robotstxt-telemetry-admin.php:96
#: includes/class-robotstxt-telemetry-admin.php:97
msgid "Telemetry"
msgstr "Telemetría"
#: includes/class-robotstxt-telemetry-admin.php:55
#: includes/class-robotstxt-telemetry-admin.php:56
#: includes/class-robotstxt-telemetry-admin.php:106
#: includes/class-robotstxt-telemetry-admin.php:107
#: includes/class-robotstxt-telemetry-admin.php:524
msgid "Settings"
msgstr "Ajustos"
#: includes/class-robotstxt-telemetry-admin.php:64
#: includes/class-robotstxt-telemetry-admin.php:65
#: includes/class-robotstxt-telemetry-admin.php:115
#: includes/class-robotstxt-telemetry-admin.php:116
#: includes/class-robotstxt-telemetry-admin.php:525
msgid "Plugins"
msgstr "Complements"
#: includes/class-robotstxt-telemetry-admin.php:73
#: includes/class-robotstxt-telemetry-admin.php:74
#: includes/class-robotstxt-telemetry-admin.php:125
#: includes/class-robotstxt-telemetry-admin.php:126
#: includes/class-robotstxt-telemetry-admin.php:526
msgid "Logs"
msgstr "Registres"
#: includes/class-robotstxt-telemetry-admin.php:430
msgid "Settings saved."
msgstr "Ajustos desats."
#: includes/class-robotstxt-telemetry-admin.php:434
msgid "Configuration mode saved."
msgstr "Mode de configuració desat."
#: includes/class-robotstxt-telemetry-admin.php:453
msgid "Telemetry Network Settings"
msgstr "Ajustos de telemetría de la xarxa"
#: includes/class-robotstxt-telemetry-admin.php:464
#: includes/class-robotstxt-telemetry-admin.php:467
msgid "Configuration mode"
msgstr "Mode de configuració"
#: includes/class-robotstxt-telemetry-admin.php:469
msgid "Per-site"
msgstr "Per lloc"
#: includes/class-robotstxt-telemetry-admin.php:471
msgid "Global"
msgstr "Global"
#: includes/class-robotstxt-telemetry-admin.php:473
msgid "Per-site: every site keeps its own settings and its own log table, managed by each site administrator. Global: one shared configuration and one central log on the main site collect the outbound requests of the whole network; the Telemetry screens are then managed from here only."
msgstr "Per lloc: cada lloc conserva els seus propis ajustos i la seva pròpia taula de registres, gestionats per cada administrador del lloc. Global: una configuració compartida i un registre central al lloc principal recullen les peticions sortints de tota la xarxa; les pantalles de Telemetría es gestionen llavors únicament des d'aquí."
#: includes/class-robotstxt-telemetry-admin.php:479
msgid "Save configuration mode"
msgstr "Desa el mode de configuració"
#: includes/class-robotstxt-telemetry-admin.php:484
msgid "Switch to Global mode to manage the settings and the logs for the whole network from this screen."
msgstr "Canvieu al mode Global per a gestionar els ajustos i els registres de tota la xarxa des d'aquesta pantalla."
#: includes/class-robotstxt-telemetry-admin.php:527
msgid "General"
msgstr "General"
#: includes/class-robotstxt-telemetry-admin.php:530
msgid "Settings sections"
msgstr "Seccions d'ajustos"
#: includes/class-robotstxt-telemetry-admin.php:566
msgid "Telemetry Settings"
msgstr "Ajustos de telemetría"
#: includes/class-robotstxt-telemetry-admin.php:605
#: includes/class-robotstxt-telemetry-admin.php:608
msgid "Outbound requests"
msgstr "Peticions sortints"
#: includes/class-robotstxt-telemetry-admin.php:612
msgid "Send your URL"
msgstr "Envia la teva URL"
#: includes/class-robotstxt-telemetry-admin.php:613
msgid "Send a hash"
msgstr "Envia un hash"
#: includes/class-robotstxt-telemetry-admin.php:614
msgid "Do not send anything"
msgstr "No enviïs res"
#: includes/class-robotstxt-telemetry-admin.php:622
msgid "Outbound requests normally identify this site in the User-Agent with its URL (for example \"WordPress/6.9; https://example.com/\"). \"Send a hash\" (default) replaces it with a fixed hash so the site is no longer identifiable; \"Do not send anything\" removes it completely."
msgstr "Les peticions sortints normalment identifiquen aquest lloc a la User-Agent amb la seva URL (per exemple «WordPress/6.9; https://example.com/»). «Envia un hash» (per defecte) la substitueix per un hash fix perquè el lloc deixi de ser identificable; «No enviïs res» la elimina completament."
#: includes/class-robotstxt-telemetry-admin.php:630
#: includes/class-robotstxt-telemetry-admin.php:633
msgid "WordPress version"
msgstr "Versió del WordPress"
#: includes/class-robotstxt-telemetry-admin.php:637
#: includes/class-robotstxt-telemetry-admin.php:818
msgid "Actual version"
msgstr "Versió real"
#: includes/class-robotstxt-telemetry-admin.php:638
msgid "Major version"
msgstr "Versió principal"
#: includes/class-robotstxt-telemetry-admin.php:639
msgid "Nulled version"
msgstr "Versió nul·la"
#: includes/class-robotstxt-telemetry-admin.php:647
msgid "The version reported in the User-Agent and in the WordPress.org version fields: the actual version (default), the major version with the rest masked (for example \"7.2.n\"), or a nulled version (\"0.0.0\"). The checksum and translation requests always use the real version so updates keep working."
msgstr "La versió comunicada a la User-Agent i als camps de versió de WordPress.org: la versió real (per defecte), la versió principal amb la resta emmascarada (per exemple «7.2.n»), o una versió nul·la («0.0.0»). Les peticions de checksums i traduccions sempre usen la versió real perquè les actualitzacions continuïn funcionant."
#: includes/class-robotstxt-telemetry-admin.php:653
msgid "Installation language"
msgstr "Llengua de la instal·lació"
#: includes/class-robotstxt-telemetry-admin.php:657
msgid "Send en_US as the language of outbound requests"
msgstr "Envia en_US com a llengua de les peticions sortints"
#: includes/class-robotstxt-telemetry-admin.php:659
msgid "When enabled, requests to WordPress.org report English (United States) instead of the installation language. The translation endpoints keep using the real language so installed language packs keep receiving updates."
msgstr "Quan està activat, les peticions a WordPress.org informen d'anglès (Estats Units) en comptes de la llengua de la instal·lació. Els punts finals de traducció continuen usant la llengua real perquè els paquets d'idioma instal·lats continuïn rebent actualitzacions."
#: includes/class-robotstxt-telemetry-admin.php:665
msgid "Replace the WordPress News feed"
msgstr "Substitueix el feed de notícies del WordPress"
#: includes/class-robotstxt-telemetry-admin.php:666
msgid "Use WordPress Planet by Fair (planet.fair.pm) instead of wordpress.org/news for the Events and News dashboard widget"
msgstr "Usa WordPress Planet by Fair (planet.fair.pm) en comptes de wordpress.org/news per al giny del tauler Esdeveniments i notícies"
#: includes/class-robotstxt-telemetry-admin.php:669
msgid "Replace the WordPress Events service"
msgstr "Substitueix el servei d'esdeveniments del WordPress"
#: includes/class-robotstxt-telemetry-admin.php:670
msgid "Use WordPress Events by The WP World (api.fair.pm) instead of api.wordpress.org/events, sending the same request data"
msgstr "Usa WordPress Events by The WP World (api.fair.pm) en comptes d'api.wordpress.org/events, enviant les mateixes dades de la petició"
#: includes/class-robotstxt-telemetry-admin.php:673
msgid "Disable the WordPress browser check"
msgstr "Desactiva la comprovació del navegador del WordPress"
#: includes/class-robotstxt-telemetry-admin.php:674
msgid "Do not send the browser version to api.wordpress.org/core/browse-happy; the browser is always reported as compatible"
msgstr "No envia la versió del navegador a api.wordpress.org/core/browse-happy; el navegador sempre s'informa com a compatible"
#: includes/class-robotstxt-telemetry-admin.php:692
msgid "WordPress Core version check"
msgstr "Comprovació de la versió del nucli del WordPress"
#: includes/class-robotstxt-telemetry-admin.php:693
msgid "Safe sends only the WordPress version, PHP version, locale, MySQL version, and update channel. Original also sends site counts, database history, PHP extensions, and platform details."
msgstr "Segur envia únicament la versió del WordPress, la versió del PHP, la llengua, la versió del MySQL i el canal d'actualitzacions. Original envia també els recomptes del lloc, l'historial de la base de dades, les extensions del PHP i els detalls de la plataforma."
#: includes/class-robotstxt-telemetry-admin.php:696
msgid "WordPress Themes version check"
msgstr "Comprovació de la versió dels temes del WordPress"
#: includes/class-robotstxt-telemetry-admin.php:697
msgid "Safe sends only the theme name, version, update URI, template, and stylesheet, plus the translation revision date and site locale. Original also sends author details and other theme metadata."
msgstr "Segur envia únicament el nom del tema, la versió, l'URI d'actualització, la plantilla i el full d'estils, a més de la data de revisió de la traducció i la llengua del lloc. Original envia també les dades de l'autor i altres metadades del tema."
#: includes/class-robotstxt-telemetry-admin.php:700
msgid "WordPress Plugins version check"
msgstr "Comprovació de la versió dels complements del WordPress"
#: includes/class-robotstxt-telemetry-admin.php:701
msgid "Safe sends only the plugin version, update URI, and requirements, plus the translation revision date, locale, and the \"all\" flag. Original also sends names, descriptions, authors, and other plugin metadata."
msgstr "Segur envia únicament la versió del complement, l'URI d'actualització i els requisits, a més de la data de revisió de la traducció, la llengua i el marcador «all». Original envia també noms, descripcions, autors i altres metadades dels complements."
#: includes/class-robotstxt-telemetry-admin.php:713
msgid "Original"
msgstr "Original"
#: includes/class-robotstxt-telemetry-admin.php:715
msgid "Safe"
msgstr "Segur"
#: includes/class-robotstxt-telemetry-admin.php:732
#: includes/class-robotstxt-telemetry-admin.php:734
msgid "Log retention"
msgstr "Retenció dels registres"
#: includes/class-robotstxt-telemetry-admin.php:738
msgid "12 hours"
msgstr "12 hores"
#: includes/class-robotstxt-telemetry-admin.php:739
msgid "1 day"
msgstr "1 dia"
#: includes/class-robotstxt-telemetry-admin.php:740
msgid "3 days"
msgstr "3 dies"
#: includes/class-robotstxt-telemetry-admin.php:753
msgid "Logs older than the selected period are deleted (12 hours by default). A maximum of 1000 entries is always kept; the cleanup runs when browsing the logs and twice a day automatically."
msgstr "Els registres anteriors al període seleccionat se suprimeixen (12 hores per defecte). Sempre es conserva un màxim de 1000 entrades; la neteja s'executa en consultar els registres i automàticament dues vegades al dia."
#: includes/class-robotstxt-telemetry-admin.php:760
msgid "Uninstall behavior"
msgstr "Comportament en desinstal·lar"
#: includes/class-robotstxt-telemetry-admin.php:764
msgid "Delete all telemetry logs and plugin options on uninstall"
msgstr "Suprimeix tots els registres de telemetría i els ajustos del complement en desinstal·lar"
#: includes/class-robotstxt-telemetry-admin.php:766
msgid "By default, all telemetry logs are preserved when the plugin is uninstalled."
msgstr "Per defecte, tots els registres de telemetría es conserven en desinstal·lar el complement."
#: includes/class-robotstxt-telemetry-admin.php:805
msgid "Telemetry - Plugins"
msgstr "Telemetría - Complements"
#: includes/class-robotstxt-telemetry-admin.php:807
msgid "Plugin modes saved."
msgstr "Modes dels complements desats."
#: includes/class-robotstxt-telemetry-admin.php:809
msgid "Every installed plugin with a known telemetry behavior is listed below. In Safe mode the known telemetry endpoints are blocked or reduced to the minimum data each service needs to work; in Original mode the plugin behaves exactly as it would without Telemetry disabler. The tested version is the plugin version the Safe profile was verified against."
msgstr "A continuació es llista cada complement instal·lat amb un comportament de telemetría conegut. En mode Segur els punts finals de telemetría coneguts es bloquen o es redueixen a les dades mínimes que cada servei necessita per a funcionar; en mode Original el complement es comporta exactament com ho faria sense Telemetry disabler. La versió provada és la versió del complement amb què es va verificar el perfil Segur."
#: includes/class-robotstxt-telemetry-admin.php:816
msgid "Safe Mode"
msgstr "Mode segur"
#: includes/class-robotstxt-telemetry-admin.php:817
#: includes/class-robotstxt-telemetry-admin.php:968
msgid "Plugin"
msgstr "Complement"
#: includes/class-robotstxt-telemetry-admin.php:819
msgid "Tested version"
msgstr "Versió provada"
#: includes/class-robotstxt-telemetry-admin.php:820
msgid "Description"
msgstr "Descripció"
#. translators: %s: Plugin name.
#: includes/class-robotstxt-telemetry-admin.php:835
#: includes/class-robotstxt-telemetry-admin.php:836
#, php-format
msgid "Safe Mode for %s"
msgstr "Mode segur per a %s"
#: includes/class-robotstxt-telemetry-admin.php:846
msgid "Save plugin modes"
msgstr "Desa els modes dels complements"
#: includes/class-robotstxt-telemetry-admin.php:956
msgid "The plugins checked below are never sent to WordPress.org: they are excluded from the plugin update check (including their translations and the active list). That also means they will not receive update notifications from WordPress.org."
msgstr "Els complements marcats a continuació mai no s'envien a WordPress.org: queden exclosos de la comprovació d'actualitzacions de complements (incloses les seves traduccions i la llista d'actius). Això també significa que no rebran notificacions d'actualització de WordPress.org."
#: includes/class-robotstxt-telemetry-admin.php:957
msgid "Recommendation: keep external or private plugins (those not hosted on WordPress.org) checked, since they do not receive WordPress.org updates anyway and nothing is gained by reporting them."
msgstr "Recomanació: deixeu marcats els complements externs o privats (els no allotjats a WordPress.org), atès que no reben actualitzacions de WordPress.org de totes maneres i no s'hi guanya res informant-ne."
#: includes/class-robotstxt-telemetry-admin.php:966
msgid "Hide from WordPress.org"
msgstr "Amaga a WordPress.org"
#: includes/class-robotstxt-telemetry-admin.php:967
msgid "Status"
msgstr "Estat"
#: includes/class-robotstxt-telemetry-admin.php:969
msgid "Version"
msgstr "Versió"
#: includes/class-robotstxt-telemetry-admin.php:990
msgid "Always hidden"
msgstr "Sempre ocult"
#: includes/class-robotstxt-telemetry-admin.php:990
msgid "Active"
msgstr "Actiu"
#: includes/class-robotstxt-telemetry-admin.php:990
msgid "Inactive"
msgstr "Inactiu"
#: includes/class-robotstxt-telemetry-admin.php:1023
msgid "Telemetry Logs"
msgstr "Registres de telemetría"
#: includes/class-robotstxt-telemetry-admin.php:1043
msgid "All log entries deleted."
msgstr "S'han suprimit totes les entrades del registre."
#: includes/class-robotstxt-telemetry-admin.php:1045
msgid "Log entry deleted."
msgstr "S'ha suprimit l'entrada del registre."
#: includes/class-robotstxt-telemetry-admin.php:1059
msgid "Delete all logs"
msgstr "Suprimeix tots els registres"
#: includes/class-robotstxt-telemetry-admin.php:1079
msgid "You are about to permanently delete all telemetry log entries. This action cannot be undone."
msgstr "Esteu a punt de suprimir permanentment totes les entrades del registre de telemetría. Aquesta acció no es pot desfer."
#: includes/class-robotstxt-telemetry-admin.php:1087
msgid "Yes, delete all logs"
msgstr "Sí, suprimeix tots els registres"
#: includes/class-robotstxt-telemetry-admin.php:1088
msgid "Cancel"
msgstr "Cancel·la"
#: includes/class-robotstxt-telemetry-admin.php:1102
msgid "Log entry not found."
msgstr "No s'ha trobat l'entrada del registre."
#: includes/class-robotstxt-telemetry-admin.php:1106
msgid "Back to logs"
msgstr "Torna als registres"
#: includes/class-robotstxt-telemetry-admin.php:1110
#: includes/class-robotstxt-telemetry-logs-table.php:49
msgid "Date"
msgstr "Data"
#: includes/class-robotstxt-telemetry-admin.php:1111
#: includes/class-robotstxt-telemetry-logs-table.php:50
msgid "Method"
msgstr "Mètode"
#: includes/class-robotstxt-telemetry-admin.php:1112
msgid "URL"
msgstr "URL"
#: includes/class-robotstxt-telemetry-admin.php:1113
#: includes/class-robotstxt-telemetry-logs-table.php:51
#: includes/class-robotstxt-telemetry-logs-table.php:245
msgid "Host"
msgstr "Amfitrió"
#: includes/class-robotstxt-telemetry-admin.php:1114
#: includes/class-robotstxt-telemetry-logs-table.php:52
msgid "Path"
msgstr "Camí"
#: includes/class-robotstxt-telemetry-admin.php:1115
msgid "Body Params"
msgstr "Paràmetres del cos"
#: includes/class-robotstxt-telemetry-admin.php:1116
msgid "Headers"
msgstr "Capçaleres"
#: includes/class-robotstxt-telemetry-admin.php:1117
msgid "User Agent"
msgstr "User Agent"
#: includes/class-robotstxt-telemetry-admin.php:1118
msgid "Raw Body"
msgstr "Cos en brut"
#: includes/class-robotstxt-telemetry-admin.php:1119
msgid "Caller"
msgstr "Origen de la crida"
#: includes/class-robotstxt-telemetry-admin.php:1140
msgid "Telemetry Analysis"
msgstr "Anàlisi de telemetría"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:74
msgid "Environment"
msgstr "Entorn"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:78
msgid "Extensions"
msgstr "Extensions"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:82
msgid "Platform Flags"
msgstr "Indicadors de la plataforma"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:86
msgid "Image Support"
msgstr "Compatibilitat amb imatges"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:90
msgid "Other URL Parameters"
msgstr "Altres paràmetres de la URL"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:117
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:119
msgid "Translations"
msgstr "Traduccions"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:124
msgid "Other Body Parameters"
msgstr "Altres paràmetres del cos"
#: includes/class-robotstxt-telemetry-analysis.php:45
msgid "URL Parameters"
msgstr "Paràmetres de la URL"
#: includes/class-robotstxt-telemetry-analysis.php:50
msgid "Body Parameters"
msgstr "Paràmetres del cos"
#: includes/class-robotstxt-telemetry-logs-table.php:173
msgid "View"
msgstr "Visualitza"
#: includes/class-robotstxt-telemetry-logs-table.php:174
msgid "Delete"
msgstr "Suprimeix"
#: includes/class-robotstxt-telemetry-logs-table.php:225
msgid "Filter by method"
msgstr "Filtra per mètode"
#: includes/class-robotstxt-telemetry-logs-table.php:227
msgid "All methods"
msgstr "Tots els mètodes"
#: includes/class-robotstxt-telemetry-logs-table.php:241
msgid "Filter by host"
msgstr "Filtra per amfitrió"
#: includes/class-robotstxt-telemetry-logs-table.php:248
msgid "From date"
msgstr "Des de la data"
#: includes/class-robotstxt-telemetry-logs-table.php:254
msgid "To date"
msgstr "Fins a la data"
#: includes/class-robotstxt-telemetry-logs-table.php:260
msgid "Filter"
msgstr "Filtra"
#. translators: 1: Manager plugin URL, 2: link text.
#: includes/class-robotstxt-telemetry-manager-notice.php:139
#, php-format
msgid "To receive updates for Telemetry disabler (by ROBOTSTXT), the <a href=\"%1$s\">%2$s</a> plugin must be installed and active."
msgstr "Per a rebre actualitzacions del Telemetry disabler (by ROBOTSTXT), cal que el complement <a href=\"%1$s\">%2$s</a> estigui instal·lat i actiu."
#: includes/class-robotstxt-telemetry-manager-notice.php:141
msgid "Manager (by ROBOTSTXT)"
msgstr "Manager (by ROBOTSTXT)"
#: includes/class-robotstxt-telemetry-manager-notice.php:178
msgid "You do not have sufficient permissions to perform this action."
msgstr "No teniu permisos suficients per a fer aquesta acció."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:61
msgid "Blocks the analytics.adinserter.pro telemetry (site URL, site name, WordPress and PHP versions, admin email, plugin list and options). Update checks keep working."
msgstr "Bloca la telemetría d'analytics.adinserter.pro (URL del lloc, nom del lloc, versions del WordPress i del PHP, correu de l'administrador, llista de complements i ajustos). Les comprovacions d'actualitzacions continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:70
msgid "Removes the WordPress version and site URL from the API User-Agent. The connect flow keeps sending the site URL because it is the account identifier."
msgstr "Elimina la versió del WordPress i la URL del lloc de la User-Agent de l'API. El flux de connexió continua enviant la URL del lloc perquè és l'identificador del compte."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:80
msgid "Removes the site URL and the admin email from the extension update-check query. Extension updates keep working (they only need the purchased extension slug and version)."
msgstr "Elimina la URL del lloc i el correu de l'administrador de la consulta de comprovació d'actualitzacions d'extensions. Les actualitzacions d'extensions continuen funcionant (només necessiten l'slug i la versió de l'extensió comprada)."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:93
msgid "Blocks the comment-language check (which sends the comment text) and the IP country lookup. All the local spam checks keep working."
msgstr "Bloca la comprovació de la llengua dels comentaris (que envia el text del comentari) i la consulta del país per IP. Totes les comprovacions antispam locals continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:108
msgid "Removes the site URL from the starter-template requests. License validation keeps sending the site URL because it is the account identifier."
msgstr "Elimina la URL del lloc de les peticions de plantilles inicials. La validació de la llicència continua enviant la URL del lloc perquè és l'identificador del compte."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:117
msgid "Blocks the usage ping. The critical CSS service keeps receiving the page URL because generating the CSS for a page requires that page URL."
msgstr "Bloca el ping d'ús. El servei de CSS crític continua rebent la URL de la pàgina perquè generar el CSS d'una pàgina requereix aquesta URL."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:121
msgid "Blocks the Mixpanel telemetry events (which include the site host and versions). Backup destinations are admin-configured and untouched."
msgstr "Bloca els esdeveniments de telemetría del Mixpanel (que inclouen l'amfitrió del lloc i les versions). Les destinacions de les còpies de seguretat es configuren a l'administració i no es toquen."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:130
msgid "Blocks the StellarWP telemetry reports. The brute-force network and licensing keep working."
msgstr "Bloca els informes de telemetría de StellarWP. La xarxa de força bruta i les llicències continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:140
msgid "Removes the Referer header (your site URL) from the Sucuri site-check requests. The scan itself keeps working."
msgstr "Elimina la capçalera Referer (la URL del vostre lloc) de les peticions de comprovació del lloc de Sucuri. L'anàlisi en si continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:144
msgid "Removes the WordPress version, home URL, plugin and theme lists from the WPMU DEV Hub payloads, and the site URL from the User-Agent. The Hub connection keeps the domain as the account identifier."
msgstr "Elimina la versió del WordPress, la URL d'inici i les llistes de complements i temes de les càrregues del WPMU DEV Hub, i la URL del lloc de la User-Agent. La connexió amb el Hub conserva el domini com a identificador del compte."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:153
msgid "Removes the WordPress version and site URL from the API User-Agent. Link analysis keeps working."
msgstr "Elimina la versió del WordPress i la URL del lloc de la User-Agent de l'API. L'anàlisi d'enllaços continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:163
msgid "Blocks the aggregated statistics telemetry. License checks keep sending the site URL as the account identifier."
msgstr "Bloca la telemetría d'estadístiques agregades. Les comprovacions de llicència continuen enviant la URL del lloc com a identificador del compte."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:172
msgid "Removes the WordPress version, PHP version and site URL from the API User-Agent. All button features keep working."
msgstr "Elimina la versió del WordPress, la versió del PHP i la URL del lloc de la User-Agent de l'API. Totes les funcions dels botons continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:182
msgid "Blocks the NPS survey requests that automatically attach the admin name and email. Template downloads keep working."
msgstr "Bloca les peticions de l'enquesta NPS que adjunten automàticament el nom i el correu de l'administrador. Les baixades de plantilles continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:191
msgid "Blocks the feedback and support pings that send the site URL. The chat channels keep working."
msgstr "Bloca els pings de comentaris i suport que envien la URL del lloc. Els canals de xat continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:201
msgid "Blocks the deactivation feedback (WordPress version, PHP version, site URL, language, theme, plugin list, server software). Chat widgets keep working."
msgstr "Bloca l'enquesta de desactivació (versió del WordPress, versió del PHP, URL del lloc, llengua, tema, llista de complements, programari del servidor). Els ginys de xat continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:211
msgid "Removes the site host from the cloud search queries. Cloud search keeps working with the account token."
msgstr "Elimina l'amfitrió del lloc de les consultes de cerca al núvol. La cerca al núvol continua funcionant amb el testimoni del compte."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:221
msgid "Removes the WordPress version from the license requests. The license key, site URL (account identifier) and installed version (needed for updates) are kept."
msgstr "Elimina la versió del WordPress de les peticions de llicència. La clau de llicència, la URL del lloc (identificador del compte) i la versió instal·lada (necessària per a les actualitzacions) es conserven."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:225
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). License activation keeps working."
msgstr "Bloca els esdeveniments d'analítica del Freemius (llistes de complements i temes, versions, URL del lloc, llengua). L'activació de la llicència continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:235
msgid "Blocks the uninstall feedback (MySQL, WordPress and WooCommerce versions, locale, multisite flag). The cookie scanner keeps sending the scanned URLs because that is its function."
msgstr "Bloca l'enquesta de desinstal·lació (versions del MySQL, del WordPress i del WooCommerce, llengua, indicador de multilloc). L'escàner de galetes continua enviant les URL escanejades perquè aquesta és la seva funció."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:245
msgid "Blocks the deactivation feedback that sends the site URL. The notice and the account service keep working."
msgstr "Bloca l'enquesta de desactivació que envia la URL del lloc. L'avís i el servei de comptes continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:254
msgid "Blocks the usage tracker (WordPress version, PHP version, server IP, MySQL version, locale, plugin list). Post duplication is fully local."
msgstr "Bloca el rastrejador d'ús (versió del WordPress, versió del PHP, IP del servidor, versió del MySQL, llengua, llista de complements). La duplicació d'entrades és totalment local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:264
msgid "Removes the site URL and language from the newsletter subscribe. The admin-entered email is kept (it is an explicit subscription)."
msgstr "Elimina la URL del lloc i la llengua de la subscripció al butlletí. El correu introduït per l'administrador es conserva (és una subscripció explícita)."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:268
msgid "Blocks the BSF analytics report (site URL, WordPress/PHP/MySQL versions, user count, language, timezone, plugin list, server software). Font uploads are unaffected."
msgstr "Bloca l'informe d'analítica del BSF (URL del lloc, versions del WordPress/PHP/MySQL, nombre d'usuaris, llengua, zona horària, llista de complements, programari del servidor). La pujada de tipus de lletra no es veu afectada."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:281
msgid "Blocks the usage tracker and its country lookup (site URL, plugin slug, server IP). Comment disabling is fully local."
msgstr "Bloca el rastrejador d'ús i la seva consulta del país (URL del lloc, slug del complement, IP del servidor). La desactivació de comentaris és totalment local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:290
msgid "Removes the site URL from the geo-lookup User-Agent. Mail delivery keeps working with your mailer credentials only."
msgstr "Elimina la URL del lloc de la User-Agent de la geolocalització. El lliurament de correu continua funcionant únicament amb les vostres credencials de correu."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:301
msgid "Removes the language and API version from the feedback surveys. The template library and the connect flow (site URL as account identifier) are untouched."
msgstr "Elimina la llengua i la versió de l'API de les enquestes de comentaris. La biblioteca de plantilles i el flux de connexió (la URL del lloc com a identificador del compte) no es toquen."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:312
msgid "Removes the WordPress version, PHP version and site URL from the unsubscribe feedback. Widgets and modules are unaffected."
msgstr "Elimina la versió del WordPress, la versió del PHP i la URL del lloc de l'enquesta de baixa. Els ginys i els mòduls no es veuen afectats."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:322
msgid "Removes the site URL and the WordPress/PHP version block from the ShortPixel key check. The API key alone is enough to validate the account."
msgstr "Elimina la URL del lloc i el bloc de versions del WordPress/PHP de la comprovació de la clau del ShortPixel. La clau de l'API tota sola basta per a validar el compte."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:332
msgid "Blocks the usage tracker (site URL, site name, WordPress version, language, PHP version, admin email). Elements and templates keep working."
msgstr "Bloca el rastrejador d'ús (URL del lloc, nom del lloc, versió del WordPress, llengua, versió del PHP, correu de l'administrador). Els elements i les plantilles continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:341
msgid "Blocks the weekly check-in (plugin list, locale, WordPress version, OS, limits, image counts). Local and cloud optimization keep working."
msgstr "Bloca la comprovació setmanal (llista de complements, llengua, versió del WordPress, sistema operatiu, límits, recomptes d'imatges). L'optimització local i al núvol continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:356
msgid "Removes the WordPress version, language, site title, site profile and Referer header from the AI requests. The AI assistance keeps working with the prompt content only."
msgstr "Elimina la versió del WordPress, la llengua, el títol del lloc, el perfil del lloc i la capçalera Referer de les peticions d'IA. L'assistència d'IA continua funcionant únicament amb el contingut de la indicació."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:366
msgid "Blocks the tracker (WordPress version, PHP version, MySQL version, server software, plugin list, admin email, IP). Form integrations keep working."
msgstr "Bloca el rastrejador (versió del WordPress, versió del PHP, versió del MySQL, programari del servidor, llista de complements, correu de l'administrador, IP). Les integracions de formularis continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:376
msgid "Blocks the opt-in ping and the failed-mail notifications (which include email metadata). Mail delivery keeps working with your mailer credentials only."
msgstr "Bloca el ping d'acceptació i les notificacions de correu fallit (que inclouen metadades del correu). El lliurament de correu continua funcionant únicament amb les vostres credencials de correu."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:385
msgid "Blocks the usage snapshot (UUID, WordPress/PHP/MySQL versions, OS, locale, plugin list, form counts) and the onboarding email collection. Forms keep working."
msgstr "Bloca la instantània d'ús (UUID, versions del WordPress/PHP/MySQL, sistema operatiu, llengua, llista de complements, recomptes de formularis) i la recollida de correu del procés de configuració inicial. Els formularis continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:389
msgid "Removes the WordPress version, home URL, plugin and theme lists from the WPMU DEV Hub payloads, and the site URL from the User-Agent. The domain is kept as the account identifier."
msgstr "Elimina la versió del WordPress, la URL d'inici i les llistes de complements i temes de les càrregues del WPMU DEV Hub, i la URL del lloc de la User-Agent. El domini es conserva com a identificador del compte."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:398
#: includes/class-robotstxt-telemetry-plugin-profiles.php:407
msgid "Blocks the check-in (plugin list, locale, home URL). Your Google Analytics measurement keeps working."
msgstr "Bloca la comprovació periòdica (llista de complements, llengua, URL d'inici). La vostra mesuració de Google Analytics continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:417
msgid "Removes the WordPress version, PHP version and user count from the Site Kit feature reports. Search Console, Analytics and AdSense integrations keep working."
msgstr "Elimina la versió del WordPress, la versió del PHP i el nombre d'usuaris dels informes de funcions del Site Kit. Les integracions amb Search Console, Analytics i AdSense continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:430
msgid "Blocks the Google Analytics usage ping and the beta-consent ping (WordPress version, PHP version, post count, email, domain, language). Search-engine pings keep working."
msgstr "Bloca el ping d'ús de Google Analytics i el ping de consentiment per a betes (versió del WordPress, versió del PHP, nombre d'entrades, correu, domini, llengua). Els pings als motors de cerca continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:440
msgid "Blocks the Appsero insights (site URL, PHP version, MySQL, server software, WordPress version). License and update checks keep working."
msgstr "Bloca la informació de l'Appsero (URL del lloc, versió del PHP, MySQL, programari del servidor, versió del WordPress). Les comprovacions de llicència i d'actualitzacions continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:444
msgid "Blocks the BSF analytics report (site URL, PHP/WordPress versions, network URL, plugin list). Header and footer builder keep working."
msgstr "Bloca l'informe d'analítica del BSF (URL del lloc, versions del PHP/WordPress, URL de la xarxa, llista de complements). El maquetador de capçalera i peu continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:454
msgid "Blocks the event reporting that sends your domain. Hosting management actions keep working with your token."
msgstr "Bloca els informes d'esdeveniments que envien el vostre domini. Les accions de gestió de l'allotjament continuen funcionant amb el vostre testimoni."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:458
msgid "Blocks the Mixpanel telemetry events (which include the WordPress version). Image optimization keeps working with your API key."
msgstr "Bloca els esdeveniments de telemetría del Mixpanel (que inclouen la versió del WordPress). L'optimització d'imatges continua funcionant amb la vostra clau de l'API."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:469
msgid "Removes the language from the notifications requests. Image optimization and connect keep working."
msgstr "Elimina la llengua de les peticions de notificacions. L'optimització d'imatges i la connexió continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:484
msgid "Blocks the usage check-in (environment payload with a site-URL User-Agent). Feeds keep working with your access tokens."
msgstr "Bloca la comprovació periòdica d'ús (càrrega d'entorn amb una User-Agent amb la URL del lloc). Els feeds continuen funcionant amb els vostres testimonis d'accés."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:498
msgid "Blocks the Freemius analytics events and removes the domain from the newsletter subscribe. Templates and elements keep working."
msgstr "Bloca els esdeveniments d'analítica del Freemius i elimina el domini de la subscripció al butlletí. Les plantilles i els elements continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:507
msgid "Blocks the StellarWP telemetry reports. Blocks, AI features and the template library keep working."
msgstr "Bloca els informes de telemetría de StellarWP. Els blocs, les funcions d'IA i la biblioteca de plantilles continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:516
msgid "Blocks the support ping and wizard reporting (store name, domain, list data). Order and subscriber synchronization keep working."
msgstr "Bloca el ping de suport i els informes de l'assistent (nom de la botiga, domini, dades de llistes). La sincronització de comandes i subscriptors continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:526
msgid "Blocks the Tracks analytics worker. Newsletter sending and subscribers keep working."
msgstr "Bloca el procés d'analítica Tracks. L'enviament de butlletins i els subscriptors continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:536
msgid "Removes the WordPress version, PHP version and language from the updater requests. The license key and site URL (account identifier) are kept."
msgstr "Elimina la versió del WordPress, la versió del PHP i la llengua de les peticions de l'actualitzador. La clau de llicència i la URL del lloc (identificador del compte) es conserven."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:546
msgid "Blocks the onboarding data sender (plugin and theme lists). Form integrations keep working."
msgstr "Bloca l'enviament de dades del procés de configuració inicial (llistes de complements i temes). Les integracions de formularis continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:555
msgid "Blocks the usage tracking (PHP version, WordPress version, server software, home URL, theme, admin email, settings). Galleries keep working."
msgstr "Bloca el seguiment d'ús (versió del PHP, versió del WordPress, programari del servidor, URL d'inici, tema, correu de l'administrador, ajustos). Les galeries continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:565
msgid "Removes the site data block (site URL and server IP) from the dispatcher requests. Forms and add-on services keep working."
msgstr "Elimina el bloc de dades del lloc (URL del lloc i IP del servidor) de les peticions del distribuïdor. Els formularis i els serveis d'extensions continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:569
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Demos and license activation keep working."
msgstr "Bloca els esdeveniments d'analítica del Freemius (llistes de complements i temes, versions, URL del lloc, llengua). Les demos i l'activació de la llicència continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:573
msgid "Blocks the Themeisle tracker and SDK logger (theme, plugin list, WordPress version). Blocks keep working."
msgstr "Bloca el rastrejador del Themeisle i el logger del SDK (tema, llista de complements, versió del WordPress). Els blocs continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:577
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Password protection is fully local."
msgstr "Bloca els esdeveniments d'analítica del Freemius (llistes de complements i temes, versions, URL del lloc, llengua). La protecció amb contrasenya és totalment local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:586
msgid "Blocks the weekly usage report (home URL, PHP/WordPress/MySQL versions, server software, multisite, plugin list, theme, locale, license, settings). PDF embedding keeps working."
msgstr "Bloca l'informe setmanal d'ús (URL d'inici, versions del PHP/WordPress/MySQL, programari del servidor, multilloc, llista de complements, tema, llengua, llicència, ajustos). La incrustació de PDF continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:597
msgid "Removes the language from the notifications requests. All accessibility widgets keep working."
msgstr "Elimina la llengua de les peticions de notificacions. Tots els ginys d'accessibilitat continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:612
msgid "Removes the PHP version and language from the Pro updater requests. The WordPress version, license and site URL (account identifier) are kept so updates keep working."
msgstr "Elimina la versió del PHP i la llengua de les peticions de l'actualitzador Pro. La versió del WordPress, la llicència i la URL del lloc (identificador del compte) es conserven perquè les actualitzacions continuïn funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:631
msgid "Blocks the telemetry check-in and the Google Analytics usage events, and removes the PHP version from the extension updater requests. Popups keep working."
msgstr "Bloca la comprovació periòdica de telemetría i els esdeveniments d'ús de Google Analytics, i elimina la versió del PHP de les peticions de l'actualitzador d'extensions. Les finestres emergents continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:644
msgid "Blocks the Freemius analytics events and removes the site URL from the notification requests. Mail delivery keeps working."
msgstr "Bloca els esdeveniments d'analítica del Freemius i elimina la URL del lloc de les peticions de notificacions. El lliurament de correu continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:658
msgid "Blocks the feedback and install pings (locale, theme and plugin lists, site domain, memory limit, execution time, used widgets). All addons keep working."
msgstr "Bloca els pings de comentaris i d'instal·lació (llengua, llistes de temes i complements, domini del lloc, límit de memòria, temps d'execució, ginys usats). Totes les extensions continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:668
msgid "Blocks the mailing-list subscribe (email, license, site URL). The vulnerability scan keeps sending your installed versions because checking them is its function."
msgstr "Bloca la subscripció a la llista de correu (correu, llicència, URL del lloc). L'anàlisi de vulnerabilitats continua enviant les vostres versions instal·lades perquè comprovar-les és la seva funció."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:677
msgid "Removes the theme name from the font-converter User-Agent. Font conversion keeps working."
msgstr "Elimina el nom del tema de la User-Agent del convertidor de tipus de lletra. La conversió de tipus de lletra continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:689
msgid "Blocks the Freemius analytics events and the usage events server. Templates and widgets keep working."
msgstr "Bloca els esdeveniments d'analítica del Freemius i el servidor d'esdeveniments d'ús. Les plantilles i els ginys continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:693
msgid "Blocks the Mixpanel telemetry. Content AI and module updates keep working."
msgstr "Bloca la telemetría del Mixpanel. Content AI i les actualitzacions de mòduls continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:703
msgid "Blocks the plugin-data telemetry (home URL, admin email, PHP version and limits, OS, WordPress version, user count, MySQL version, server software). Caching keeps working."
msgstr "Bloca la telemetría de dades del complement (URL d'inici, correu de l'administrador, versió i límits del PHP, sistema operatiu, versió del WordPress, nombre d'usuaris, versió del MySQL, programari del servidor). La memòria cau continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:713
msgid "Blocks the plugin-data telemetry (home URL, admin email, PHP and WordPress versions, user count, MySQL version, server software). Security hardening keeps working."
msgstr "Bloca la telemetría de dades del complement (URL d'inici, correu de l'administrador, versions del PHP i del WordPress, nombre d'usuaris, versió del MySQL, programari del servidor). L'enduriment de seguretat continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:717
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Shortcodes are fully local."
msgstr "Bloca els esdeveniments d'analítica del Freemius (llistes de complements i temes, versions, URL del lloc, llengua). Els shortcodes són totalment locals."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:727
msgid "Blocks the Posimyth tracker (site URL, PHP version, plugin slugs, theme, install time). Header effects keep working."
msgstr "Bloca el rastrejador del Posimyth (URL del lloc, versió del PHP, slugs de complements, tema, data d'instal·lació). Els efectes de capçalera continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:737
msgid "Removes the PHP version from the API lookups. The WordPress version and the plugin/theme versions are kept because the integrity checks are the service itself."
msgstr "Elimina la versió del PHP de les consultes a l'API. La versió del WordPress i les versions de complements i temes es conserven perquè les comprovacions d'integritat són el servei mateix."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:741
msgid "Blocks the BSF analytics report (domain, PHP OS, server software, MySQL/PHP versions, WordPress version). Forms and the AI builder keep working."
msgstr "Bloca l'informe d'analítica del BSF (domini, sistema operatiu del PHP, programari del servidor, versions del MySQL/PHP, versió del WordPress). Els formularis i el maquetador d'IA continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:745
msgid "Blocks the BSF analytics report (domain, PHP OS, server software, MySQL/PHP versions, WordPress version). SEO analysis keeps working."
msgstr "Bloca l'informe d'analítica del BSF (domini, sistema operatiu del PHP, programari del servidor, versions del MySQL/PHP, versió del WordPress). L'anàlisi SEO continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:749
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Tables are fully local."
msgstr "Bloca els esdeveniments d'analítica del Freemius (llistes de complements i temes, versions, URL del lloc, llengua). Les taules són totalment locals."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:759
msgid "Removes the server IP, site URL and version headers from every API request. Template downloads keep working with your token."
msgstr "Elimina la IP del servidor, la URL del lloc i les capçaleres de versió de cada petició a l'API. Les baixades de plantilles continuen funcionant amb el vostre testimoni."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:773
msgid "Blocks the StellarWP telemetry and removes the WordPress version, PHP version and user counts from the license/update validation. The domain is kept as the account identifier."
msgstr "Bloca la telemetría de StellarWP i elimina la versió del WordPress, la versió del PHP i els nombres d'usuaris de la validació de llicència/actualització. El domini es conserva com a identificador del compte."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:783
msgid "Blocks the weekly sync and the opt-in subscribe (home URL, email, name, plugin list, WordPress version, locale, PHP version). Translations keep working."
msgstr "Bloca la sincronització setmanal i la subscripció d'acceptació (URL d'inici, correu, nom, llista de complements, versió del WordPress, llengua, versió del PHP). Les traduccions continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:787
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Widgets keep working."
msgstr "Bloca els esdeveniments d'analítica del Freemius (llistes de complements i temes, versions, URL del lloc, llengua). Els ginys continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:797
msgid "Removes the Referer header (your network site URL) from the IP info lookups. Backups go to the destinations you configured."
msgstr "Elimina la capçalera Referer (la URL del lloc de la vostra xarxa) de les consultes d'informació d'IP. Les còpies de seguretat van a les destinacions que hàgiu configurat."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:807
msgid "Blocks the survey requests that include the home URL and email. CDN and cache configuration keep working."
msgstr "Bloca les peticions d'enquesta que inclouen la URL d'inici i el correu. La configuració de CDN i memòria cau continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:811
msgid "Blocks the BSF analytics report (WordPress version, PHP version, locale, site URL). Cart tracking and webhooks keep working."
msgstr "Bloca l'informe d'analítica del BSF (versió del WordPress, versió del PHP, llengua, URL del lloc). El seguiment del cistell i els webhooks continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:820
msgid "Blocks the feedback requests (server software, PHP version, MySQL version, WordPress and WooCommerce versions, locale, multisite). Checkout fields keep working."
msgstr "Bloca les peticions de comentaris (programari del servidor, versió del PHP, versió del MySQL, versions del WordPress i del WooCommerce, llengua, multilloc). Els camps de finalització de compra continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:830
msgid "Blocks the WooCommerce.com Tracks pixel (usage analytics). Store functionality and woocommerce.com connections keep working."
msgstr "Bloca el píxel de Tracks de WooCommerce.com (analítica d'ús). La funcionalitat de la botiga i les connexions amb woocommerce.com continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:840
msgid "Blocks the WooPay tracker pixel. Payments keep working."
msgstr "Bloca el píxel de seguiment del WooPay. Els pagaments continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:850
msgid "Blocks the deactivation feedback (PHP version, WordPress version, server info, plugin list, theme, settings). Swatches keep working."
msgstr "Bloca l'enquesta de desactivació (versió del PHP, versió del WordPress, informació del servidor, llista de complements, tema, ajustos). Les mostres continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:860
msgid "Removes the site URL, PHP and WordPress versions, user agent and PHP limits from the plugin-server requests. File management keeps working."
msgstr "Elimina la URL del lloc, les versions del PHP i del WordPress, l'agent d'usuari i els límits del PHP de les peticions al servidor de complements. La gestió de fitxers continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:869
msgid "Blocks the usage tracking (home URL, PHP version, WordPress version, MySQL version, server, form and entry counts). Forms keep working."
msgstr "Bloca el seguiment d'ús (URL d'inici, versió del PHP, versió del WordPress, versió del MySQL, servidor, recomptes de formularis i entrades). Els formularis continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:878
msgid "Blocks the WPBrigade telemetry (PHP version, WordPress version, server, MySQL version, locale, limits). Header and footer scripts keep working."
msgstr "Bloca la telemetría del WPBrigade (versió del PHP, versió del WordPress, servidor, versió del MySQL, llengua, límits). Els scripts de capçalera i peu continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:887
msgid "Blocks the usage tracking (MySQL version, server software, locale, theme, site count, mailer configuration). Mail delivery keeps working."
msgstr "Bloca el seguiment d'ús (versió del MySQL, programari del servidor, llengua, tema, nombre de llocs, configuració de correu). El lliurament de correu continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:891
msgid "Blocks the Themeisle SDK logger (theme, plugin list, WordPress version). The maintenance page is fully local."
msgstr "Bloca el logger del SDK del Themeisle (tema, llista de complements, versió del WordPress). La pàgina de manteniment és totalment local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:900
msgid "Removes the WordPress version from the re-smush.it User-Agent. Image optimization keeps working."
msgstr "Elimina la versió del WordPress de la User-Agent del re-smush.it. L'optimització d'imatges continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:910
msgid "Removes the WordPress version from the licensing requests. The license key and site URL (account identifier) are kept."
msgstr "Elimina la versió del WordPress de les peticions de llicenciació. La clau de llicència i la URL del lloc (identificador del compte) es conserven."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:920
msgid "Removes the WordPress environment block (domain, theme and version, full theme and plugin lists) from the connect requests. Review widgets keep working."
msgstr "Elimina el bloc d'entorn del WordPress (domini, tema i versió, llistes completes de temes i complements) de les peticions de connexió. Els ginys de ressenyes continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:930
msgid "Removes the locale and version headers from the promotions requests. SEO features and instant indexing keep working."
msgstr "Elimina les capçaleres de llengua i versió de les peticions de promocions. Les funcions SEO i la indexació instantània continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:934
msgid "Removes the WordPress version, home URL, plugin and theme lists from the WPMU DEV Hub payloads, and the site URL from the User-Agent. Image compression keeps working."
msgstr "Elimina la versió del WordPress, la URL d'inici i les llistes de complements i temes de les càrregues del WPMU DEV Hub, i la URL del lloc de la User-Agent. La compressió d'imatges continua funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:944
msgid "Blocks the anonymized usage reports (database version and type, aggregate counts). Statistics collection stays local."
msgstr "Bloca els informes d'ús anonimitzats (versió i tipus de base de dades, recomptes agregats). La recollida d'estadístiques continua sent local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:953
msgid "Blocks the deactivation feedback (PHP/MySQL/WordPress versions, site URL, theme, plugin list, email). Chat widgets keep working."
msgstr "Bloca l'enquesta de desactivació (versions del PHP/MySQL/WordPress, URL del lloc, tema, llista de complements, correu). Els ginys de xat continuen funcionant."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:963
msgid "Removes the language from the pricing lookups. The store currency is kept because prices depend on it."
msgstr "Elimina la llengua de les consultes de preus. La moneda de la botiga es conserva perquè els preus en depenen."

Binary file not shown.

View file

@ -0,0 +1,879 @@
# Translation of Telemetry disabler (by ROBOTSTXT) in Spanish (Spain).
# This file is distributed under the GPL-3.0-or-later.
msgid ""
msgstr ""
"Project-Id-Version: Telemetry disabler (by ROBOTSTXT) 1.1.4\n"
"Report-Msgid-Bugs-To: https://www.robotstxt.software/plugins/robotstxt-telemetry/\n"
"Last-Translator: ROBOTSTXT <hola@robotstxt.software>\n"
"Language-Team: ES <hola@robotstxt.software>\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"PO-Revision-Date: 2026-08-20 14:25+0000\n"
"X-Generator: manual\n"
"X-Domain: robotstxt-telemetry\n"
#. Description of the plugin
#: robotstxt-telemetry.php
msgid "Reduces the telemetry WordPress sends out and logs every outbound HTTP request, so your site shares less and you can see everything."
msgstr "Reduce la telemetría que WordPress envía y registra cada petición HTTP saliente, de modo que tu sitio comparte menos y tú puedes verlo todo."
#: includes/class-robotstxt-telemetry-admin.php:45
#: includes/class-robotstxt-telemetry-admin.php:46
#: includes/class-robotstxt-telemetry-admin.php:96
#: includes/class-robotstxt-telemetry-admin.php:97
msgid "Telemetry"
msgstr "Telemetría"
#: includes/class-robotstxt-telemetry-admin.php:55
#: includes/class-robotstxt-telemetry-admin.php:56
#: includes/class-robotstxt-telemetry-admin.php:106
#: includes/class-robotstxt-telemetry-admin.php:107
#: includes/class-robotstxt-telemetry-admin.php:524
msgid "Settings"
msgstr "Ajustes"
#: includes/class-robotstxt-telemetry-admin.php:64
#: includes/class-robotstxt-telemetry-admin.php:65
#: includes/class-robotstxt-telemetry-admin.php:115
#: includes/class-robotstxt-telemetry-admin.php:116
#: includes/class-robotstxt-telemetry-admin.php:525
msgid "Plugins"
msgstr "Plugins"
#: includes/class-robotstxt-telemetry-admin.php:73
#: includes/class-robotstxt-telemetry-admin.php:74
#: includes/class-robotstxt-telemetry-admin.php:125
#: includes/class-robotstxt-telemetry-admin.php:126
#: includes/class-robotstxt-telemetry-admin.php:526
msgid "Logs"
msgstr "Registros"
#: includes/class-robotstxt-telemetry-admin.php:430
msgid "Settings saved."
msgstr "Ajustes guardados."
#: includes/class-robotstxt-telemetry-admin.php:434
msgid "Configuration mode saved."
msgstr "Modo de configuración guardado."
#: includes/class-robotstxt-telemetry-admin.php:453
msgid "Telemetry Network Settings"
msgstr "Ajustes de telemetría de la red"
#: includes/class-robotstxt-telemetry-admin.php:464
#: includes/class-robotstxt-telemetry-admin.php:467
msgid "Configuration mode"
msgstr "Modo de configuración"
#: includes/class-robotstxt-telemetry-admin.php:469
msgid "Per-site"
msgstr "Por sitio"
#: includes/class-robotstxt-telemetry-admin.php:471
msgid "Global"
msgstr "Global"
#: includes/class-robotstxt-telemetry-admin.php:473
msgid "Per-site: every site keeps its own settings and its own log table, managed by each site administrator. Global: one shared configuration and one central log on the main site collect the outbound requests of the whole network; the Telemetry screens are then managed from here only."
msgstr "Por sitio: cada sitio mantiene sus propios ajustes y su propia tabla de registros, gestionados por cada administrador del sitio. Global: una configuración compartida y un registro central en el sitio principal recogen las peticiones salientes de toda la red; las pantallas de Telemetría se gestionan entonces únicamente desde aquí."
#: includes/class-robotstxt-telemetry-admin.php:479
msgid "Save configuration mode"
msgstr "Guardar modo de configuración"
#: includes/class-robotstxt-telemetry-admin.php:484
msgid "Switch to Global mode to manage the settings and the logs for the whole network from this screen."
msgstr "Cambia al modo Global para gestionar los ajustes y los registros de toda la red desde esta pantalla."
#: includes/class-robotstxt-telemetry-admin.php:527
msgid "General"
msgstr "General"
#: includes/class-robotstxt-telemetry-admin.php:530
msgid "Settings sections"
msgstr "Secciones de ajustes"
#: includes/class-robotstxt-telemetry-admin.php:566
msgid "Telemetry Settings"
msgstr "Ajustes de telemetría"
#: includes/class-robotstxt-telemetry-admin.php:605
#: includes/class-robotstxt-telemetry-admin.php:608
msgid "Outbound requests"
msgstr "Peticiones salientes"
#: includes/class-robotstxt-telemetry-admin.php:612
msgid "Send your URL"
msgstr "Enviar tu URL"
#: includes/class-robotstxt-telemetry-admin.php:613
msgid "Send a hash"
msgstr "Enviar un hash"
#: includes/class-robotstxt-telemetry-admin.php:614
msgid "Do not send anything"
msgstr "No enviar nada"
#: includes/class-robotstxt-telemetry-admin.php:622
msgid "Outbound requests normally identify this site in the User-Agent with its URL (for example \"WordPress/6.9; https://example.com/\"). \"Send a hash\" (default) replaces it with a fixed hash so the site is no longer identifiable; \"Do not send anything\" removes it completely."
msgstr "Las peticiones salientes normalmente identifican este sitio en el User-Agent con su URL (por ejemplo «WordPress/6.9; https://example.com/»). «Enviar un hash» (por defecto) la sustituye por un hash fijo para que el sitio deje de ser identificable; «No enviar nada» la elimina por completo."
#: includes/class-robotstxt-telemetry-admin.php:630
#: includes/class-robotstxt-telemetry-admin.php:633
msgid "WordPress version"
msgstr "Versión de WordPress"
#: includes/class-robotstxt-telemetry-admin.php:637
#: includes/class-robotstxt-telemetry-admin.php:818
msgid "Actual version"
msgstr "Versión real"
#: includes/class-robotstxt-telemetry-admin.php:638
msgid "Major version"
msgstr "Versión principal"
#: includes/class-robotstxt-telemetry-admin.php:639
msgid "Nulled version"
msgstr "Versión nula"
#: includes/class-robotstxt-telemetry-admin.php:647
msgid "The version reported in the User-Agent and in the WordPress.org version fields: the actual version (default), the major version with the rest masked (for example \"7.2.n\"), or a nulled version (\"0.0.0\"). The checksum and translation requests always use the real version so updates keep working."
msgstr "La versión comunicada en el User-Agent y en los campos de versión de WordPress.org: la versión real (por defecto), la versión principal con el resto enmascarado (por ejemplo «7.2.n»), o una versión nula («0.0.0»). Las peticiones de checksums y traducciones usan siempre la versión real para que las actualizaciones sigan funcionando."
#: includes/class-robotstxt-telemetry-admin.php:653
msgid "Installation language"
msgstr "Idioma de instalación"
#: includes/class-robotstxt-telemetry-admin.php:657
msgid "Send en_US as the language of outbound requests"
msgstr "Enviar en_US como idioma de las peticiones salientes"
#: includes/class-robotstxt-telemetry-admin.php:659
msgid "When enabled, requests to WordPress.org report English (United States) instead of the installation language. The translation endpoints keep using the real language so installed language packs keep receiving updates."
msgstr "Cuando está activado, las peticiones a WordPress.org informan de inglés (Estados Unidos) en lugar del idioma de instalación. Los puntos finales de traducción siguen usando el idioma real para que los paquetes de idioma instalados sigan recibiendo actualizaciones."
#: includes/class-robotstxt-telemetry-admin.php:665
msgid "Replace the WordPress News feed"
msgstr "Sustituir el feed de noticias de WordPress"
#: includes/class-robotstxt-telemetry-admin.php:666
msgid "Use WordPress Planet by Fair (planet.fair.pm) instead of wordpress.org/news for the Events and News dashboard widget"
msgstr "Usa WordPress Planet by Fair (planet.fair.pm) en lugar de wordpress.org/news para el widget del escritorio Eventos y noticias"
#: includes/class-robotstxt-telemetry-admin.php:669
msgid "Replace the WordPress Events service"
msgstr "Sustituir el servicio de eventos de WordPress"
#: includes/class-robotstxt-telemetry-admin.php:670
msgid "Use WordPress Events by The WP World (api.fair.pm) instead of api.wordpress.org/events, sending the same request data"
msgstr "Usa WordPress Events by The WP World (api.fair.pm) en lugar de api.wordpress.org/events, enviando los mismos datos de la petición"
#: includes/class-robotstxt-telemetry-admin.php:673
msgid "Disable the WordPress browser check"
msgstr "Desactivar la comprobación del navegador de WordPress"
#: includes/class-robotstxt-telemetry-admin.php:674
msgid "Do not send the browser version to api.wordpress.org/core/browse-happy; the browser is always reported as compatible"
msgstr "No envía la versión del navegador a api.wordpress.org/core/browse-happy; el navegador siempre se informa como compatible"
#: includes/class-robotstxt-telemetry-admin.php:692
msgid "WordPress Core version check"
msgstr "Comprobación de la versión del núcleo de WordPress"
#: includes/class-robotstxt-telemetry-admin.php:693
msgid "Safe sends only the WordPress version, PHP version, locale, MySQL version, and update channel. Original also sends site counts, database history, PHP extensions, and platform details."
msgstr "Seguro envía únicamente la versión de WordPress, la versión de PHP, el idioma, la versión de MySQL y el canal de actualizaciones. Original envía también los recuentos del sitio, el historial de la base de datos, las extensiones de PHP y los detalles de la plataforma."
#: includes/class-robotstxt-telemetry-admin.php:696
msgid "WordPress Themes version check"
msgstr "Comprobación de la versión de los temas de WordPress"
#: includes/class-robotstxt-telemetry-admin.php:697
msgid "Safe sends only the theme name, version, update URI, template, and stylesheet, plus the translation revision date and site locale. Original also sends author details and other theme metadata."
msgstr "Seguro envía únicamente el nombre del tema, la versión, el URI de actualización, la plantilla y la hoja de estilos, además de la fecha de revisión de la traducción y el idioma del sitio. Original envía también los datos del autor y otros metadatos del tema."
#: includes/class-robotstxt-telemetry-admin.php:700
msgid "WordPress Plugins version check"
msgstr "Comprobación de la versión de los plugins de WordPress"
#: includes/class-robotstxt-telemetry-admin.php:701
msgid "Safe sends only the plugin version, update URI, and requirements, plus the translation revision date, locale, and the \"all\" flag. Original also sends names, descriptions, authors, and other plugin metadata."
msgstr "Seguro envía únicamente la versión del plugin, el URI de actualización y los requisitos, además de la fecha de revisión de la traducción, el idioma y el marcador «all». Original envía también nombres, descripciones, autores y otros metadatos de los plugins."
#: includes/class-robotstxt-telemetry-admin.php:713
msgid "Original"
msgstr "Original"
#: includes/class-robotstxt-telemetry-admin.php:715
msgid "Safe"
msgstr "Seguro"
#: includes/class-robotstxt-telemetry-admin.php:732
#: includes/class-robotstxt-telemetry-admin.php:734
msgid "Log retention"
msgstr "Retención de registros"
#: includes/class-robotstxt-telemetry-admin.php:738
msgid "12 hours"
msgstr "12 horas"
#: includes/class-robotstxt-telemetry-admin.php:739
msgid "1 day"
msgstr "1 día"
#: includes/class-robotstxt-telemetry-admin.php:740
msgid "3 days"
msgstr "3 días"
#: includes/class-robotstxt-telemetry-admin.php:753
msgid "Logs older than the selected period are deleted (12 hours by default). A maximum of 1000 entries is always kept; the cleanup runs when browsing the logs and twice a day automatically."
msgstr "Los registros anteriores al período seleccionado se eliminan (12 horas por defecto). Siempre se conserva un máximo de 1000 entradas; la limpieza se ejecuta al consultar los registros y automáticamente dos veces al día."
#: includes/class-robotstxt-telemetry-admin.php:760
msgid "Uninstall behavior"
msgstr "Comportamiento al desinstalar"
#: includes/class-robotstxt-telemetry-admin.php:764
msgid "Delete all telemetry logs and plugin options on uninstall"
msgstr "Eliminar todos los registros de telemetría y los ajustes del plugin al desinstalar"
#: includes/class-robotstxt-telemetry-admin.php:766
msgid "By default, all telemetry logs are preserved when the plugin is uninstalled."
msgstr "Por defecto, todos los registros de telemetría se conservan al desinstalar el plugin."
#: includes/class-robotstxt-telemetry-admin.php:805
msgid "Telemetry - Plugins"
msgstr "Telemetría - Plugins"
#: includes/class-robotstxt-telemetry-admin.php:807
msgid "Plugin modes saved."
msgstr "Modos de los plugins guardados."
#: includes/class-robotstxt-telemetry-admin.php:809
msgid "Every installed plugin with a known telemetry behavior is listed below. In Safe mode the known telemetry endpoints are blocked or reduced to the minimum data each service needs to work; in Original mode the plugin behaves exactly as it would without Telemetry disabler. The tested version is the plugin version the Safe profile was verified against."
msgstr "A continuación se lista cada plugin instalado con un comportamiento de telemetría conocido. En modo Seguro los puntos finales de telemetría conocidos se bloquean o se reducen a los datos mínimos que cada servicio necesita para funcionar; en modo Original el plugin se comporta exactamente como lo haría sin Telemetry disabler. La versión probada es la versión del plugin con la que se verificó el perfil Seguro."
#: includes/class-robotstxt-telemetry-admin.php:816
msgid "Safe Mode"
msgstr "Modo seguro"
#: includes/class-robotstxt-telemetry-admin.php:817
#: includes/class-robotstxt-telemetry-admin.php:968
msgid "Plugin"
msgstr "Plugin"
#: includes/class-robotstxt-telemetry-admin.php:819
msgid "Tested version"
msgstr "Versión probada"
#: includes/class-robotstxt-telemetry-admin.php:820
msgid "Description"
msgstr "Descripción"
#. translators: %s: Plugin name.
#: includes/class-robotstxt-telemetry-admin.php:835
#: includes/class-robotstxt-telemetry-admin.php:836
#, php-format
msgid "Safe Mode for %s"
msgstr "Modo seguro para %s"
#: includes/class-robotstxt-telemetry-admin.php:846
msgid "Save plugin modes"
msgstr "Guardar los modos de los plugins"
#: includes/class-robotstxt-telemetry-admin.php:956
msgid "The plugins checked below are never sent to WordPress.org: they are excluded from the plugin update check (including their translations and the active list). That also means they will not receive update notifications from WordPress.org."
msgstr "Los plugins marcados a continuación nunca se envían a WordPress.org: quedan excluidos de la comprobación de actualizaciones de plugins (incluidas sus traducciones y la lista de activos). Eso significa también que no recibirán notificaciones de actualización de WordPress.org."
#: includes/class-robotstxt-telemetry-admin.php:957
msgid "Recommendation: keep external or private plugins (those not hosted on WordPress.org) checked, since they do not receive WordPress.org updates anyway and nothing is gained by reporting them."
msgstr "Recomendación: deja marcados los plugins externos o privados (los no alojados en WordPress.org), ya que no reciben actualizaciones de WordPress.org de todos modos y no se gana nada informando de ellos."
#: includes/class-robotstxt-telemetry-admin.php:966
msgid "Hide from WordPress.org"
msgstr "Ocultar a WordPress.org"
#: includes/class-robotstxt-telemetry-admin.php:967
msgid "Status"
msgstr "Estado"
#: includes/class-robotstxt-telemetry-admin.php:969
msgid "Version"
msgstr "Versión"
#: includes/class-robotstxt-telemetry-admin.php:990
msgid "Always hidden"
msgstr "Siempre oculto"
#: includes/class-robotstxt-telemetry-admin.php:990
msgid "Active"
msgstr "Activo"
#: includes/class-robotstxt-telemetry-admin.php:990
msgid "Inactive"
msgstr "Inactivo"
#: includes/class-robotstxt-telemetry-admin.php:1023
msgid "Telemetry Logs"
msgstr "Registros de telemetría"
#: includes/class-robotstxt-telemetry-admin.php:1043
msgid "All log entries deleted."
msgstr "Se han eliminado todas las entradas del registro."
#: includes/class-robotstxt-telemetry-admin.php:1045
msgid "Log entry deleted."
msgstr "Entrada del registro eliminada."
#: includes/class-robotstxt-telemetry-admin.php:1059
msgid "Delete all logs"
msgstr "Eliminar todos los registros"
#: includes/class-robotstxt-telemetry-admin.php:1079
msgid "You are about to permanently delete all telemetry log entries. This action cannot be undone."
msgstr "Estás a punto de eliminar permanentemente todas las entradas del registro de telemetría. Esta acción no se puede deshacer."
#: includes/class-robotstxt-telemetry-admin.php:1087
msgid "Yes, delete all logs"
msgstr "Sí, eliminar todos los registros"
#: includes/class-robotstxt-telemetry-admin.php:1088
msgid "Cancel"
msgstr "Cancelar"
#: includes/class-robotstxt-telemetry-admin.php:1102
msgid "Log entry not found."
msgstr "No se ha encontrado la entrada del registro."
#: includes/class-robotstxt-telemetry-admin.php:1106
msgid "Back to logs"
msgstr "Volver a los registros"
#: includes/class-robotstxt-telemetry-admin.php:1110
#: includes/class-robotstxt-telemetry-logs-table.php:49
msgid "Date"
msgstr "Fecha"
#: includes/class-robotstxt-telemetry-admin.php:1111
#: includes/class-robotstxt-telemetry-logs-table.php:50
msgid "Method"
msgstr "Método"
#: includes/class-robotstxt-telemetry-admin.php:1112
msgid "URL"
msgstr "URL"
#: includes/class-robotstxt-telemetry-admin.php:1113
#: includes/class-robotstxt-telemetry-logs-table.php:51
#: includes/class-robotstxt-telemetry-logs-table.php:245
msgid "Host"
msgstr "Host"
#: includes/class-robotstxt-telemetry-admin.php:1114
#: includes/class-robotstxt-telemetry-logs-table.php:52
msgid "Path"
msgstr "Ruta"
#: includes/class-robotstxt-telemetry-admin.php:1115
msgid "Body Params"
msgstr "Parámetros del cuerpo"
#: includes/class-robotstxt-telemetry-admin.php:1116
msgid "Headers"
msgstr "Cabeceras"
#: includes/class-robotstxt-telemetry-admin.php:1117
msgid "User Agent"
msgstr "User Agent"
#: includes/class-robotstxt-telemetry-admin.php:1118
msgid "Raw Body"
msgstr "Cuerpo sin procesar"
#: includes/class-robotstxt-telemetry-admin.php:1119
msgid "Caller"
msgstr "Originador"
#: includes/class-robotstxt-telemetry-admin.php:1140
msgid "Telemetry Analysis"
msgstr "Análisis de telemetría"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:74
msgid "Environment"
msgstr "Entorno"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:78
msgid "Extensions"
msgstr "Extensiones"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:82
msgid "Platform Flags"
msgstr "Indicadores de plataforma"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:86
msgid "Image Support"
msgstr "Soporte de imágenes"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:90
msgid "Other URL Parameters"
msgstr "Otros parámetros de la URL"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:117
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:119
msgid "Translations"
msgstr "Traducciones"
#: includes/class-robotstxt-telemetry-analysis-api-wordpress-org.php:124
msgid "Other Body Parameters"
msgstr "Otros parámetros del cuerpo"
#: includes/class-robotstxt-telemetry-analysis.php:45
msgid "URL Parameters"
msgstr "Parámetros de la URL"
#: includes/class-robotstxt-telemetry-analysis.php:50
msgid "Body Parameters"
msgstr "Parámetros del cuerpo"
#: includes/class-robotstxt-telemetry-logs-table.php:173
msgid "View"
msgstr "Ver"
#: includes/class-robotstxt-telemetry-logs-table.php:174
msgid "Delete"
msgstr "Eliminar"
#: includes/class-robotstxt-telemetry-logs-table.php:225
msgid "Filter by method"
msgstr "Filtrar por método"
#: includes/class-robotstxt-telemetry-logs-table.php:227
msgid "All methods"
msgstr "Todos los métodos"
#: includes/class-robotstxt-telemetry-logs-table.php:241
msgid "Filter by host"
msgstr "Filtrar por host"
#: includes/class-robotstxt-telemetry-logs-table.php:248
msgid "From date"
msgstr "Desde la fecha"
#: includes/class-robotstxt-telemetry-logs-table.php:254
msgid "To date"
msgstr "Hasta la fecha"
#: includes/class-robotstxt-telemetry-logs-table.php:260
msgid "Filter"
msgstr "Filtrar"
#. translators: 1: Manager plugin URL, 2: link text.
#: includes/class-robotstxt-telemetry-manager-notice.php:139
#, php-format
msgid "To receive updates for Telemetry disabler (by ROBOTSTXT), the <a href=\"%1$s\">%2$s</a> plugin must be installed and active."
msgstr "Para recibir actualizaciones de Telemetry disabler (by ROBOTSTXT), el plugin <a href=\"%1$s\">%2$s</a> debe estar instalado y activo."
#: includes/class-robotstxt-telemetry-manager-notice.php:141
msgid "Manager (by ROBOTSTXT)"
msgstr "Manager (by ROBOTSTXT)"
#: includes/class-robotstxt-telemetry-manager-notice.php:178
msgid "You do not have sufficient permissions to perform this action."
msgstr "No tienes permisos suficientes para realizar esta acción."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:61
msgid "Blocks the analytics.adinserter.pro telemetry (site URL, site name, WordPress and PHP versions, admin email, plugin list and options). Update checks keep working."
msgstr "Bloquea la telemetría de analytics.adinserter.pro (URL del sitio, nombre del sitio, versiones de WordPress y PHP, correo del administrador, lista de plugins y ajustes). Las comprobaciones de actualizaciones siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:70
msgid "Removes the WordPress version and site URL from the API User-Agent. The connect flow keeps sending the site URL because it is the account identifier."
msgstr "Elimina la versión de WordPress y la URL del sitio del User-Agent de la API. El flujo de conexión sigue enviando la URL del sitio porque es el identificador de la cuenta."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:80
msgid "Removes the site URL and the admin email from the extension update-check query. Extension updates keep working (they only need the purchased extension slug and version)."
msgstr "Elimina la URL del sitio y el correo del administrador de la consulta de comprobación de actualizaciones de extensiones. Las actualizaciones de extensiones siguen funcionando (solo necesitan el slug y la versión de la extensión comprada)."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:93
msgid "Blocks the comment-language check (which sends the comment text) and the IP country lookup. All the local spam checks keep working."
msgstr "Bloquea la comprobación del idioma de los comentarios (que envía el texto del comentario) y la consulta del país por IP. Todas las comprobaciones antispam locales siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:108
msgid "Removes the site URL from the starter-template requests. License validation keeps sending the site URL because it is the account identifier."
msgstr "Elimina la URL del sitio de las peticiones de plantillas iniciales. La validación de la licencia sigue enviando la URL del sitio porque es el identificador de la cuenta."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:117
msgid "Blocks the usage ping. The critical CSS service keeps receiving the page URL because generating the CSS for a page requires that page URL."
msgstr "Bloquea el ping de uso. El servicio de CSS crítico sigue recibiendo la URL de la página porque generar el CSS de una página requiere esa URL."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:121
msgid "Blocks the Mixpanel telemetry events (which include the site host and versions). Backup destinations are admin-configured and untouched."
msgstr "Bloquea los eventos de telemetría de Mixpanel (que incluyen el host del sitio y las versiones). Los destinos de las copias de seguridad se configuran en la administración y no se tocan."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:130
msgid "Blocks the StellarWP telemetry reports. The brute-force network and licensing keep working."
msgstr "Bloquea los informes de telemetría de StellarWP. La red de fuerza bruta y las licencias siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:140
msgid "Removes the Referer header (your site URL) from the Sucuri site-check requests. The scan itself keeps working."
msgstr "Elimina la cabecera Referer (la URL de tu sitio) de las peticiones de comprobación del sitio de Sucuri. El análisis en sí sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:144
msgid "Removes the WordPress version, home URL, plugin and theme lists from the WPMU DEV Hub payloads, and the site URL from the User-Agent. The Hub connection keeps the domain as the account identifier."
msgstr "Elimina la versión de WordPress, la URL de inicio y las listas de plugins y temas de las cargas de WPMU DEV Hub, y la URL del sitio del User-Agent. La conexión con el Hub conserva el dominio como identificador de la cuenta."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:153
msgid "Removes the WordPress version and site URL from the API User-Agent. Link analysis keeps working."
msgstr "Elimina la versión de WordPress y la URL del sitio del User-Agent de la API. El análisis de enlaces sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:163
msgid "Blocks the aggregated statistics telemetry. License checks keep sending the site URL as the account identifier."
msgstr "Bloquea la telemetría de estadísticas agregadas. Las comprobaciones de licencia siguen enviando la URL del sitio como identificador de la cuenta."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:172
msgid "Removes the WordPress version, PHP version and site URL from the API User-Agent. All button features keep working."
msgstr "Elimina la versión de WordPress, la versión de PHP y la URL del sitio del User-Agent de la API. Todas las funciones de los botones siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:182
msgid "Blocks the NPS survey requests that automatically attach the admin name and email. Template downloads keep working."
msgstr "Bloquea las peticiones de la encuesta NPS que adjuntan automáticamente el nombre y el correo del administrador. Las descargas de plantillas siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:191
msgid "Blocks the feedback and support pings that send the site URL. The chat channels keep working."
msgstr "Bloquea los pings de comentarios y soporte que envían la URL del sitio. Los canales de chat siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:201
msgid "Blocks the deactivation feedback (WordPress version, PHP version, site URL, language, theme, plugin list, server software). Chat widgets keep working."
msgstr "Bloquea la encuesta de desactivación (versión de WordPress, versión de PHP, URL del sitio, idioma, tema, lista de plugins, software del servidor). Los widgets de chat siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:211
msgid "Removes the site host from the cloud search queries. Cloud search keeps working with the account token."
msgstr "Elimina el host del sitio de las consultas de búsqueda en la nube. La búsqueda en la nube sigue funcionando con el token de la cuenta."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:221
msgid "Removes the WordPress version from the license requests. The license key, site URL (account identifier) and installed version (needed for updates) are kept."
msgstr "Elimina la versión de WordPress de las peticiones de licencia. La clave de licencia, la URL del sitio (identificador de la cuenta) y la versión instalada (necesaria para las actualizaciones) se conservan."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:225
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). License activation keeps working."
msgstr "Bloquea los eventos de analítica de Freemius (listas de plugins y temas, versiones, URL del sitio, idioma). La activación de la licencia sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:235
msgid "Blocks the uninstall feedback (MySQL, WordPress and WooCommerce versions, locale, multisite flag). The cookie scanner keeps sending the scanned URLs because that is its function."
msgstr "Bloquea la encuesta de desinstalación (versiones de MySQL, WordPress y WooCommerce, idioma, indicador de multisitio). El escáner de cookies sigue enviando las URLs escaneadas porque esa es su función."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:245
msgid "Blocks the deactivation feedback that sends the site URL. The notice and the account service keep working."
msgstr "Bloquea la encuesta de desactivación que envía la URL del sitio. El aviso y el servicio de cuentas siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:254
msgid "Blocks the usage tracker (WordPress version, PHP version, server IP, MySQL version, locale, plugin list). Post duplication is fully local."
msgstr "Bloquea el rastreador de uso (versión de WordPress, versión de PHP, IP del servidor, versión de MySQL, idioma, lista de plugins). La duplicación de entradas es totalmente local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:264
msgid "Removes the site URL and language from the newsletter subscribe. The admin-entered email is kept (it is an explicit subscription)."
msgstr "Elimina la URL del sitio y el idioma de la suscripción al boletín. El correo introducido por el administrador se conserva (es una suscripción explícita)."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:268
msgid "Blocks the BSF analytics report (site URL, WordPress/PHP/MySQL versions, user count, language, timezone, plugin list, server software). Font uploads are unaffected."
msgstr "Bloquea el informe de analítica de BSF (URL del sitio, versiones de WordPress/PHP/MySQL, número de usuarios, idioma, zona horaria, lista de plugins, software del servidor). La subida de fuentes no se ve afectada."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:281
msgid "Blocks the usage tracker and its country lookup (site URL, plugin slug, server IP). Comment disabling is fully local."
msgstr "Bloquea el rastreador de uso y su consulta del país (URL del sitio, slug del plugin, IP del servidor). La desactivación de comentarios es totalmente local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:290
msgid "Removes the site URL from the geo-lookup User-Agent. Mail delivery keeps working with your mailer credentials only."
msgstr "Elimina la URL del sitio del User-Agent de la geolocalización. La entrega de correo sigue funcionando únicamente con tus credenciales de correo."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:301
msgid "Removes the language and API version from the feedback surveys. The template library and the connect flow (site URL as account identifier) are untouched."
msgstr "Elimina el idioma y la versión de la API de las encuestas de comentarios. La biblioteca de plantillas y el flujo de conexión (la URL del sitio como identificador de la cuenta) no se tocan."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:312
msgid "Removes the WordPress version, PHP version and site URL from the unsubscribe feedback. Widgets and modules are unaffected."
msgstr "Elimina la versión de WordPress, la versión de PHP y la URL del sitio de la encuesta de baja. Los widgets y los módulos no se ven afectados."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:322
msgid "Removes the site URL and the WordPress/PHP version block from the ShortPixel key check. The API key alone is enough to validate the account."
msgstr "Elimina la URL del sitio y el bloque de versiones de WordPress/PHP de la comprobación de la clave de ShortPixel. La clave de API por sí sola basta para validar la cuenta."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:332
msgid "Blocks the usage tracker (site URL, site name, WordPress version, language, PHP version, admin email). Elements and templates keep working."
msgstr "Bloquea el rastreador de uso (URL del sitio, nombre del sitio, versión de WordPress, idioma, versión de PHP, correo del administrador). Los elementos y las plantillas siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:341
msgid "Blocks the weekly check-in (plugin list, locale, WordPress version, OS, limits, image counts). Local and cloud optimization keep working."
msgstr "Bloquea la comprobación semanal (lista de plugins, idioma, versión de WordPress, sistema operativo, límites, recuentos de imágenes). La optimización local y en la nube sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:356
msgid "Removes the WordPress version, language, site title, site profile and Referer header from the AI requests. The AI assistance keeps working with the prompt content only."
msgstr "Elimina la versión de WordPress, el idioma, el título del sitio, el perfil del sitio y la cabecera Referer de las peticiones de IA. La asistencia de IA sigue funcionando únicamente con el contenido de la indicación."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:366
msgid "Blocks the tracker (WordPress version, PHP version, MySQL version, server software, plugin list, admin email, IP). Form integrations keep working."
msgstr "Bloquea el rastreador (versión de WordPress, versión de PHP, versión de MySQL, software del servidor, lista de plugins, correo del administrador, IP). Las integraciones de formularios siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:376
msgid "Blocks the opt-in ping and the failed-mail notifications (which include email metadata). Mail delivery keeps working with your mailer credentials only."
msgstr "Bloquea el ping de aceptación y las notificaciones de correo fallido (que incluyen metadatos del correo). La entrega de correo sigue funcionando únicamente con tus credenciales de correo."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:385
msgid "Blocks the usage snapshot (UUID, WordPress/PHP/MySQL versions, OS, locale, plugin list, form counts) and the onboarding email collection. Forms keep working."
msgstr "Bloquea la instantánea de uso (UUID, versiones de WordPress/PHP/MySQL, sistema operativo, idioma, lista de plugins, recuentos de formularios) y la recogida de correo del proceso de configuración inicial. Los formularios siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:389
msgid "Removes the WordPress version, home URL, plugin and theme lists from the WPMU DEV Hub payloads, and the site URL from the User-Agent. The domain is kept as the account identifier."
msgstr "Elimina la versión de WordPress, la URL de inicio y las listas de plugins y temas de las cargas de WPMU DEV Hub, y la URL del sitio del User-Agent. El dominio se conserva como identificador de la cuenta."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:398
#: includes/class-robotstxt-telemetry-plugin-profiles.php:407
msgid "Blocks the check-in (plugin list, locale, home URL). Your Google Analytics measurement keeps working."
msgstr "Bloquea la comprobación periódica (lista de plugins, idioma, URL de inicio). Tu medición de Google Analytics sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:417
msgid "Removes the WordPress version, PHP version and user count from the Site Kit feature reports. Search Console, Analytics and AdSense integrations keep working."
msgstr "Elimina la versión de WordPress, la versión de PHP y el número de usuarios de los informes de funciones de Site Kit. Las integraciones con Search Console, Analytics y AdSense siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:430
msgid "Blocks the Google Analytics usage ping and the beta-consent ping (WordPress version, PHP version, post count, email, domain, language). Search-engine pings keep working."
msgstr "Bloquea el ping de uso de Google Analytics y el ping de consentimiento para betas (versión de WordPress, versión de PHP, número de entradas, correo, dominio, idioma). Los pings a motores de búsqueda siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:440
msgid "Blocks the Appsero insights (site URL, PHP version, MySQL, server software, WordPress version). License and update checks keep working."
msgstr "Bloquea la información de Appsero (URL del sitio, versión de PHP, MySQL, software del servidor, versión de WordPress). Las comprobaciones de licencia y actualizaciones siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:444
msgid "Blocks the BSF analytics report (site URL, PHP/WordPress versions, network URL, plugin list). Header and footer builder keep working."
msgstr "Bloquea el informe de analítica de BSF (URL del sitio, versiones de PHP/WordPress, URL de la red, lista de plugins). El constructor de cabecera y pie sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:454
msgid "Blocks the event reporting that sends your domain. Hosting management actions keep working with your token."
msgstr "Bloquea los informes de eventos que envían tu dominio. Las acciones de gestión del alojamiento siguen funcionando con tu token."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:458
msgid "Blocks the Mixpanel telemetry events (which include the WordPress version). Image optimization keeps working with your API key."
msgstr "Bloquea los eventos de telemetría de Mixpanel (que incluyen la versión de WordPress). La optimización de imágenes sigue funcionando con tu clave de API."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:469
msgid "Removes the language from the notifications requests. Image optimization and connect keep working."
msgstr "Elimina el idioma de las peticiones de notificaciones. La optimización de imágenes y la conexión siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:484
msgid "Blocks the usage check-in (environment payload with a site-URL User-Agent). Feeds keep working with your access tokens."
msgstr "Bloquea la comprobación periódica de uso (carga de entorno con un User-Agent con la URL del sitio). Los feeds siguen funcionando con tus tokens de acceso."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:498
msgid "Blocks the Freemius analytics events and removes the domain from the newsletter subscribe. Templates and elements keep working."
msgstr "Bloquea los eventos de analítica de Freemius y elimina el dominio de la suscripción al boletín. Las plantillas y los elementos siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:507
msgid "Blocks the StellarWP telemetry reports. Blocks, AI features and the template library keep working."
msgstr "Bloquea los informes de telemetría de StellarWP. Los bloques, las funciones de IA y la biblioteca de plantillas siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:516
msgid "Blocks the support ping and wizard reporting (store name, domain, list data). Order and subscriber synchronization keep working."
msgstr "Bloquea el ping de soporte y los informes del asistente (nombre de la tienda, dominio, datos de listas). La sincronización de pedidos y suscriptores sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:526
msgid "Blocks the Tracks analytics worker. Newsletter sending and subscribers keep working."
msgstr "Bloquea el proceso de analítica Tracks. El envío de boletines y los suscriptores siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:536
msgid "Removes the WordPress version, PHP version and language from the updater requests. The license key and site URL (account identifier) are kept."
msgstr "Elimina la versión de WordPress, la versión de PHP y el idioma de las peticiones del actualizador. La clave de licencia y la URL del sitio (identificador de la cuenta) se conservan."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:546
msgid "Blocks the onboarding data sender (plugin and theme lists). Form integrations keep working."
msgstr "Bloquea el envío de datos del proceso de configuración inicial (listas de plugins y temas). Las integraciones de formularios siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:555
msgid "Blocks the usage tracking (PHP version, WordPress version, server software, home URL, theme, admin email, settings). Galleries keep working."
msgstr "Bloquea el seguimiento de uso (versión de PHP, versión de WordPress, software del servidor, URL de inicio, tema, correo del administrador, ajustes). Las galerías siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:565
msgid "Removes the site data block (site URL and server IP) from the dispatcher requests. Forms and add-on services keep working."
msgstr "Elimina el bloque de datos del sitio (URL del sitio e IP del servidor) de las peticiones del despachador. Los formularios y los servicios de extensiones siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:569
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Demos and license activation keep working."
msgstr "Bloquea los eventos de analítica de Freemius (listas de plugins y temas, versiones, URL del sitio, idioma). Las demos y la activación de la licencia siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:573
msgid "Blocks the Themeisle tracker and SDK logger (theme, plugin list, WordPress version). Blocks keep working."
msgstr "Bloquea el rastreador de Themeisle y el logger del SDK (tema, lista de plugins, versión de WordPress). Los bloques siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:577
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Password protection is fully local."
msgstr "Bloquea los eventos de analítica de Freemius (listas de plugins y temas, versiones, URL del sitio, idioma). La protección por contraseña es totalmente local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:586
msgid "Blocks the weekly usage report (home URL, PHP/WordPress/MySQL versions, server software, multisite, plugin list, theme, locale, license, settings). PDF embedding keeps working."
msgstr "Bloquea el informe semanal de uso (URL de inicio, versiones de PHP/WordPress/MySQL, software del servidor, multisitio, lista de plugins, tema, idioma, licencia, ajustes). La incrustación de PDF sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:597
msgid "Removes the language from the notifications requests. All accessibility widgets keep working."
msgstr "Elimina el idioma de las peticiones de notificaciones. Todos los widgets de accesibilidad siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:612
msgid "Removes the PHP version and language from the Pro updater requests. The WordPress version, license and site URL (account identifier) are kept so updates keep working."
msgstr "Elimina la versión de PHP y el idioma de las peticiones del actualizador Pro. La versión de WordPress, la licencia y la URL del sitio (identificador de la cuenta) se conservan para que las actualizaciones sigan funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:631
msgid "Blocks the telemetry check-in and the Google Analytics usage events, and removes the PHP version from the extension updater requests. Popups keep working."
msgstr "Bloquea la comprobación periódica de telemetría y los eventos de uso de Google Analytics, y elimina la versión de PHP de las peticiones del actualizador de extensiones. Las ventanas emergentes siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:644
msgid "Blocks the Freemius analytics events and removes the site URL from the notification requests. Mail delivery keeps working."
msgstr "Bloquea los eventos de analítica de Freemius y elimina la URL del sitio de las peticiones de notificaciones. La entrega de correo sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:658
msgid "Blocks the feedback and install pings (locale, theme and plugin lists, site domain, memory limit, execution time, used widgets). All addons keep working."
msgstr "Bloquea los pings de comentarios y de instalación (idioma, listas de temas y plugins, dominio del sitio, límite de memoria, tiempo de ejecución, widgets usados). Todas las extensiones siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:668
msgid "Blocks the mailing-list subscribe (email, license, site URL). The vulnerability scan keeps sending your installed versions because checking them is its function."
msgstr "Bloquea la suscripción a la lista de correo (correo, licencia, URL del sitio). El análisis de vulnerabilidades sigue enviando tus versiones instaladas porque comprobarlas es su función."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:677
msgid "Removes the theme name from the font-converter User-Agent. Font conversion keeps working."
msgstr "Elimina el nombre del tema del User-Agent del conversor de fuentes. La conversión de fuentes sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:689
msgid "Blocks the Freemius analytics events and the usage events server. Templates and widgets keep working."
msgstr "Bloquea los eventos de analítica de Freemius y el servidor de eventos de uso. Las plantillas y los widgets siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:693
msgid "Blocks the Mixpanel telemetry. Content AI and module updates keep working."
msgstr "Bloquea la telemetría de Mixpanel. Content AI y las actualizaciones de módulos siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:703
msgid "Blocks the plugin-data telemetry (home URL, admin email, PHP version and limits, OS, WordPress version, user count, MySQL version, server software). Caching keeps working."
msgstr "Bloquea la telemetría de datos del plugin (URL de inicio, correo del administrador, versión y límites de PHP, sistema operativo, versión de WordPress, número de usuarios, versión de MySQL, software del servidor). La caché sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:713
msgid "Blocks the plugin-data telemetry (home URL, admin email, PHP and WordPress versions, user count, MySQL version, server software). Security hardening keeps working."
msgstr "Bloquea la telemetría de datos del plugin (URL de inicio, correo del administrador, versiones de PHP y WordPress, número de usuarios, versión de MySQL, software del servidor). El endurecimiento de seguridad sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:717
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Shortcodes are fully local."
msgstr "Bloquea los eventos de analítica de Freemius (listas de plugins y temas, versiones, URL del sitio, idioma). Los shortcodes son totalmente locales."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:727
msgid "Blocks the Posimyth tracker (site URL, PHP version, plugin slugs, theme, install time). Header effects keep working."
msgstr "Bloquea el rastreador de Posimyth (URL del sitio, versión de PHP, slugs de plugins, tema, fecha de instalación). Los efectos de cabecera siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:737
msgid "Removes the PHP version from the API lookups. The WordPress version and the plugin/theme versions are kept because the integrity checks are the service itself."
msgstr "Elimina la versión de PHP de las consultas a la API. La versión de WordPress y las versiones de plugins y temas se conservan porque las comprobaciones de integridad son el servicio en sí."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:741
msgid "Blocks the BSF analytics report (domain, PHP OS, server software, MySQL/PHP versions, WordPress version). Forms and the AI builder keep working."
msgstr "Bloquea el informe de analítica de BSF (dominio, sistema operativo de PHP, software del servidor, versiones de MySQL/PHP, versión de WordPress). Los formularios y el maquetador de IA siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:745
msgid "Blocks the BSF analytics report (domain, PHP OS, server software, MySQL/PHP versions, WordPress version). SEO analysis keeps working."
msgstr "Bloquea el informe de analítica de BSF (dominio, sistema operativo de PHP, software del servidor, versiones de MySQL/PHP, versión de WordPress). El análisis SEO sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:749
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Tables are fully local."
msgstr "Bloquea los eventos de analítica de Freemius (listas de plugins y temas, versiones, URL del sitio, idioma). Las tablas son totalmente locales."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:759
msgid "Removes the server IP, site URL and version headers from every API request. Template downloads keep working with your token."
msgstr "Elimina la IP del servidor, la URL del sitio y las cabeceras de versión de cada petición a la API. Las descargas de plantillas siguen funcionando con tu token."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:773
msgid "Blocks the StellarWP telemetry and removes the WordPress version, PHP version and user counts from the license/update validation. The domain is kept as the account identifier."
msgstr "Bloquea la telemetría de StellarWP y elimina la versión de WordPress, la versión de PHP y los números de usuarios de la validación de licencia/actualización. El dominio se conserva como identificador de la cuenta."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:783
msgid "Blocks the weekly sync and the opt-in subscribe (home URL, email, name, plugin list, WordPress version, locale, PHP version). Translations keep working."
msgstr "Bloquea la sincronización semanal y la suscripción de aceptación (URL de inicio, correo, nombre, lista de plugins, versión de WordPress, idioma, versión de PHP). Las traducciones siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:787
msgid "Blocks the Freemius analytics events (plugin and theme lists, versions, site URL, language). Widgets keep working."
msgstr "Bloquea los eventos de analítica de Freemius (listas de plugins y temas, versiones, URL del sitio, idioma). Los widgets siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:797
msgid "Removes the Referer header (your network site URL) from the IP info lookups. Backups go to the destinations you configured."
msgstr "Elimina la cabecera Referer (la URL del sitio de tu red) de las consultas de información de IP. Las copias de seguridad van a los destinos que hayas configurado."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:807
msgid "Blocks the survey requests that include the home URL and email. CDN and cache configuration keep working."
msgstr "Bloquea las peticiones de encuesta que incluyen la URL de inicio y el correo. La configuración de CDN y caché sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:811
msgid "Blocks the BSF analytics report (WordPress version, PHP version, locale, site URL). Cart tracking and webhooks keep working."
msgstr "Bloquea el informe de analítica de BSF (versión de WordPress, versión de PHP, idioma, URL del sitio). El seguimiento del carrito y los webhooks siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:820
msgid "Blocks the feedback requests (server software, PHP version, MySQL version, WordPress and WooCommerce versions, locale, multisite). Checkout fields keep working."
msgstr "Bloquea las peticiones de comentarios (software del servidor, versión de PHP, versión de MySQL, versiones de WordPress y WooCommerce, idioma, multisitio). Los campos de finalizar compra siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:830
msgid "Blocks the WooCommerce.com Tracks pixel (usage analytics). Store functionality and woocommerce.com connections keep working."
msgstr "Bloquea el píxel de Tracks de WooCommerce.com (analítica de uso). La funcionalidad de la tienda y las conexiones con woocommerce.com siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:840
msgid "Blocks the WooPay tracker pixel. Payments keep working."
msgstr "Bloquea el píxel de seguimiento de WooPay. Los pagos siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:850
msgid "Blocks the deactivation feedback (PHP version, WordPress version, server info, plugin list, theme, settings). Swatches keep working."
msgstr "Bloquea la encuesta de desactivación (versión de PHP, versión de WordPress, información del servidor, lista de plugins, tema, ajustes). Las muestras siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:860
msgid "Removes the site URL, PHP and WordPress versions, user agent and PHP limits from the plugin-server requests. File management keeps working."
msgstr "Elimina la URL del sitio, las versiones de PHP y WordPress, el agente de usuario y los límites de PHP de las peticiones al servidor de plugins. La gestión de archivos sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:869
msgid "Blocks the usage tracking (home URL, PHP version, WordPress version, MySQL version, server, form and entry counts). Forms keep working."
msgstr "Bloquea el seguimiento de uso (URL de inicio, versión de PHP, versión de WordPress, versión de MySQL, servidor, recuentos de formularios y entradas). Los formularios siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:878
msgid "Blocks the WPBrigade telemetry (PHP version, WordPress version, server, MySQL version, locale, limits). Header and footer scripts keep working."
msgstr "Bloquea la telemetría de WPBrigade (versión de PHP, versión de WordPress, servidor, versión de MySQL, idioma, límites). Los scripts de cabecera y pie siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:887
msgid "Blocks the usage tracking (MySQL version, server software, locale, theme, site count, mailer configuration). Mail delivery keeps working."
msgstr "Bloquea el seguimiento de uso (versión de MySQL, software del servidor, idioma, tema, número de sitios, configuración de correo). La entrega de correo sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:891
msgid "Blocks the Themeisle SDK logger (theme, plugin list, WordPress version). The maintenance page is fully local."
msgstr "Bloquea el logger del SDK de Themeisle (tema, lista de plugins, versión de WordPress). La página de mantenimiento es totalmente local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:900
msgid "Removes the WordPress version from the re-smush.it User-Agent. Image optimization keeps working."
msgstr "Elimina la versión de WordPress del User-Agent de re-smush.it. La optimización de imágenes sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:910
msgid "Removes the WordPress version from the licensing requests. The license key and site URL (account identifier) are kept."
msgstr "Elimina la versión de WordPress de las peticiones de licencia. La clave de licencia y la URL del sitio (identificador de la cuenta) se conservan."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:920
msgid "Removes the WordPress environment block (domain, theme and version, full theme and plugin lists) from the connect requests. Review widgets keep working."
msgstr "Elimina el bloque de entorno de WordPress (dominio, tema y versión, listas completas de temas y plugins) de las peticiones de conexión. Los widgets de reseñas siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:930
msgid "Removes the locale and version headers from the promotions requests. SEO features and instant indexing keep working."
msgstr "Elimina las cabeceras de idioma y versión de las peticiones de promociones. Las funciones SEO y la indexación instantánea siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:934
msgid "Removes the WordPress version, home URL, plugin and theme lists from the WPMU DEV Hub payloads, and the site URL from the User-Agent. Image compression keeps working."
msgstr "Elimina la versión de WordPress, la URL de inicio y las listas de plugins y temas de las cargas de WPMU DEV Hub, y la URL del sitio del User-Agent. La compresión de imágenes sigue funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:944
msgid "Blocks the anonymized usage reports (database version and type, aggregate counts). Statistics collection stays local."
msgstr "Bloquea los informes de uso anonimizados (versión y tipo de base de datos, recuentos agregados). La recogida de estadísticas sigue siendo local."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:953
msgid "Blocks the deactivation feedback (PHP/MySQL/WordPress versions, site URL, theme, plugin list, email). Chat widgets keep working."
msgstr "Bloquea la encuesta de desactivación (versiones de PHP/MySQL/WordPress, URL del sitio, tema, lista de plugins, correo). Los widgets de chat siguen funcionando."
#: includes/class-robotstxt-telemetry-plugin-profiles.php:963
msgid "Removes the language from the pricing lookups. The store currency is kept because prices depend on it."
msgstr "Elimina el idioma de las consultas de precios. La moneda de la tienda se conserva porque los precios dependen de ella."

File diff suppressed because it is too large Load diff

View file

@ -3,9 +3,9 @@ Contributors: robotstxt, javiercasares
Tags: telemetry, privacy, http, requests, logging
Requires at least: 4.0
Tested up to: 7.1
Stable tag: 1.1.1
Stable tag: 1.1.5
Requires PHP: 5.6
Version: 1.1.1
Version: 1.1.5
License: GPL-3.0-or-later
License URI: https://www.gnu.org/licenses/gpl-3.0.txt
@ -148,23 +148,17 @@ On WordPress versions older than 5.1, the Core update check Safe mode cannot red
Only the 3 last versions. The full changelog will be at changelog.txt
= 1.1.1 =
= 1.1.5 =
* Added: "Safe Mode" checkbox column in the Plugins screen (with accessible hidden labels per row)
* Fixed: the StellarWP telemetry blocks (iThemes Security, Kadence Blocks, The Events Calendar) are now actually applied (path-only matchers were never reached)
* Changed: the profile registry is built once per request instead of on every outbound call
* Changed: Manager (by ROBOTSTXT) detection uses the ecosystem presence constant ROBOTSTXT_MANAGER_NOTICED (Manager 1.6.2+) instead of scanning the installed-plugin list on every check; the plugin-list scan is kept as a fallback for older Manager versions and now also matches single-file Manager installs by basename
= 1.1.0 =
= 1.1.4 =
* Added: "Plugins" settings screen (Telemetry → Plugins) with a Safe/Original mode per plugin; in Safe mode the known telemetry endpoints are blocked and the environment data is reduced to what each service needs, and every row explains what is truncated and what is kept
* Added: safe profiles for 99 popular plugins, covering the common telemetry SDKs (Freemius, BSF analytics, Themeisle, Mixpanel, Appsero, StellarWP, WPMU DEV Hub) and the individual trackers, license-update extras, feedback surveys, and User-Agent/headers of each plugin
* Security and compatibility review of the 1.1.3 code base: PHPStan level 9 with the WordPress stubs introduced (and every finding fixed), WordPress Coding Standards fixes applied across all files, and the real compatibility floors re-verified (WordPress 4.0 - 7.1, PHP 5.6 - 8.5)
= 1.0.1 =
= 1.1.3 =
* Fixed: saving the "Plugins" tab from the Network Admin no longer resets the other network settings to their defaults (and the hidden plugins list can now be saved in Global mode)
* Fixed: credentials embedded in URLs are now always stripped, including URLs without query strings
* Changed: the redaction of sensitive keys now also covers "api-key", "cookie", "session", "private-key", and "private_key"
* Changed: documentation clarified — the WordPress version masking applies to the User-Agent only, and the query parameters always send the real version
* Security and compatibility review of the 1.1.2 tab-scoped settings save: nonce and capability checks, tab whitelisting, option-name whitelisting, per-value sanitization, and redirect hardening all verified; no changes needed
= Previous versions =

View file

@ -4,7 +4,7 @@
* Plugin URI: https://www.robotstxt.software/plugins/robotstxt-telemetry/
* Update URI: https://www.robotstxt.software/plugins/robotstxt-telemetry/
* Description: Reduces the telemetry WordPress sends out and logs every outbound HTTP request, so your site shares less and you can see everything.
* Version: 1.1.1
* Version: 1.1.5
* Author: ROBOTSTXT
* Author URI: https://www.robotstxt.software/
* Text Domain: robotstxt-telemetry
@ -13,8 +13,8 @@
* Requires PHP: 5.6
* Tested up to: 7.1
* Network: true
* License: GPL v3 or later
* License URI: https://www.gnu.org/licenses/gpl-3.0.html
* License: GPL-3.0-or-later
* License URI: https://www.gnu.org/licenses/gpl-3.0.txt
*
* @package RobotstxtTelemetry
*/
@ -23,7 +23,7 @@ if ( ! defined( 'ABSPATH' ) ) {
exit;
}
define( 'ROBOTSTXT_TELEMETRY_VERSION', '1.1.1' );
define( 'ROBOTSTXT_TELEMETRY_VERSION', '1.1.5' );
define( 'ROBOTSTXT_TELEMETRY_DB_VERSION', '1.1.0' );
define( 'ROBOTSTXT_TELEMETRY_PLUGIN_FILE', __FILE__ );
define( 'ROBOTSTXT_TELEMETRY_PLUGIN_DIR', __DIR__ );
@ -53,7 +53,7 @@ if ( ! function_exists( 'wp_json_encode' ) ) {
* @return string|false
*/
function wp_json_encode( $data, $options = 0 ) {
return json_encode( $data, $options ); // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_decode -- Native call is the purpose of this compatibility shim for WordPress 4.0.
return json_encode( $data, $options ); // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode -- Native call is the purpose of this compatibility shim for WordPress 4.0.
}
}

View file

@ -70,7 +70,7 @@ function robotstxt_telemetry_uninstall_site( $force_drop = null ) {
if ( $drop ) {
$table_name = $wpdb->prefix . 'robotstxt_telemetry_logs';
$wpdb->query( "DROP TABLE IF EXISTS {$table_name}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- Table name is internal; the %i placeholder requires WordPress 6.2. // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.DirectDatabaseQuery.NoCaching
$wpdb->query( "DROP TABLE IF EXISTS {$table_name}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Table name is internal (%i requires WordPress 6.2); dropping the table on uninstall is the intended, opt-in behavior.
}
delete_option( 'robotstxt_telemetry_delete_on_uninstall' );