elipettingale/wordpress-transformation

一个通过创建转换器类轻松转换数据的包(wordpress版本)

v1.1.5 2021-04-09 13:48 UTC

This package is auto-updated.

Last update: 2024-09-09 15:36:38 UTC


README

一个使用转换器类轻松转换数据的包。这个包背后的想法是能够接收一种格式的数据并返回不同的或简化的格式。例如,当你在创建API端点时,可能不想返回所有内容或者想以多种格式返回某些内容时,你可能会用到这个包。

这是此包的wordpress版本。这里还有一个通用版本:https://github.com/elipettingale/transformation

如何安装

只需使用composer安装此包

composer require elipettingle/wordpress-transformation

如何使用

此包的wordpress版本包含了通用版本的全部功能,但也可以与自定义文章类型和acf字段一起使用。请参考通用包的README以获取使用此包的详细说明:https://github.com/elipettingale/transformation

以下内容特定于包的wordpress版本。

文章转换器

文章转换器可以用作常规转换器类的替代,您可以使用它来转换文章或自定义文章类型。它包括对ACF的兼容性。文章转换器将返回基础WordPress属性的一部分(所有属性都可通过$includes使用)以及它所拥有的任何acf字段。

例如以下转换器

class TeamMemberTransformer extends PostTransformer
{

}

可能会返回以下内容

[
    'ID' => 108,
    'post_title' => 'Brandyn Sporer',
    'post_date' => '2020-02-05 09:27:57'
    'post_status' => 'publish'
    'post_content' => '<!-- wp:paragraph --> <p>Ut beatae et hic eum deserunt sit nihil. Asperiores consequatur quo et quia minus impedit modi voluptas. Consectetur ex voluptatem maiores. Ex ut sint sequi et minus. Molestias dolorem officia consectetur quia. Placeat voluptatem earum error aut dolores doloremque. Sed officiis quod eum saepe at a. Maxime omnis aut deserunt eveniet sit voluptas voluptas.</p> <!-- /wp:paragraph -->'
    'job_title' => 'Airframe Mechanic'
    'department' => 'Logistics'
    'address' => [
        'address' => '353 Little Bourke St, Melbourne VIC 3000, Australia'
        'lat' => -37.8134498
        'lng' => 144.9622691
        'zoom' => 14
        'place_id' => 'ChIJZdO0OLVC1moReE9bPKvo0UQ'
        'street_number' => '353'
        'street_name' => 'Little Bourke Street'
        'street_name_short' => 'Little Bourke St'
        'city' => 'Melbourne;
        'state' => 'Victoria'
        'state_short' => 'VIC'
        'post_code' => '3000'
        'country' => 'Australia'
        'country_short' => 'AU'
    ],
    'permalink' => 'http://wordpress.test/2020/02/05/brandyn-sporer/'
]

密集示例

以下是一个使用您所有可利用资源的示例

class AddressTransformer extends Transformer
{
    protected $includes = [
        'address',
        'coordinates'
    ];

    protected $rename = [
        'address' => 'full_address'
    ];

    public function getCoordinatesAttribute()
    {
        return [
            'lat' => $this->item['lat'],
            'lng' => $this->item['lng']
        ];
    }
}

class TeamMemberTransformer extends PostTransformer
{
    protected $includes = [
        'post_title',
        'first_name',
        'last_name',
        'initials',
        'address'
    ];

    protected $rename = [
        'post_title' => 'full_name'
    ];

    public function getFirstNameAttribute()
    {
        return explode(' ', $this->item->post_title)[0];
    }

    public function getLastNameAttribute()
    {
        return explode(' ', $this->item->post_title)[1];
    }

    public function getInitialsAttribute()
    {
        return $this->getFirstNameAttribute()[0] . $this->getLastNameAttribute()[0];
    }

    public function getAddressAttribute()
    {
        return Transform::one($this->item->address, AddressTransformer::class);
    }
}

$query = new WP_Query([
    'post_type' => 'team_member'
]);

$team_members = $query->get_posts();
$team_members = Transform::all($team_members, TeamMemberTransformer::class);

使用上述相同的数据,这将返回

[
    'full_name' => 'Brandyn Sporer',
    'first_name' => 'Brandyn',
    'last_name' => 'Sporer',
    'initials' => 'BS',
    'address' => [
        'full_address' => '353 Little Bourke St, Melbourne VIC 3000, Australia',
        'coordinates' => [
            'lat' => -37.8134498,
            'lng' => 144.9622691
        ]
    ]
]