getInputs(); $title = $inputs['program_title'] ?? 'untitled'; $date = $inputs['date'] ?? ''; return sprintf( 'Create schedule "%s"%s', $title, $date ? " on `{$date}`" : '' ); } /** * Human-readable version of tool inputs for the approval card. * Resolves event_id to event title. * * @return array */ public function get_approval_inputs(): array { $inputs = $this->getInputs(); if ( ! empty( $inputs['event_id'] ) ) { $post = get_post( (int) $inputs['event_id'] ); if ( $post ) { $inputs['event'] = $post->post_title . ' (ID: ' . $inputs['event_id'] . ')'; } unset( $inputs['event_id'] ); } return $inputs; } /** * Execute the tool * * @param string $program_title Schedule title. * @param string $date Schedule date (YYYY-MM-DD). * @param string|null $day_name Day label. * @param array|null $schedule_slot Session array. * @param bool|null $hide_date_on_event_page Whether to hide the date. * @param int|null $event_id Event to link the schedule to. * @return array */ public function __invoke( string $program_title, string $date, ?string $day_name = null, ?array $schedule_slot = null, ?bool $hide_date_on_event_page = null, ?int $event_id = null ): array { $check = $this->guard( 'etn_manage_schedule' ); if ( $check ) { return $check; } try { if ( empty( trim( $program_title ) ) ) { return [ 'error' => 'program_title is required.' ]; } if ( empty( trim( $date ) ) ) { return [ 'error' => 'date is required.' ]; } $body = [ 'program_title' => sanitize_text_field( $program_title ), 'date' => sanitize_text_field( $date ), 'post_status' => 'publish', ]; if ( null !== $day_name ) { $body['day_name'] = sanitize_text_field( $day_name ); } if ( null !== $schedule_slot && is_array( $schedule_slot ) ) { $body['schedule_slot'] = $schedule_slot; } if ( null !== $hide_date_on_event_page ) { $body['hide_date_on_event_page'] = (bool) $hide_date_on_event_page; } $request = new \WP_REST_Request( 'POST' ); $request->set_header( 'content-type', 'application/json' ); $request->set_body( wp_json_encode( $body ) ); $response = ( new \Eventin\Schedule\Api\ScheduleController() )->create_item( $request ); if ( is_wp_error( $response ) ) { return [ 'error' => $response->get_error_message() ]; } $schedule_id = (int) ( $response->get_data()['id'] ?? 0 ); if ( ! $schedule_id ) { return [ 'error' => 'Failed to create schedule. Eventin did not return a valid schedule ID.' ]; } if ( ! empty( $event_id ) && $event_id > 0 ) { // Eventin reads etn_event_schedule via unserialize, not json_decode — // keep it a native array, don't json_decode/wp_json_encode it. $existing = get_post_meta( $event_id, 'etn_event_schedule', true ); $existing = is_array( $existing ) ? array_map( 'intval', $existing ) : []; if ( ! in_array( $schedule_id, $existing, true ) ) { $existing[] = $schedule_id; } update_post_meta( $event_id, 'etn_event_schedule', array_values( $existing ) ); } return [ 'success' => true, 'schedule_id' => $schedule_id, 'message' => "Schedule `{$program_title}` created (ID: {$schedule_id}).", 'edit_url' => get_edit_post_link( $schedule_id, 'raw' ), ]; } catch ( \Exception $e ) { Log::error( 'Eventin_Create_Schedule_Tool error', [ 'error' => $e->getMessage() ] ); return [ 'error' => 'Failed to create schedule: ' . $e->getMessage() ]; } } }