Installation Add the package via Composer:
composer require tareq1988/wp-eloquent
Register the service provider in config/app.php:
'providers' => [
// ...
Tareq1988\WPEloquent\WPEloquentServiceProvider::class,
],
Basic Usage Use Eloquent models like in Laravel, but with WordPress database tables:
use Tareq1988\WPEloquent\WPModel;
class Post extends WPModel
{
protected $table = 'posts';
protected $primaryKey = 'ID';
}
// Fetch a post
$post = Post::find(1);
First Use Case Query WordPress posts with Eloquent syntax:
$posts = Post::where('post_status', 'publish')
->orderBy('post_date', 'desc')
->take(5)
->get();
Model Definitions
Extend WPModel for all WordPress tables (e.g., users, terms, comments):
class User extends WPModel {
protected $table = 'users';
protected $primaryKey = 'ID';
public $timestamps = false; // WP uses `user_registered` instead
}
Customizing Timestamps
Override getDates() to map WordPress fields:
protected $dates = ['user_registered', 'post_date', 'post_modified'];
Relationships Define relationships like Laravel, but use WordPress conventions:
class Post extends WPModel {
public function author() {
return $this->belongsTo(User::class, 'post_author', 'ID');
}
}
Querying Meta Data
Use accessors for meta fields (e.g., _wp_page_template):
public function getPageTemplateAttribute() {
return get_post_meta($this->ID, '_wp_page_template', true);
}
Bulk Operations
Leverage Eloquent’s update()/delete() for batch updates:
Post::where('post_status', 'draft')
->update(['post_status' => 'publish']);
wp post update 1 --post_status=draft
remember():
$featuredPosts = Post::where('post_type', 'post')
->where('meta_key', '_featured', 'meta_value', '1')
->remember(3600)
->get();
Primary Key Mismatch
Always set protected $primaryKey = 'ID' (WP’s default PK).
Fix: Override in every model.
Timestamp Conflicts
WP uses post_date/user_registered instead of created_at.
Fix: Disable $timestamps or customize getDates().
Meta Data Quirks
Meta fields (e.g., _wp_page_template) aren’t auto-loaded.
Fix: Use accessors or withMeta() trait (if available).
Soft Deletes
WP uses post_status = 'trash' for soft deletes. Override:
protected $softDelete = true;
protected $deletedAt = 'post_date';
Case Sensitivity
WP tables use lowercase, but queries may fail if case-sensitive.
Fix: Use snake_case in queries (e.g., post_status not PostStatus).
DB::enableQueryLog();
Post::all();
dd(DB::getQueryLog());
WP_DEBUG for deeper insights:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
Custom Query Builder
Extend Tareq1988\WPEloquent\WPBuilder for table-specific logic:
class CustomPostBuilder extends WPBuilder {
public function published() {
return $this->where('post_status', 'publish');
}
}
Scopes Add reusable query scopes:
class Post extends WPModel {
public function scopePublished($query) {
return $query->where('post_status', 'publish');
}
}
// Usage: Post::published()->get();
Events
Listen to WP events (e.g., save_post) and trigger Eloquent events:
add_action('save_post', function($postId) {
$post = Post::find($postId);
event('eloquent.saved: Post', $post);
});
How can I help you explore Laravel packages today?