outlandish / calendar-event-sync
WordPress 插件,用于从日历条目创建帖子
Requires
- php: >=7.2
- ext-json: *
- composer/installers: ~1.0||~2.0
- google/apiclient: v2.4.1
- wp-cli/wp-cli: ~2.5
Requires (Dev)
- brain/monkey: 2.*
- pcov/clobber: ^2.0
- phpunit/phpunit: 7.*
This package is auto-updated.
Last update: 2024-09-11 01:16:09 UTC
README
Outlandish 插件
此插件添加了一个 WP-CLI 命令,用于通过 Google 日历进行身份验证,并将事件同步到您的 WordPress 实例;以 post_type
为 event
的帖子形式存储。
它使用 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_ID
、GOOGLE_CALENDAR_PROJECT_ID
和 GOOGLE_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_type
为event
的自定义文章类型,您就能看到所有保存的数据。
默认情况下,该插件仅保存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
中,它将提供有关测试覆盖的代码信息。