cmachu / wp-eloquent-models
WordPress 的 Laravel 包装器,将所有 WordPress 模型转换为 Laravel Eloquent 模型。
README
一个基于 PHP >= 8.1 的分支库,将 WordPress 表转换为 Laravel Eloquent 模型。这对于可能希望使用 Laravel Eloquent 的出色功能的所有 WordPress 项目都有帮助。
或者,也许你正在使用 Laravel 和 Roots Bedrock/Sage 等构建项目,并希望在使用 Laravel 内部访问 WordPress 数据。或者,也许你正在使用类似于 Slim 或更好的 Lumen 编写 API,不想通过加载整个 WP 核心来增加你的加载时间。
这是一个基于 Laravel 的 Eloquent 的优秀模板,可以帮助你快速开始。
注意: 这是对 Eloquent 额外功能的文档。有关 Eloquent 所有功能的文档,请访问 文档。
概述
安装 WPEloquent
安装 WPEloquent 的推荐方法是使用 Composer。
composer require mallardduck/wp-eloquent-models
版本指南
当前版本:0.4.2
设置 - 常见
require_once('vendor/autoload.php'); \WPEloquent\Core\Laravel::connect([ 'global' => true, 'config' => [ 'database' => [ 'user' => 'user', 'password' => 'password', 'name' => 'database', 'host' => '127.0.0.1', 'port' => '3306' ], // your wpdb prefix 'prefix' => 'wp_', ], // enable events 'events' => false, // enable query log 'log' => true ]);
如果你想在整个 WP 安装上启用此功能,可以创建一个包含上述代码的文件,并将其放入 mu-plugins
文件夹。
使用 Laravel 进行设置
这些说明适用于当你想在 Laravel 中使用 Eloquent 与 WordPress 数据库一起工作时。最简单的方法是在 Laravel 的 config/database.php
中创建一个新的配置。例如
'wordpress' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_NAME', 'wordpress'), 'username' => env('DB_USER', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => env('DB_PREFIX', 'wp_'), 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
注意: 在此示例中,WordPress 数据库和 Laravel 数据库可以通过同一个 MySQL 用户在同一个服务器上访问。你的项目的 Laravel .env
可能需要调整以匹配此示例。
然后在你的 AppServiceProvider
中添加以下行
BaseModel::setDefaultConnection('wordpress');
支持的模型
文章
use \WPEloquent\Model\Post; // getting a post $post = Post::find(1); // available relationships $post->author; $post->comments; $post->terms; $post->tags; $post->categories; $post->meta;
状态
默认情况下,Post
返回所有状态的文章。但是,你可以通过重写 本地作用域 published
来仅返回发布文章。
Post::published()->get();
或者,如果你需要特定的状态,可以通过定义状态重写 本地作用域。
Post::status('draft')->get();
文章类型
默认情况下,Post
返回所有文章类型的文章。但是,你可以通过定义文章类型重写 本地作用域。
Post::type('page')->get();
评论
use \WPEloquent\Model\Comment; // getting a comment $comment = Comment::find(12345); // available relationships $comment->post; $comment->author; $comment->meta
术语
在此版本中,Term
仍然可以作为模型访问,但只能通过文章访问。
$post->terms()->where('taxonomy', 'country');
用户
use \WPEloquent\Model\User; // getting a comment $user = User::find(123); // available relationships $user->posts; $user->meta; $user->comments
元数据
模型 Post
、User
、Comment
、Term
都实现了 HasMeta
接口。因此,可以使用 getMeta
和 setMeta
辅助函数轻松检索和设置元数据。
$post = Post::find(1); $post->setMeta('featured_image', 'my-image.jpg'); $post->setMeta('breakfast', ['waffles' => 'blueberry', 'pancakes' => 'banana']); // or all in one call $featured_image = Post::find(1)->getMeta('featured_image'); Post::find(1)->setMeta('featured_image', 'image.jpg'); // same applies for all other models $user = User::find(1) $facebook = $user->getMeta('facebook'); $user->setMeta('social', ['facebook' => 'facebook.com/me', 'instagram' => 'instagram.com/me']); $comment = Comment::find(1); $meta = $comment->getMeta('some_comment_meta'); $term = Term::find(123); $meta = $term->getMeta('some_term_meta'); // delete meta $post = Post::find(123)->deleteMeta('some_term_meta');
选项
在 WordPress 中,你可以使用 get_option
。或者,如果你不想加载 WordPress 核心,可以使用辅助函数 getValue
。
use \WPEloquent\Model\Post; $siteurl = Option::getValue('siteurl');
或者当然,长形式
use \WPEloquent\Model\Options; $siteurl = Option::where('option_name', 'siteurl')->value('option_value');
链接
use \WPEloquent\Model\Link; $siteurl = Link::find(1);
扩展自己的模型
如果你想向模型添加自己的功能,例如 User
,你可以这样做
namespace App\Model; class User extends \WPEloquent\Model\User { public function orders() { return $this->hasMany('\App\Model\User\Orders'); } public function current() { // some functionality to get current user } public function favorites() { return $this->hasMany('Favorites'); } }
另一个例子是为文章上的自定义分类添加功能,比如 country
namespace App\Model; class Post extends \WPEloquent\Model\Post { public function countries() { return $this->terms()->where('taxonomy', 'country'); } } Post::with(['categories', 'countries'])->find(1);
或者你可能需要访问自定义文章类型,比如
namespace App\Model; class CustomPostType extends \WPEloquent\Model\Post { protected $post_type = 'custom_post_type'; public static function getBySlug(string $slug): self { return self::where('post_name', $slug)->firstOrfail(); } } CustomPostType::with(['categories', 'countries'])->find(1);
查询日志
有时候查看查询日志对调试很有帮助。您可以通过在Laravel::connect
方法中将log
设置为true
来启用日志(参见配置)。日志可以通过运行来检索。
use \WPEloquent\Core\Laravel; print_r(Laravel::queryLog());