The modern, strongly‑typed WordPress REST API client for Dart & Flutter — fast, flexible, and production‑ready.
- 📦 API discovery support.
- ⏲️ Measures request completion time.
- 📝 Supports all CRUD operations.
- 🌐 Supports all common endpoints.
- 🎨 Custom Requests & Authorization systems.
- 🔐 3 Popular authorization methods.
- 🗄️ Third‑party Database integration.
- 🔧 Middlewares for request & response operations.
- 🎣 Events for preprocessing response.
- 🚀 Execute requests in Parallel (with configurable error handling).
- 🧠 Optional in‑memory caching for GET requests.
Add wordpress_client
to your pubspec.yaml
:
dependencies:
wordpress_client: ^9.1.1
Then run flutter pub get
or dart pub get
.
Import and initialize:
import 'package:wordpress_client/wordpress_client.dart';
final client = WordpressClient.forSite(
siteUrl: Uri.parse('https://example.com'),
// or: baseUrl via WordpressClient(baseUrl: Uri.parse('.../wp-json/wp/v2'))
);
Add an auth quickly (helpers available):
final client = WordpressClient.forSite(
siteUrl: Uri.parse('https://example.com'),
bootstrapper: (b) => b
.withDefaultAuthorization(
// Built-in helpers
WordpressAuth.appPassword(user: 'user', appPassword: 'xxxx-xxxx'),
// or: WordpressAuth.usefulJwt(user: 'user', password: 'pass', device: 'device-id')
// or: WordpressAuth.basicJwt(user: 'user', password: 'pass')
)
.build(),
);
Enable caching via middleware (optional):
final client = WordpressClient(
baseUrl: Uri.parse('https://example.com/wp-json/wp/v2'),
bootstrapper: (b) => b
.withCache(
ttl: const Duration(minutes: 5), // optional, default 1 minute
// cache: MyCustomCacheManager(), // optional custom store
// clearOnWrite: false, // keep cache after POST/PUT/PATCH/DELETE
)
.build(),
);
📝 Notes: applies to GET requests; default store is in-memory (custom stores supported); cache clears by default on writes.
Retrieve 20 recent posts in ascending order:
final request = ListPostRequest(
page: 1,
perPage: 20,
order: Order.asc,
);
final response = await client.posts.list(request);
// Dart 3 pattern matching
switch (response) {
case WordpressSuccessResponse():
final data = response.data; // List<Post>
break;
case WordpressFailureResponse():
final error = response.error; // WordpressError
break;
}
// Or use helpers
final posts = (await client.posts.list(ListPostRequest(perPage: 20))).map(
onSuccess: (s) => s.data,
onFailure: (f) => <Post>[],
);
final justPosts = (await client.posts.list(ListPostRequest(perPage: 20))).dataOrThrow();
Convenience extensions are available under client.<interface>.extensions
for quick lookups and pagination:
final post = await client.posts.extensions.getById(123);
final allMedia = await client.media.extensions.listAll(perPage: 100);
Deep-dives and more examples live in the Wiki:
- 🧭 Getting Started: Usage
- 📩 Sending Requests
- 🛡 Authorization
- ⚡ Parallel Requests
- 🧠 Caching
- 🔗 Supported REST Methods
- 🧩 Pattern Directory Items
- 🧰 Using Custom Requests
- 🧪 Raw Requests
- 🔄 Middlewares
- 📜 API Changelog
- 🌊 Fluent Queries
- 🐛 For bugs or feature requests, use the issue tracker.
- 💡 Contributions are always appreciated. PRs are welcome!
Contributor tips (scripts, release process, consistency guards) are documented in the Wiki.
This project is MIT licensed.