'GET', 'callback' => array( $this, 'get_modules' ), 'permission_callback' => array( $this, 'permission_check' ), 'args' => array(), ), ) ); } /** * Every registered module, available or not. * * @return WP_REST_Response */ public function get_modules(): WP_REST_Response { $modules = array(); foreach ( Plugin::instance()->modules()->all() as $module ) { $modules[] = $this->prepare( $module ); } return rest_ensure_response( $modules ); } /** * One module as the UI needs it. * * @param Module $module The module. * @return array */ private function prepare( Module $module ): array { $available = $module->is_available(); // Only the types this user may export, so the picker never offers one // the export route would refuse. $allowed = function ( $type ) use ( $module ) { return $this->can_export_type( $module, (string) $type ); }; return array( 'id' => $module->id(), 'label' => $module->label(), 'available' => $available, 'source' => $module->source(), 'description' => $module->description(), 'post_types' => array_values( array_filter( array_merge( $module->selectable_post_types(), array_keys( $module->payload_types() ) ), $allowed ) ), 'payload_types' => array_values( array_filter( array_keys( $module->payload_types() ), $allowed ) ), 'dependent_post_types' => $module->dependent_post_types(), 'taxonomies' => $module->taxonomies(), 'counts' => $available ? array_merge( $module->counts(), $module->payload_counts() ) : array(), 'type_labels' => $this->type_labels( $module ), ); } /** * Registered names for every slug this module can show, so the UI prints * the label WordPress already holds ("Trips", "Coupons") instead of a * title-cased slug ("Wte Coupon"). * * @param Module $module The module. * @return array */ private function type_labels( Module $module ): array { $labels = array(); $post_types = array_merge( $module->selectable_post_types(), $module->dependent_post_types() ); foreach ( $post_types as $slug ) { $object = get_post_type_object( $slug ); if ( $object ) { $labels[ $slug ] = $object->labels->name; } } $labels = array_merge( $labels, $module->payload_types() ); foreach ( $module->taxonomies() as $slug ) { $object = get_taxonomy( $slug ); if ( $object ) { $labels[ $slug ] = $object->labels->name; } } return $labels; } }