*/ public static function defaults(): array { return [ self::VOTING => self::LOGGED_IN, self::SUBMITTING => self::LOGGED_IN, self::MODERATION => true, self::PAGE => 0, self::CATEGORIES => [], ]; } /** * Returns a board's settings, using the default for anything missing or invalid. * * @param int $board_id Board term ID. 0 returns the defaults. * @return array */ public static function get( int $board_id ): array { $stored = $board_id ? get_term_meta( $board_id, self::META, true ) : []; return self::sanitize( is_array( $stored ) ? $stored : [], self::defaults() ); } /** * Who may vote on a board: ANYONE, LOGGED_IN or NOBODY. * * @param int $board_id Board term ID. */ public static function voting( int $board_id ): string { return (string) self::get( $board_id )[ self::VOTING ]; } /** * Who may submit requests to a board: ANYONE, LOGGED_IN or NOBODY. * * @param int $board_id Board term ID. */ public static function submitting( int $board_id ): string { return (string) self::get( $board_id )[ self::SUBMITTING ]; } /** * Whether a board's new requests wait for approval. * * @param int $board_id Board term ID. */ public static function moderated( int $board_id ): bool { return (bool) self::get( $board_id )[ self::MODERATION ]; } /** * URL of the page that shows a board, or '' when it is not known or no longer published. * * @param int $board_id Board term ID. */ public static function page_url( int $board_id ): string { $page_id = (int) self::get( $board_id )[ self::PAGE ]; return $page_id && 'publish' === get_post_status( $page_id ) ? (string) get_permalink( $page_id ) : ''; } /** * The categories a board's requests can have, as term IDs. Empty means every category. * * Categories that were deleted since the board was saved are left out. A board whose * chosen categories are all gone is no longer limited. * * @param int $board_id Board term ID. * @return int[] */ public static function categories( int $board_id ): array { $chosen = (array) self::get( $board_id )[ self::CATEGORIES ]; if ( ! $chosen ) { return []; } $existing = get_terms( [ 'taxonomy' => CategoryTaxonomy::NAME, 'include' => $chosen, 'hide_empty' => false, 'fields' => 'ids', ] ); return is_array( $existing ) ? array_map( 'intval', $existing ) : []; } /** * Saves settings for a board. Settings not passed, and invalid values, leave the current value in place. * * @param int $board_id Board term ID. * @param array $settings Settings to change. */ public static function update( int $board_id, array $settings ): void { update_term_meta( $board_id, self::META, self::sanitize( $settings, self::get( $board_id ) ) ); } /** * Applies the valid values from $settings on top of $base. Unknown keys and invalid values are dropped. * * @param array $settings Raw settings. * @param array $base Valid settings to start from. * @return array */ private static function sanitize( array $settings, array $base ): array { $clean = $base; foreach ( [ self::VOTING, self::SUBMITTING ] as $key ) { if ( in_array( $settings[ $key ] ?? null, [ self::ANYONE, self::LOGGED_IN, self::NOBODY ], true ) ) { $clean[ $key ] = $settings[ $key ]; } } if ( isset( $settings[ self::MODERATION ] ) && is_bool( $settings[ self::MODERATION ] ) ) { $clean[ self::MODERATION ] = $settings[ self::MODERATION ]; } if ( isset( $settings[ self::PAGE ] ) && is_numeric( $settings[ self::PAGE ] ) ) { $clean[ self::PAGE ] = max( 0, (int) $settings[ self::PAGE ] ); } if ( isset( $settings[ self::CATEGORIES ] ) && is_array( $settings[ self::CATEGORIES ] ) ) { $clean[ self::CATEGORIES ] = array_values( array_unique( array_filter( array_map( 'absint', $settings[ self::CATEGORIES ] ) ) ) ); } return $clean; } }