You've already forked wp-prometheus
fix: Defer DashboardProvider translations to avoid early textdomain loading (v0.4.8)
All checks were successful
Create Release Package / build-release (push) Successful in 54s
All checks were successful
Create Release Package / build-release (push) Successful in 54s
DashboardProvider constructor also had __() calls during plugins_loaded. Applied same lazy-initialization pattern as Settings tab labels. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -53,30 +53,43 @@ class DashboardProvider {
|
||||
*/
|
||||
public function __construct() {
|
||||
$this->dashboard_dir = WP_PROMETHEUS_PATH . 'assets/dashboards/';
|
||||
}
|
||||
|
||||
$this->builtin_dashboards = array(
|
||||
'wordpress-overview' => array(
|
||||
'title' => __( 'WordPress Overview', 'wp-prometheus' ),
|
||||
'description' => __( 'General WordPress metrics including users, posts, comments, and plugins.', 'wp-prometheus' ),
|
||||
'file' => 'wordpress-overview.json',
|
||||
'icon' => 'dashicons-wordpress',
|
||||
'source' => 'builtin',
|
||||
),
|
||||
'wordpress-runtime' => array(
|
||||
'title' => __( 'Runtime Performance', 'wp-prometheus' ),
|
||||
'description' => __( 'HTTP request metrics, database query performance, and response times.', 'wp-prometheus' ),
|
||||
'file' => 'wordpress-runtime.json',
|
||||
'icon' => 'dashicons-performance',
|
||||
'source' => 'builtin',
|
||||
),
|
||||
'wordpress-woocommerce' => array(
|
||||
'title' => __( 'WooCommerce Store', 'wp-prometheus' ),
|
||||
'description' => __( 'WooCommerce metrics including products, orders, revenue, and customers.', 'wp-prometheus' ),
|
||||
'file' => 'wordpress-woocommerce.json',
|
||||
'icon' => 'dashicons-cart',
|
||||
'source' => 'builtin',
|
||||
),
|
||||
);
|
||||
/**
|
||||
* Get built-in dashboard definitions.
|
||||
*
|
||||
* Lazily initializes dashboard labels to avoid triggering textdomain loading
|
||||
* before the 'init' action (required since WordPress 6.7).
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function get_builtin_dashboards(): array {
|
||||
if ( empty( $this->builtin_dashboards ) ) {
|
||||
$this->builtin_dashboards = array(
|
||||
'wordpress-overview' => array(
|
||||
'title' => __( 'WordPress Overview', 'wp-prometheus' ),
|
||||
'description' => __( 'General WordPress metrics including users, posts, comments, and plugins.', 'wp-prometheus' ),
|
||||
'file' => 'wordpress-overview.json',
|
||||
'icon' => 'dashicons-wordpress',
|
||||
'source' => 'builtin',
|
||||
),
|
||||
'wordpress-runtime' => array(
|
||||
'title' => __( 'Runtime Performance', 'wp-prometheus' ),
|
||||
'description' => __( 'HTTP request metrics, database query performance, and response times.', 'wp-prometheus' ),
|
||||
'file' => 'wordpress-runtime.json',
|
||||
'icon' => 'dashicons-performance',
|
||||
'source' => 'builtin',
|
||||
),
|
||||
'wordpress-woocommerce' => array(
|
||||
'title' => __( 'WooCommerce Store', 'wp-prometheus' ),
|
||||
'description' => __( 'WooCommerce metrics including products, orders, revenue, and customers.', 'wp-prometheus' ),
|
||||
'file' => 'wordpress-woocommerce.json',
|
||||
'icon' => 'dashicons-cart',
|
||||
'source' => 'builtin',
|
||||
),
|
||||
);
|
||||
}
|
||||
return $this->builtin_dashboards;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -106,7 +119,7 @@ class DashboardProvider {
|
||||
}
|
||||
|
||||
// Check for duplicate slugs (built-in takes precedence).
|
||||
if ( isset( $this->builtin_dashboards[ $slug ] ) ) {
|
||||
if ( isset( $this->get_builtin_dashboards()[ $slug ] ) ) {
|
||||
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
|
||||
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
|
||||
error_log( "WP Prometheus: Dashboard slug '$slug' conflicts with built-in dashboard" );
|
||||
@@ -273,7 +286,7 @@ class DashboardProvider {
|
||||
$available = array();
|
||||
|
||||
// Add built-in dashboards (check file exists).
|
||||
foreach ( $this->builtin_dashboards as $slug => $dashboard ) {
|
||||
foreach ( $this->get_builtin_dashboards() as $slug => $dashboard ) {
|
||||
$file_path = $this->dashboard_dir . $dashboard['file'];
|
||||
if ( file_exists( $file_path ) ) {
|
||||
$available[ $slug ] = $dashboard;
|
||||
@@ -306,8 +319,9 @@ class DashboardProvider {
|
||||
$slug = sanitize_file_name( $slug );
|
||||
|
||||
// Check built-in dashboards first.
|
||||
if ( isset( $this->builtin_dashboards[ $slug ] ) ) {
|
||||
$dashboard = $this->builtin_dashboards[ $slug ];
|
||||
$builtin = $this->get_builtin_dashboards();
|
||||
if ( isset( $builtin[ $slug ] ) ) {
|
||||
$dashboard = $builtin[ $slug ];
|
||||
$file_path = $this->dashboard_dir . $dashboard['file'];
|
||||
|
||||
// Security: Ensure file is within dashboard directory.
|
||||
@@ -377,8 +391,9 @@ class DashboardProvider {
|
||||
|
||||
$slug = sanitize_file_name( $slug );
|
||||
|
||||
if ( isset( $this->builtin_dashboards[ $slug ] ) ) {
|
||||
return $this->builtin_dashboards[ $slug ];
|
||||
$builtin = $this->get_builtin_dashboards();
|
||||
if ( isset( $builtin[ $slug ] ) ) {
|
||||
return $builtin[ $slug ];
|
||||
}
|
||||
|
||||
if ( isset( $this->registered_dashboards[ $slug ] ) ) {
|
||||
@@ -401,8 +416,9 @@ class DashboardProvider {
|
||||
$slug = sanitize_file_name( $slug );
|
||||
|
||||
// Built-in dashboards have predefined filenames.
|
||||
if ( isset( $this->builtin_dashboards[ $slug ] ) ) {
|
||||
return $this->builtin_dashboards[ $slug ]['file'];
|
||||
$builtin = $this->get_builtin_dashboards();
|
||||
if ( isset( $builtin[ $slug ] ) ) {
|
||||
return $builtin[ $slug ]['file'];
|
||||
}
|
||||
|
||||
// Registered dashboards - use file basename or generate from slug.
|
||||
|
||||
Reference in New Issue
Block a user