'Version', 'TextDomain' => 'Text Domain' ), 'plugin' ); $response = wp_remote_get( DSI_API_URL, [ 'timeout' => 3, 'user-agent' => $plugin_data['TextDomain'] . '/' . $plugin_data['Version'] . ' (+https://wordpress.org/)', ] ); if ( is_wp_error( $response ) ) { set_transient( DSI_CACHE_KEY, false, DSI_CACHE_TTL ); return false; } $body = wp_remote_retrieve_body( $response ); $decoded = json_decode( $body, true ); $status = false; // default to closed if ( is_bool( $decoded ) ) { $status = $decoded; } elseif ( is_array( $decoded ) ) { if ( isset( $decoded['open'] ) ) { $status = (bool) $decoded['open']; } elseif ( isset( $decoded['doorOpen'] ) ) { $status = (bool) $decoded['doorOpen']; } } set_transient( DSI_CACHE_KEY, $status, DSI_CACHE_TTL ); return $status; } /* |-------------------------------------------------------------------------- | Shortcode [door_status] |-------------------------------------------------------------------------- */ function dsi_shortcode() : string { $open = dsi_get_status(); $emoji = $open ? '
🟢 Open
' : '
🔴 Closed
'; return sprintf( '%s', $open ? 'open' : 'closed', $emoji ); } add_shortcode( 'door_status', 'dsi_shortcode' ); /* |-------------------------------------------------------------------------- | Admin Bar indicator |-------------------------------------------------------------------------- */ function dsi_admin_bar( WP_Admin_Bar $bar ) : void { if ( ! current_user_can( 'read' ) ) { return; // Logged‑in users only. } $open = dsi_get_status(); $emoji = $open ? '🟢' : '🔴'; $text = $open ? __( 'Door Open', 'door-status-indicator' ) : __( 'Door Closed', 'door-status-indicator' ); $bar->add_node( [ 'id' => 'door-status-indicator', 'title' => "$emoji $text", 'href' => '#', 'meta' => [ 'title' => $text ], ] ); } add_action( 'admin_bar_menu', 'dsi_admin_bar', 1000 ); /* |-------------------------------------------------------------------------- | Front‑end inline CSS (kept minimal) |-------------------------------------------------------------------------- */ /** * Front-end + admin-bar styles for the indicator. */ function dsi_enqueue_assets() : void { // register & enqueue the standalone CSS file wp_enqueue_style( 'door-status-indicator', plugins_url( 'wp-spaceapi-consumer-style.css', __FILE__ ), [], // no dependencies '1.0.0' // file version ); } add_action( 'wp_enqueue_scripts', 'dsi_enqueue_assets' ); add_action( 'admin_enqueue_scripts', 'dsi_enqueue_assets' ); // so the Admin Bar icon also gets styled /* |-------------------------------------------------------------------------- | WP‑CLI command (optional) |-------------------------------------------------------------------------- */ if ( defined( 'WP_CLI' ) && WP_CLI ) { WP_CLI::add_command( 'door-status', function() { WP_CLI::success( dsi_get_status() ? 'Door is open 🟢' : 'Door is closed 🔴' ); } ); } // End of file