int, 'url' => string ], or null on failure. */ public static function sideload( string $file_path, string $title, int $parent_post_id = 0, string $alt_text = '' ): ?array { if ( ! file_exists( $file_path ) ) { return null; } if ( ! function_exists( 'media_handle_sideload' ) ) { require_once ABSPATH . 'wp-admin/includes/image.php'; require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/media.php'; } $file_array = [ 'name' => sanitize_file_name( $title ) . '.png', 'type' => 'image/png', 'tmp_name' => $file_path, ]; $attachment_id = media_handle_sideload( $file_array, $parent_post_id, $title ); if ( is_wp_error( $attachment_id ) ) { Log::warning( 'Media_Library sideload failed', [ 'error' => $attachment_id->get_error_message() ] ); return null; } $attachment_id = (int) $attachment_id; $url = wp_get_attachment_url( $attachment_id ); if ( ! $url ) { Log::warning( 'Media_Library sideload returned no URL', [ 'id' => $attachment_id ] ); return null; } if ( '' !== $alt_text ) { update_post_meta( $attachment_id, '_wp_attachment_image_alt', $alt_text ); } return [ 'id' => $attachment_id, 'url' => (string) $url, ]; } }