fabianmichael / kirby-meta
满足所有SEO和元数据需求的一站式强大工具。
Requires
- php: >=8.1.0
- getkirby/composer-installer: ^1.2.1
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-16 09:05:48 UTC
README
⚠️ 警告: 此插件处于测试阶段。文档和实现仍不完整。
此段代码处理生成用于搜索引擎、社交网络、浏览器等目的的元标签。
主要功能
- 🔎 SEO和社交媒体优化的全套解决方案
- 📱 支持OpenGraph和Schema.org (JSON-LD) 标记
- 🚀 可自定义的元数据,自动从页面内容生成元数据
- 💻 丰富的面板UI,包括社交媒体预览
- 🦊 面板中易于理解的界面语言,在简洁性和广泛的控制选项之间提供良好的平衡。
- 🧙♂️ 大多数功能可以在配置中启用/禁用,面板UI只显示启用功能(归功于动态蓝图)
- 🪝 提供修改插件行为的钩子
- 🌍 所有蓝图都是完全可翻译的(包括英语、德语、法语和瑞典语翻译)
未来计划
- ✅ 在面板中实时检查元数据,并提供提示
此插件完全免费,并使用MIT许可证发布。但是,如果您将其用于商业项目并希望帮助我维护,请考虑 ❤️ 赞助我 以确保插件持续开发。
要求
- PHP 8.0+
- Kirby 3.6.0+
如何工作
该插件通过对应的关键字从页面内容文件(例如 article.txt
)中查找元数据。如果页面不包含特定字段,它会在当前页面模型上查找元数据方法,该方法可以返回当前页面的元数据数组。如果这也失败,它将回退到默认元数据,这些默认元数据存储在内容目录顶层的 site.txt
文件中。
这样,每个页面都能始终提供默认值,即使特定页面或其模型不包含例如缩略图或专用描述等信息。
安装 & 设置
使用composer安装(推荐)
composer require fabianmichael/kirby-meta
其他下载方法
您还可以将此存储库作为ZIP下载,或将整个存储库作为子模块添加。要从源代码运行,您需要安装依赖项: composer install
。
可用的配置选项
以下选项必须在您的 config.php
中设置。请注意,每个选项都必须以插件命名空间为前缀,例如 sitemap
=> fabianmichael.meta.sitemap
。
蓝图设置
您的网站和页面蓝图需要使用 选项卡,因为插件的所有输入字段都包含在选项卡中。元数据附带选项卡蓝图,需要相应地添加到您的网站和页面蓝图中
# site/blueprints/site.yml […] tabs: structure: label: Structure columns: […] meta: tabs/meta/site # site/blueprints/pages/default.yml […] tabs: content: label: Content columns: […] meta: tabs/meta/page
模板设置
在 <head>
元素中包含 meta
片段,最好在加载任何脚本或样式表之前
<!doctype html> <html> <head> <?php snippet('meta') ?> […] </head> […]
现在您可以从面板中添加/编辑元数据。
高级使用
从页面模型提供元数据
有时,您希望某些模板具有特殊行为。实现此目的的最简单方法是创建一个页面模型并实现一个 $page->metadata()
方法,该方法返回以下某些或全部键的数组
使用钩子
meta插件提供了一系列方便的钩子,允许您在不覆盖内置片段或为每个模板设置页面模型的情况下,进一步添加/删除/修改元数据。
⚠️ 钩子是一个强大的工具,可能会破坏编辑器在面板上对插件预期的行为。请谨慎使用!
meta.load:after
在模型上调用$page->metadata()
方法加载元数据之后。这允许您注入额外的数据。
return [ 'meta.load:after' => function ( array $metadata, Kirby\Cms\Page $page, ?string $languageCode ) { // set `thumbnail.png` as default share image for all pages, // if not other image was already set by a page model if (empty($metadata['og_image']) === true) { $metadata['og_image'] = $page->image('thumbnail.png'); } return $metadata; }, ];
meta.jsonld:after
钩子
在生成Schema.org图形之后。这允许您将额外的数据传递到数组中。
return [ 'meta.jsonld:after' => function ( array $json, FabianMichael\Meta\PageMeta $meta, Kirby\Cms\Page $page ) { // add breadcrumb to JSON-LD graph $items = []; $parents = $page->parents(); if ($parents->count() === 0) { return $json; } $i = 0; foreach ($parents->flip() as $parent) { $items[] = [ '@type' => 'ListItem', 'position' => ++$i, 'item' => [ '@id' => $parent->url(), 'name' => $parent->title()->toString(), ], ]; } $json['@graph'][] = [ '@type' => 'BreadcrumbList', 'itemListElement' => $items, ]; return $json; }, ];
meta.social:after
允许您修改OpenGraph/Twitter卡片数据。
return [ 'meta.social:after' => function ( array $social, FabianMichael\Meta\PageMeta $meta, Kirby\Cms\Page $page ) { // add first video file of page to OpenGraph markup if ($page->hasVideos()) { $social[] = [ 'property' => 'og:video', 'content' => $page->videos()->first()->url(), ]; } return $social; }, ];
'meta.sitemap…
钩子
这些钩子允许您完全改变生成站点地图的方式。这些函数旨在直接操作提供的DOM文档和元素,不应返回任何内容。
return [ 'hooks' => [ 'meta.sitemap:before' => function ( Kirby $kirby, DOMDocument $doc, DOMElement $root ) { // add namespace for image sitemap $root->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:image', 'http://www.google.com/schemas/sitemap-image/1.1'); }, 'meta.sitemap.url' => function ( Kirby $kirby, Page $page, PageMeta $meta, DOMDocument $doc, DOMElement $url) { if ($page->images()->count() === 0) { // dynamically exclude page from the sitemap return false; } foreach ($page->images() as $image) { // add all images from page to image sitemap. $imageEl = $doc->createElement('image:image'); $imageEl->appendChild($doc->createElement('image:loc', $image->url())); if ($image->alt()->isNotEmpty()) { $imageEl->appendChild($doc->createElement('image:caption', $image->alt())); } $url->appendChild($imageEl); } }, 'meta.sitemap:after' => function ( Kirby $kirby, DOMDocument $doc, DOMElement $root ) { foreach ($root->getElementsByTagName('url') as $url) { if ($lastmod = $url->getElementsByTagName('lastmod')[0] ?? null) { // remove lastmod date from sitemap entries for some reason … $url->removeChild($lastmod); } } }, 'meta.theme.color' => function ( ?string $color ) { return '#ff0000'; } ], ];
操作索引页面
有一些辅助工具可用于操作页面
页面方法
如果您想了解页面是否在站点地图中索引,可以使用$page->isIndexible()
(返回一个bool
)。
站点方法
要获取所有根据您的设置索引的页面,可以使用:$site->indexedPages()
(返回一个页面的Kirby\Cms\Collection
)。
致谢
这部分是基于较早版本的meta插件,我最初是为getkirby.com开发的。我非常喜欢这个想法,因此想将其应用于其他网站的一般用途。
从其他现有的Kirby插件中汲取了许多灵感(以及一些代码),例如MetaKnight(由diesdas ⚡️ digital开发)和Meta Tags(由Pedro Borges开发)。