outlandish/calendar-event-sync

WordPress 插件,用于从日历条目创建帖子

v1.1.0 2022-01-10 19:07 UTC

This package is auto-updated.

Last update: 2024-09-11 01:16:09 UTC


README

Outlandish 插件

Build Status

此插件添加了一个 WP-CLI 命令,用于通过 Google 日历进行身份验证,并将事件同步到您的 WordPress 实例;以 post_typeevent 的帖子形式存储。

它使用 WordPress 动作来允许您挂钩到此过程,并为每个事件添加任何您想要的附加元数据。

安装

要安装此插件,您需要使用 composer 从 Packagist 安装它,使用以下命令

composer require outlandish/calendar-event-sync

现在您可以在 WordPress 管理员中启用此插件。

基本用法

设置 Google Cloud 项目

要开始使用此插件同步 Google 日历事件,您需要创建一个具有 Google 日历 API 访问权限的 Google Cloud 项目。您可以从以下页面创建一个

https://developers.google.com/calendar/quickstart/php

您需要使用您打算同步日历条目的 Google 帐户创建此项目,因为未经审查和公开的 Google Cloud 项目只能访问创建它的帐户的资源。

创建云平台项目后,下载客户端配置详细信息,并保存以备后用。

设置 WordPress 项目

您需要在您的 wp-config.php 文件(或如果您正在使用 roots/bedrock 则为 config/application.php 文件)中添加一些新的常量。您必须设置的常量是

GOOGLE_CALENDAR_CLIENT_ID
GOOGLE_CALENDAR_PROJECT_ID
GOOGLE_CALENDAR_CLIENT_SECRET
GOOGLE_CALENDAR_ID

GOOGLE_CALENDAR_CLIENT_IDGOOGLE_CALENDAR_PROJECT_IDGOOGLE_CALENDAR_CLIENT_SECRET 都在您创建 Google Cloud 项目时下载的 credentials.json 文件中提供。GOOGLE_CALENDAR_ID 将是您创建 Google Cloud 项目时使用的 Google 帐户的电子邮件地址(或如果您的项目已审查并发布,可以是任何电子邮件地址)。您需要有权访问拥有此日历的 Google 帐户,以便在身份验证时允许插件从日历下载事件。

在命令行上进行身份验证

要使用 wp-cli 对插件进行身份验证以访问您的 Google 帐户的日历,请运行以下命令

wp events auth

这将输出一个 URL,您应该在浏览器中打开它。它将要求您使用 Google 帐户登录,然后要求您提供项目以访问您的日历。

完成此过程后,您将看到一个身份验证代码,将其复制并运行以下命令

wp events auth <auth-code>

将身份验证代码作为前一个命令的参数传递将启动从 Google 获取访问令牌的过程,然后将其存储在 WordPress 数据库中。

现在您应该可以运行命令以从日历获取事件并将它们存储到您的 WordPress 实例中。

wp events sync

命令完成后,它将报告成功的导入,并在命令行输出中告诉您获取了多少事件以及存储了多少事件。

如果您再次运行相同的命令,您将看到虽然获取了 300 个事件,但不应存储任何事件。这是因为存储事件之前,它会检查是否存在具有 Google 日历事件 ID 的现有事件。

查看您的活动

此插件不会在WordPress中注册“事件”自定义文章类型,因此如果您想查看插件创建的文章,您需要单独为您的WordPress项目执行此操作。然而,只要您创建一个具有post_typeevent的自定义文章类型,您就能看到所有保存的数据。

默认情况下,该插件仅保存Google日历事件的一些基本数据,包括事件的摘要(它将其保存为文章的标题)和事件的ID(它既作为文章元数据保存,也作为文章的别名保存)。当然,这并不太有用,因此您可能需要做更多的事情,下面将详细介绍高级用法。

高级用法

默认情况下,Google日历事件仅存储保存事件所需的最少数据,因为它不想假设您存储事件数据的方式。

添加更多元数据

您可以通过添加一个新的函数到您的主题,并在插件中定义的outlandish/calendar-sync/adding-event动作期间调用它,将Google日历事件的额外元数据添加到WordPress文章中。

例如,以下代码可以放置在您的functions.php文件中,并将事件描述、开始时间和结束时间作为元数据存储在文章中。

