*/ private array $options; /** * The default values for the optional arguments. * * @var array */ private array $defaults = [ 'id' => '', 'user_id' => null, 'type' => self::NOTICE, 'priority' => 0.5, ]; /** * The header for the notification. * * @var string */ private string $header; /** * The message for the notification. * * @var string */ private string $message; /** * Notification class constructor. * * @param string $message Message string. * @param string $header The header. * @param array $options Set of options. */ public function __construct( string $message, string $header = '', array $options = [] ) { $this->header = $header; $this->message = $message; $this->options = $this->normalize_options( $options ); } /** * Get the notification ID. * * @return string */ public function get_id(): string { return $this->options['id']; } /** * Get the id of the user to show the notification for. * * @return int The user id */ public function get_user_id(): int { return ( $this->options['user_id'] ?? get_current_user_id() ); } /** * Get the type of the notification. * * @return string */ public function get_type(): string { return $this->options['type']; } /** * Get the priority of the notification. * * @return float Returns the priority between 0 and 1. */ public function get_priority(): float { return $this->options['priority']; } /** * Check if the notification is relevant for the current user. * * @return bool True if a user needs to see this notification, false if not. */ public function display_for_current_user(): bool { $capability = \apply_filters( 'gtmkit_admin_capability', \is_multisite() ? 'manage_network_options' : 'manage_options' ); return $this->has_capability( $capability ); } /** * Array filter function to find matched capabilities. * * @param string $capability Capability to test. * * @return bool */ private function has_capability( string $capability ): bool { $user_id = $this->options['user_id']; if ( ! is_numeric( $user_id ) ) { return false; } $user = get_user_by( 'id', $user_id ); if ( ! $user ) { return false; } return $user->has_cap( $capability ); } /** * Return the object properties as an array. * * @return array */ public function to_array(): array { return [ 'header' => $this->header, 'message' => $this->message, 'options' => $this->options, ]; } /** * Adds string (view) behaviour to the notification. * * @return string */ public function __toString(): string { return wp_json_encode( $this->render() ); } /** * Renders the notification as an array for use in the settings. * * @return array The rendered notification. */ public function render(): array { return [ 'id' => $this->get_id(), 'header' => $this->header, 'message' => $this->message, ]; } /** * Make sure we only have values that we can work with. * * @param array $options Options to normalize. * * @return array */ private function normalize_options( array $options ): array { $options = wp_parse_args( $options, $this->defaults ); // The default is 0.5, and it should not exceed 0 or 1. $options['priority'] = min( 1, max( 0, $options['priority'] ) ); if ( $options['user_id'] === null ) { $options['user_id'] = get_current_user_id(); } return $options; } }