getInputs(); $id = $inputs['speaker_id'] ?? 0; $user = $id ? get_userdata( (int) $id ) : null; $meta_title = $user ? get_user_meta( $id, 'etn_speaker_title', true ) : ''; $name = $user ? ( $meta_title ? $meta_title : $user->display_name ) : "ID {$id}"; return sprintf( 'Update speaker "%s"', $name ); } /** * Human-readable version of tool inputs for the approval card. * Replaces speaker_id with resolved speaker name. * * @return array */ public function get_approval_inputs(): array { $inputs = $this->getInputs(); $id = (int) ( $inputs['speaker_id'] ?? 0 ); if ( $id ) { $user = get_userdata( $id ); $meta_title = $user ? get_user_meta( $id, 'etn_speaker_title', true ) : ''; $resolved_name = $user ? ( $meta_title ? $meta_title : $user->display_name ) : "ID {$id}"; $inputs['speaker'] = $resolved_name . ' (ID: ' . $id . ')'; unset( $inputs['speaker_id'] ); } return $inputs; } /** * Execute the tool * * @param int $speaker_id Speaker user ID. * @param string|null $name New full name. * @param string|null $email New email. * @param string|null $designation New job title. * @param string|null $company_name New company name. * @param string|null $summary New short bio. * @return array */ public function __invoke( int $speaker_id, ?string $name = null, ?string $email = null, ?string $designation = null, ?string $company_name = null, ?string $summary = null ): array { $check = $this->guard( 'etn_manage_organizer', 'etn_manage_event' ); if ( $check ) { return $check; } try { if ( $speaker_id <= 0 ) { return [ 'error' => 'speaker_id must be a positive integer.' ]; } $target = get_userdata( $speaker_id ); if ( ! $target || ! in_array( 'etn-speaker', (array) $target->roles, true ) ) { return [ 'error' => "No Eventin speaker found with ID {$speaker_id}." ]; } $body = []; if ( null !== $name ) { $body['name'] = sanitize_text_field( $name ); } if ( null !== $email ) { $body['email'] = sanitize_email( $email ); } if ( null !== $designation ) { $body['designation'] = sanitize_text_field( $designation ); } if ( null !== $company_name ) { $body['company_name'] = sanitize_text_field( $company_name ); } if ( null !== $summary ) { $body['summary'] = wp_kses_post( $summary ); } if ( empty( $body ) ) { return [ 'error' => 'No fields provided to update.' ]; } $request = new \WP_REST_Request( 'PUT' ); $request->set_param( 'id', $speaker_id ); $request->set_header( 'content-type', 'application/json' ); $request->set_body( wp_json_encode( $body ) ); $response = ( new \Eventin\Speaker\Api\SpeakerController() )->update_item( $request ); if ( is_wp_error( $response ) ) { return [ 'error' => $response->get_error_message() ]; } $display_name = $name ?? $target->display_name; return [ 'success' => true, 'speaker_id' => $speaker_id, 'message' => "Speaker \"{$display_name}\" (ID: {$speaker_id}) updated successfully.", ]; } catch ( \Exception $e ) { Log::error( 'Eventin_Update_Speaker_Tool error', [ 'error' => $e->getMessage() ] ); return [ 'error' => 'Failed to update speaker: ' . $e->getMessage() ]; } } }