ID ); $params = [ 'projectId' => is_numeric( $project_id ) ? (int) $project_id : $project_id, ]; $params = self::merge_post_settings( $post, $params ); return (object) apply_filters( 'beyondwords_player_sdk_params', $params, $post->ID ); } /** * Merge per-post overrides into the SDK parameters. * * For Magic Embed (client-side) integration without a content ID we flip * to source-ID mode so the SDK fetches by source post ID instead. * * @param \WP_Post $post Post object. * @param array $params Existing params. * * @return array */ public static function merge_post_settings( \WP_Post $post, array $params ): array { $content_id = \BeyondWords\Post\Meta::get_content_id( $post->ID ); if ( ! empty( $content_id ) ) { $params['contentId'] = (string) $content_id; } if ( \BeyondWords\Settings\Fields::PLAYER_UI_HEADLESS === get_option( \BeyondWords\Settings\Fields::OPTION_PLAYER_UI ) ) { $params['showUserInterface'] = false; } // "Script" is the AI-summarization output, so script → summary:true. // None/audio_post add nothing — the SDK defaults to audio + body. $embed = \BeyondWords\Editor\Components\SettingsFields::get_effective_embed( $post->ID ); switch ( $embed ) { case \BeyondWords\Editor\Components\SettingsFields::EMBED_AUDIO_SCRIPT: $params['summary'] = true; break; case \BeyondWords\Editor\Components\SettingsFields::EMBED_VIDEO_POST: $params['video'] = true; break; case \BeyondWords\Editor\Components\SettingsFields::EMBED_VIDEO_SCRIPT: $params['video'] = true; $params['summary'] = true; break; } $method = \BeyondWords\Settings\Fields::get_integration_method( $post ); if ( \BeyondWords\Settings\Fields::INTEGRATION_CLIENT_SIDE === $method && empty( $params['contentId'] ) ) { $params['clientSideEnabled'] = true; $params['sourceId'] = (string) $post->ID; unset( $params['contentId'] ); } return $params; } }