plugin = $plugin; } /** * Hooks into the admin. * * @return void */ public function init() { add_action( 'admin_menu', [ $this, 'add_page' ] ); add_action( 'admin_init', [ $this, 'register_setting' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_styles' ] ); add_filter( 'plugin_action_links_' . plugin_basename( SEEB_ABILITIES_FILE ), [ $this, 'action_links' ] ); } /** * Returns the settings. * * @return array{disabled_categories: string[], disabled_abilities: string[]} */ public static function get(): array { $settings = get_option( self::OPTION, [] ); $settings = is_array( $settings ) ? $settings : []; return [ 'disabled_categories' => array_values( array_map( 'strval', (array) ( $settings['disabled_categories'] ?? [] ) ) ), 'disabled_abilities' => array_values( array_map( 'strval', (array) ( $settings['disabled_abilities'] ?? [] ) ) ), ]; } /** * Adds the settings page. * * @return void */ public function add_page() { $this->hook_suffix = (string) add_options_page( __( 'Seeb Abilities', 'seeb-abilities' ), __( 'Seeb Abilities', 'seeb-abilities' ), 'manage_options', self::PAGE, [ $this, 'render' ] ); } /** * Adds the styles of the page header. * * @param string $hook_suffix Hook suffix of the current admin page. * * @return void */ public function enqueue_styles( $hook_suffix ) { if ( $hook_suffix !== $this->hook_suffix ) { return; } wp_register_style( 'seeb-abilities-settings', false, [], SEEB_ABILITIES_VERSION ); wp_enqueue_style( 'seeb-abilities-settings' ); wp_add_inline_style( 'seeb-abilities-settings', '.seeb-abilities-header{display:flex;align-items:center;flex-wrap:wrap;gap:12px;margin:0 0 0 -20px;padding:12px 20px;background:#fff;border-bottom:1px solid #dcdcde}' . '.seeb-abilities-header img{width:40px;height:40px;border-radius:9px}' . '.seeb-abilities-header h1{margin:0;padding:0;font-size:20px;font-weight:600;line-height:1.3}' . '.seeb-abilities-header .seeb-abilities-version{padding:2px 8px;border-radius:10px;background:#f0f0f1;color:#50575e;font-size:12px}' . '.seeb-abilities-header nav{display:flex;gap:16px;margin-left:auto}' . '.seeb-abilities-header nav a{text-decoration:none}' . '@media (max-width:782px){.seeb-abilities-header{margin-left:-10px;padding:10px}.seeb-abilities-header nav{margin-left:0;width:100%}}' ); } /** * Registers the setting. * * @return void */ public function register_setting() { register_setting( self::PAGE, self::OPTION, [ 'type' => 'array', 'sanitize_callback' => [ $this, 'sanitize' ], 'default' => [ 'disabled_categories' => [], 'disabled_abilities' => [], ], ] ); } /** * Adds a Settings link on the Plugins screen. * * @param string[] $links Action links. * * @return string[] */ public function action_links( $links ): array { array_unshift( $links, sprintf( '%s', esc_url( admin_url( 'options-general.php?page=' . self::PAGE ) ), esc_html__( 'Settings', 'seeb-abilities' ) ) ); return $links; } /** * Sanitizes the setting. The form submits what is enabled; the option stores what is disabled, * so abilities added in later versions are enabled by default. * * @param mixed $value Submitted value. * * @return array */ public function sanitize( $value ): array { $value = is_array( $value ) ? $value : []; $categories = []; $abilities = []; foreach ( $this->plugin->get_groups() as $group ) { $categories[] = $group->get_slug(); foreach ( array_keys( $group->get_abilities() ) as $slug ) { $abilities[] = Plugin::PREFIX . '/' . $slug; } } if ( empty( $value['submitted'] ) ) { return [ 'disabled_categories' => array_values( array_intersect( $categories, (array) ( $value['disabled_categories'] ?? [] ) ) ), 'disabled_abilities' => array_values( array_intersect( $abilities, (array) ( $value['disabled_abilities'] ?? [] ) ) ), ]; } $enabled_categories = array_map( 'sanitize_text_field', (array) ( $value['categories'] ?? [] ) ); $enabled_abilities = array_map( 'sanitize_text_field', (array) ( $value['abilities'] ?? [] ) ); return [ 'disabled_categories' => array_values( array_diff( $categories, $enabled_categories ) ), 'disabled_abilities' => array_values( array_diff( $abilities, $enabled_abilities ) ), ]; } /** * Renders the settings page. * * @return void */ public function render() { $settings = self::get(); $total = 0; $enabled = 0; foreach ( $this->plugin->get_groups() as $group ) { foreach ( array_keys( $group->get_abilities() ) as $slug ) { ++$total; $enabled += $this->plugin->is_enabled( Plugin::PREFIX . '/' . $slug, $group->get_slug() ) ? 1 : 0; } } $links = [ 'https://wordpress.org/plugins/seeb-abilities/' => __( 'Plugin page', 'seeb-abilities' ), 'https://wordpress.org/support/plugin/seeb-abilities/' => __( 'Support', 'seeb-abilities' ), 'https://wordpress.org/support/plugin/seeb-abilities/reviews/#new-post' => __( 'Rate the plugin', 'seeb-abilities' ), ]; ?>


MCP Adapter' ), [ 'a' => [ 'href' => [], 'target' => [], 'rel' => [], ], ] ); ?>

plugin->get_groups() as $group ) : ?> get_slug(), $settings['disabled_categories'], true ); ?>

get_description() ); ?>

get_abilities() as $slug => $ability ) : ?>
/>