fabianmichael/kirby-meta

满足所有SEO和元数据需求的一站式强大工具。

资助包维护!
fabianmichael

安装量: 5,694

依赖项: 2

建议者: 1

安全性: 0

星标: 65

关注者: 8

分支: 7

开放问题: 12

类型:kirby-plugin

2.0.0-alpha.1 2024-03-22 17:45 UTC

README

⚠️ 警告: 此插件处于测试阶段。文档和实现仍不完整。

此段代码处理生成用于搜索引擎、社交网络、浏览器等目的的元标签。

Screenshot 2022-01-14 at 09-57-24 Mirin Avo’s Kitchen

主要功能

  • 🔎 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开发)。