use Outlandish\CalendarEventSync\CalendarEventSyncPlugin;
use Outlandish\CalendarEventSync\Models\ExternalEvent;

add_action(CalendarEventSyncPlugin::STORE_EVENT_ACTION, function (ExternalEvent $event) {
    if ($event->savedToWordPress()) {
        add_post_meta($event->getPostId(), 'event_description', $event->getDescription());
        add_post_meta($event->getPostId(), 'event_start', $event->getStartTime()->getTimestamp());
        add_post_meta($event->getPostId(), 'event_end', $event->getEndTime()->getTimestamp());
    }
}, 20);

或者如果您使用ACF并定义了一些自定义字段

use Outlandish\CalendarEventSync\CalendarEventSyncPlugin;
use Outlandish\CalendarEventSync\Models\ExternalEvent;

add_action(CalendarEventSyncPlugin::STORE_EVENT_ACTION, function (ExternalEvent $event) {
    if ($event->savedToWordPress()) {
        update_field('event_description', $event->getDescription(), $event->getPostId());
        update_field('event_start', $event->getStartTime()->getTimestamp(), $event->getPostId());
        update_field('event_end', $event->getEndTime()->getTimestamp(), $event->getPostId());
    }
}, 20);

您的动作运行的时间(在我们的例子中设置为20)非常重要。WordPress文章的保存是在10时进行的,因此如果您将动作钩子的设置设置为10或更低,您将在外部事件转换为WordPress文章之前对其进行操作,并且无法保存有关事件的任何元数据。

替换默认行为

您可能不喜欢Google日历事件的存储方式,可以使用remove_action方法删除默认行为,并用您自己的替换。

默认情况下,WordPress文章是在时间10创建的,然后稍后更新为在时间50发布。

要停止事件默认发布,可以使用以下代码片段

remove_action(
    CalendarEventSyncPlugin::STORE_EVENT_ACTION, 
    [CalendarEventSyncPlugin::class, 'publishEvent'], 
    50
);

请注意,在执行此操作时,您需要指定与添加要删除的动作时相同的时序(函数的第三个参数)。这将阻止事件在创建后发布。然后您可以替换此行为,以决定哪些事件可以自动发布,哪些不能。

要停止保存事件,以便您可以将其与不同的post_type(例如)一起保存,您将想要运行以下片段

remove_action(
    CalendarEventSyncPlugin::STORE_EVENT_ACTION, 
    [CalendarEventSyncPlugin::class, 'defaultStoreStrategy'], 
    10
);

然后您可以定义自己的存储策略,如下所示

use Outlandish\CalendarEventSync\CalendarEventSyncPlugin;
use Outlandish\CalendarEventSync\Models\ExternalEvent;

add_action(CalendarEventSyncPlugin::STORE_EVENT_ACTION, function (ExternalEvent $event) {
    
    if ($event->getSummary() === 'Only store this event') { //only store the event if this is true
            
        $id = wp_insert_post([
            'post_title' => $event->getSummary(),
            'post_type' => 'calendar_event', // a custom post_type here
            'post_status' => 'draft',
            'post_name' => $event->getId()
        ]);
        
        add_post_meta($id, 'event_description', $event->getDescription());
        add_post_meta($id, 'event_start', $event->getStartTime()->getTimestamp());
        add_post_meta($id, 'event_end', $event->getEndTime()->getTimestamp());

        //always do this code
        add_post_meta($id, CalendarEventSyncPlugin::EXTERNAL_EVENT_ID_KEY, $event->getId());
        $event->setPostId($id);
    }
    
}, 10);

测试

测试是在使用humanmade/plugin-tester docker镜像的情况下编写的。

要运行项目测试,请运行composer install以安装插件依赖项,然后运行

docker run --rm -v "$PWD:/code" humanmade/plugin-tester --testsuite=Unit

这将运行在单元测试套件中定义的所有测试,并输出结果。

此插件在运行测试以生成代码覆盖率结果时,期望已安装pconv。如果您没有在本地php版本上安装它,可以运行composer install --ignore-platform-reqs以安装所需包,而无需安装pcov。

测试覆盖率

运行测试时,您还会生成一个HTML报告,该报告将出现在reports/coverage中,它将提供有关测试覆盖的代码信息。