ideasonpurpose/wp-data-model

构建WordPress站点数据模型的基包


README

版本 0.7.6

Ideas On Purpose 上为WordPress站点构建数据模型插件的基包。

Packagist codecov Coverage Status Maintainability styled with prettier

示例数据模型插件

要开始一个新的数据模型插件,复制 example 目录。在 lib 子目录中创建新的CPTs和Taxonomies,然后从 main.php 实例化它们。使用 taxonomyMap 将Taxonomies连接到Post Types,并使用对 WP\Rename 的静态调用重命名内置的Post Types和Taxonomies。

创建自定义Post Types和Taxonomies

新自定义Post_Types作为扩展 IdeasOnPurpose\WP\CPT 的PHP类创建,新的Taxonomies扩展 IdeasOnPurpose\WP\Taxonomy。所有新类都应该包括一个 props 方法,该方法定义 $this->args

分类映射和post_type分配

main.php 文件中,使用一个数组映射将post_types连接到taxonomies,其中每个键是一个单独的分类,每个值是要附加到其上的post_types数组。一个例子如下

// main.php
$this->taxonomyMap = [
  "category" => ["post", "policy", "help"],
  "audience" => ["post", "help", "event"],
  "fellowship" => ["event"],
];

分隔符

调用 new WP\Admin\Separators(22, 26) 并传入一个要插入分隔符的索引列表。匹配的索引将在CPT之后插入分隔符,所以以下代码将在 Events 下方直接显示一个分隔符

new CPT\Article(23);
new WP\Admin\Separators(23);

管理CSS

新的Post_Types和Taxonomies可以通过定义一个 $css 属性向WordPress管理区域添加特定的CSS规则。

生成标签

可以使用 WP\DataModel::postTypeLabels()WP\DataModel::taxonomyLabels() 从一组默认标签生成。这些通常用于在定义新的Post_Type或Taxonomy时填充 $args 属性的 labels 值。

参数是

  • $labelBase 字符串 标签的基本名称。这将根据WordPress默认值进行屈折和大小写校正。
  • $inflect [布尔值],默认 true
    一个布尔开关,用于启用 $labelBase 的单数/复数屈折。
  • $overrides [数组],默认: []
    一个标签数组,将覆盖生成的默认 post_typetaxonomy 标签。

WordPress兼容性

WordPress报告一个 tested 值,描述插件开发和测试的最新版本。此值在运行package.json version 脚本之前自动生成。测试值从 WordPress Stable-Check API 收集并存储在 assets/tested.json 中。

重命名内置Post Types和Taxonomies

可以轻松地重命名内置的post_types和taxonomies。DataModel对象向WP命名空间添加了一个静态函数,可以像这样调用

WP\Rename::post("topic"); // rename Posts to Topics
WP\Rename::category("colors"); // Rename Categories to Colors
WP\Rename::tag("flavors", ["popular_items" => "Most delicious flavors"]); // Rename Tags to Flavors with an override label

DataModel将规范化单数和复数术语以及大小写,以符合WordPress最佳实践。对于非标准用途,提供覆盖标签。

tagpost_tag 的别名,两者都可以使用。

重命名仅影响内置类型和Taxonomies的标签,内部查询变量保持不变。

为什么是静态调用?

通过静态调用进行重命名是一个有意的选择。与创建新的CPT或Taxonomy不同,重命名不会创建任何新内容,所以使用 new 调用没有意义,尽管它符合现有语法。

调用new CPTnew Taxonomy是有意义的,因为这些命令创建了新的事物。对于重命名,命令作用于已存在的事物,所以调用语法将与执行的动作不一致。

重命名的语法通常可以在一行中实现,而创建新的CPT或Taxonomy通常需要定义额外的动作和过滤器。

Composer更新

Docker Compose Composer服务会在~/.composer/auth.json中存在本地认证凭据时挂载并使用它们。如果这些凭据不存在且Composer遇到API速率限制,粘贴一个令牌将在挂载处创建一个新的auth.json文件,该文件将在主机系统上持久化。

导航菜单可见性

该插件将自动将所有自定义Taxonomy和CPT设置为默认在WordPress导航菜单管理中可见,适用于新用户账户。以前,用户必须记得打开屏幕选项并启用数据模型中的每个组件。

如果您想重置所有现有用户账户的导航菜单可见性,请运行以下命令以从用户_meta表中清除以前的条目。

DELETE FROM `wp_usermeta` WHERE `meta_key` = "metaboxhidden_nav-menus";

自动插件更新和AWS

每当推送新版本时,GitHub Action都会运行,编译和打包项目,然后将带有版本号的资产推送到我们的AWS S3存储桶之一。一个lambda微服务处理来自插件的查询,并启用WordPress插件的新版本的原生更新。

AWS Lambda

aws目录包含处理来自WordPress管理员插件页面的每个已安装插件的更新请求的lambda函数。

Lambda函数更新必须通过调用npm run lambda:deploy手动触发。

变更日志、描述和横幅

资产应存储在项目中,并上传到与插件基本名称匹配的目录

