__( 'Company', 'aisp-customer-activity' ), 'cart_items' => __( 'Cart (items)', 'aisp-customer-activity' ), 'cart_total' => __( 'Cart (total)', 'aisp-customer-activity' ), 'last_activity' => __( 'Last Activity', 'aisp-customer-activity' ), ]; } /** * Always-visible columns — hardcoded, not user-configurable. */ public static function always_visible_columns(): array { return [ 'online_status', 'name' ]; } /** * Full ordered column list for a given context (always-visible + user-selected). * always_visible_columns are prepended and never duplicated. */ public static function get_columns( string $context ): array { $saved = get_option( "aisp_ca_{$context}_columns", [] ); $selected = ! empty( $saved ) ? (array) $saved : array_keys( self::available_columns() ); // Strip any always-visible keys that might be stored from an older version. $selected = array_values( array_diff( $selected, self::always_visible_columns() ) ); return array_merge( self::always_visible_columns(), $selected ); } /** Roles available for tracking (excludes WP core roles). */ public static function get_trackable_roles(): array { $all = wp_roles()->roles; $exclude = self::EXCLUDED_ROLES; return array_filter( $all, fn( $slug ) => ! in_array( $slug, $exclude, true ), ARRAY_FILTER_USE_KEY ); } /** Currently configured tracked roles. */ public static function get_tracked_roles(): array { $saved = get_option( 'aisp_ca_tracked_roles', [] ); return ! empty( $saved ) ? (array) $saved : [ 'customer' ]; } /** Sanitize a checkbox array against an allowed list. */ public static function sanitize_checkbox_array( $input, array $allowed ): array { if ( ! is_array( $input ) ) { return []; } return array_values( array_intersect( array_map( 'sanitize_key', $input ), $allowed ) ); } /** Sanitize callback for the aisp_ca_tracked_roles option. */ public static function sanitize_tracked_roles( $input ): array { $allowed_roles = array_keys( self::get_trackable_roles() ); return self::sanitize_checkbox_array( $input, $allowed_roles ); } /** Sanitize callback for the aisp_ca_widget_columns option. */ public static function sanitize_widget_columns( $input ): array { $allowed_columns = array_keys( self::available_columns() ); return self::sanitize_checkbox_array( $input, $allowed_columns ); } /** Sanitize callback for the aisp_ca_page_columns option. */ public static function sanitize_page_columns( $input ): array { $allowed_columns = array_keys( self::available_columns() ); return self::sanitize_checkbox_array( $input, $allowed_columns ); } // ------------------------------------------------------------------------- // Register settings (WordPress Settings API) // ------------------------------------------------------------------------- public static function register_settings() { register_setting( self::OPTION_GRP, 'aisp_ca_activity_hours', [ 'type' => 'integer', 'default' => 72, 'sanitize_callback' => 'absint' ] ); register_setting( self::OPTION_GRP, 'aisp_ca_widget_limit', [ 'type' => 'integer', 'default' => 5, 'sanitize_callback' => 'absint' ] ); register_setting( self::OPTION_GRP, 'aisp_ca_online_minutes', [ 'type' => 'integer', 'default' => 5, 'sanitize_callback' => 'absint' ] ); register_setting( self::OPTION_GRP, 'aisp_ca_refresh_interval', [ 'type' => 'integer', 'default' => 300, 'sanitize_callback' => 'absint' ] ); register_setting( self::OPTION_GRP, 'aisp_ca_tracked_roles', [ 'type' => 'array', 'sanitize_callback' => [ __CLASS__, 'sanitize_tracked_roles' ] ] ); register_setting( self::OPTION_GRP, 'aisp_ca_widget_columns', [ 'type' => 'array', 'sanitize_callback' => [ __CLASS__, 'sanitize_widget_columns' ] ] ); register_setting( self::OPTION_GRP, 'aisp_ca_page_columns', [ 'type' => 'array', 'sanitize_callback' => [ __CLASS__, 'sanitize_page_columns' ] ] ); } }