cmachu/wp-eloquent-models

WordPress 的 Laravel 包装器,将所有 WordPress 模型转换为 Laravel Eloquent 模型。

0.4.5 2023-09-07 11:33 UTC

This package is auto-updated.

Last update: 2024-09-07 13:35:28 UTC


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

元数据

模型 PostUserCommentTerm 都实现了 HasMeta 接口。因此,可以使用 getMetasetMeta 辅助函数轻松检索和设置元数据。

$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());