README.mdCHANGELOG.md文件将用于填充WordPress插件管理界面的详细信息。变更日志是自动生成的。

备注

  • wp-update-handler lambda函数位于AWS区域us-east-2
  • AWS lambda函数在node v14上运行,在npm install之前运行nvm use 14以确保包兼容性。
  • AWS凭据应从IAM > Users > Security Credentials为用户iop-cams创建。复制.env.sample并更新该文件中的值
  • AWS API-Gateway现在使用$LATEST而不是已发布版本来引用lambda,从而使部署更新更简单。在API Gateway资源的POST - Integration Request选项中可以找到Lambda Function设置
  • 使用此链接切换到正确的组织帐户角色:AWS 登录

GitHub Actions

作为示例插件的一部分的publish-to-aws GitHub Action将构建插件并将工件推送到我们的S3更新存储桶。每个项目都需要为访问AWS定义两个GitHub Secrets,这些名称在env部分的顶部文件example/.github/workflows/publish-to-aws.yml中可以找到

env:
  S3_URI: s3://ideasonpurpose-wp-updates
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

测试插件更新

可以通过发送类似以下内容的原始JSON主体的POST请求来测试我们的WordPress更新AWS端点

{
  "version": "0.0.1",
  "slug": "example-data-model",
  "plugin": "example-data-model/main.php"
}

默认Post_Type和Taxonomy标签

默认标签可以从WordPress中提取,通过转储全局$wp_post_types[$type]->labels$wp_taxonomies[$taxonomy]->labels对象。WordPress将标签定义为数组,但以对象的形式存储它们。帖子和平面重叠得很好,标签和类别包括用于分层显示的特殊情况。

// Default Page labels
[
  "name" => "Pages",
  "singular_name" => "Page",
  "add_new" => "Add New",
  "add_new_item" => "Add New Page",
  "edit_item" => "Edit Page",
  "new_item" => "New Page",
  "view_item" => "View Page",
  "view_items" => "View Pages",
  "search_items" => "Search Pages",
  "not_found" => "No pages found.",
  "not_found_in_trash" => "No pages found in Trash.",
  "parent_item_colon" => "Parent Page:",
  "all_items" => "All Pages",
  "archives" => "Page Archives",
  "attributes" => "Page Attributes",
  "insert_into_item" => "Insert into page",
  "uploaded_to_this_item" => "Uploaded to this page",
  "featured_image" => "Featured image",
  "set_featured_image" => "Set featured image",
  "remove_featured_image" => "Remove featured image",
  "use_featured_image" => "Use as featured image",
  "filter_items_list" => "Filter pages list",
  "filter_by_date" => "Filter by date",
  "items_list_navigation" => "Pages list navigation",
  "items_list" => "Pages list",
  "item_published" => "Page published.",
  "item_published_privately" => "Page published privately.",
  "item_reverted_to_draft" => "Page reverted to draft.",
  "item_scheduled" => "Page scheduled.",
  "item_updated" => "Page updated.",
  "menu_name" => "Pages",
  "name_admin_bar" => "Page",
];
// Default Category labels
[
  "name" => "Categories",
  "singular_name" => "Category",
  "search_items" => "Search Categories",
  "popular_items" => null,
  "all_items" => "All Categories",
  "parent_item" => "Parent Category",
  "parent_item_colon" => "Parent Category:",
  "edit_item" => "Edit Category",
  "view_item" => "View Category",
  "update_item" => "Update Category",
  "add_new_item" => "Add New Category",
  "new_item_name" => "New Category Name",
  "separate_items_with_commas" => null,
  "add_or_remove_items" => null,
  "choose_from_most_used" => null,
  "not_found" => "No categories found.",
  "no_terms" => "No categories",
  "filter_by_item" => "Filter by category",
  "items_list_navigation" => "Categories list navigation",
  "items_list" => "Categories list",
  "most_used" => "Most Used",
  "back_to_items" => "← Go to Categories",
  "menu_name" => "Categories",
  "name_admin_bar" => "category",
];
// Default Tag (post_tag) labels
[
  "name" => "Tags",
  "singular_name" => "Tag",
  "search_items" => "Search Tags",
  "popular_items" => "Popular Tags",
  "all_items" => "All Tags",
  "parent_item" => null,
  "parent_item_colon" => null,
  "edit_item" => "Edit Tag",
  "view_item" => "View Tag",
  "update_item" => "Update Tag",
  "add_new_item" => "Add New Tag",
  "new_item_name" => "New Tag Name",
  "separate_items_with_commas" => "Separate tags with commas",
  "add_or_remove_items" => "Add or remove tags",
  "choose_from_most_used" => "Choose from the most used tags",
  "not_found" => "No tags found.",
  "no_terms" => "No tags",
  "filter_by_item" => null,
  "items_list_navigation" => "Tags list navigation",
  "items_list" => "Tags list",
  "most_used" => "Most Used",
  "back_to_items" => "← Go to Tags",
  "menu_name" => "Tags",
  "name_admin_bar" => "post_tag",
];

 

由IOP提供

IOP 标志 该项目正在积极开发中,并在 Ideas On Purpose 的生产环境中使用。