wanze/seo-maestro

Seo Maestro 允许您轻松管理页面元数据和网站地图。

安装次数: 2,172

依赖项: 0

建议者: 0

安全: 0

星星: 34

关注者: 7

分支: 9

开放问题: 8

类型:processwire-module

v1.1.1 2022-06-03 20:00 UTC

README

StyleCI License: MIT ProcessWire 3

一个 ProcessWire 模块,帮助您像老板一样轻松管理与 SEO 相关的任务!😎✌️

  • 自动从您的页面生成并维护 XML 网站地图。
  • 包括字段类型和输入字段来管理网站地图设置和页面的元数据(标题、描述、规范 URL、Opengraph、Twitter、结构化数据、robots 等)。
  • 支持多语言对网站地图和元数据的支持。
  • 在模板级别配置元数据的默认值,并让页面继承或单独覆盖它们。
  • 将现有字段映射到元数据,减少内容编辑器重复内容的需求。
  • 内容编辑器实时预览输入的元数据在 Google 和 Facebook 上的显示效果。

以下是从 SeoMaestro 字段获取的所有渲染元数据的示例

<title>Sed dictum eros quis massa semper rutrum. | acme.com</title>
<meta name="description" content="Si lobortis singularis genitus ibidem saluto. Dolore ad nunc, mos accumsan paratus duis suscipit luptatum facilisis macto uxor iaceo quadrum. Demoveo, appellatio elit neque ad commodo ea. Wisi, iaceo, tincidunt at commoveo rusticus et, ludus.">
<meta name="keywords" content="Foo,Bar">
<link rel="canonical" href="https://acme.com/en/about/">
<meta property="og:title" content="Sed dictum eros quis massa semper rutrum.">
<meta property="og:description" content="Si lobortis singularis genitus ibidem saluto. Dolore ad nunc, mos accumsan paratus duis suscipit luptatum facilisis macto uxor iaceo quadrum. Demoveo, appellatio elit neque ad commodo ea. Wisi, iaceo, tincidunt at commoveo rusticus et, ludus.">
<meta property="og:image" content="https://acme.com/site/assets/files/1001/og-image.jpg">
<meta property="og:image:type" content="image/jpg">
<meta property="og:image:width" content="1600">
<meta property="og:image:height" content="1200">
<meta property="og:image:alt" content="Lorem Ipsum">
<meta property="og:type" content="website">
<meta property="og:url" content="https://acme.com/en/about/">
<meta property="og:locale" content="en_EN">
<meta name="twitter:card" content="summary">
<meta name="twitter:creator" content="@schtifu">
<meta name="twitter:site" content="@schtifu">
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
  {
    "@type": "ListItem",
    "position": 1,
    "name": "About",
    "item": "https://acme.com/en/about/"
  }
  ]
}
</script>
<meta name="generator" content="ProcessWire">
<link rel="alternate" href="https://acme.com/en/about/" hreflang="en">
<link rel="alternate" href="https://acme.com/en/about/" hreflang="x-default">
<link rel="alternate" href="https://acme.com/de/ueber/" hreflang="de">
<link rel="alternate" href="https://acme.com/fi/tietoja/" hreflang="fi">
<meta name="google-site-verification" content="google-1234">
<meta name="msvalidate.01" content="bing-1234">

要求

  • ProcessWire 3.0 或更高版本
  • PHP 7.0 或更高版本

安装

模块目录 或使用 Composer 安装模块

composer require wanze/seo-maestro

配置

Seo Maestro 模块提供了以下配置

  • 启用网站地图生成 自动生成并维护 XML 网站地图文件。
  • 网站地图路径 网站地图相对于 ProcessWire 根目录的路径和文件名。请确保您有权写入给定文件夹,因为模块需要写入 XML 文件。
  • 缓存时间 网站地图应缓存的分钟数。
  • 基本 URL 用于网站地图中所有页面链接和 URL 元标签的基本 URL,例如 https://yourdomain.com。如果为空,则使用当前域名。
  • 默认语言 默认语言的 2 个字母语言代码,用于确保多语言网站的正确网站地图。

检查网站地图文件是否正确后,将 sitemap.seomaestro.xml 更改为 sitemap.xml。默认名称降低了意外覆盖现有文件的风险。

配置页面元数据和网站地图设置

使用包含的字段类型管理每个页面的元数据和网站地图配置。继续创建一个新的 Seo Maestro 类型的字段,字段的好名字是 seo 😄。

  • 详细信息 > 默认值 下配置默认元数据。对于基于文本的元标签,您可以输入字符串或占位符以映射现有字段。例如,如果您的模板包含一个 lead_text 字段,该字段默认用于 description 元标签,则使用占位符 {lead_text}。还可以将字符串和占位符组合。以下示例在页面标题后附加公司名称:{title} | acme.com
  • opengraph 图片标签也支持占位符:只需引用一个图片字段。如果字段包含多个图片,则使用第一个图片。例如,{images} 将选择 images 字段中的第一个图片。
  • 默认情况下,每个页面继承元标签值和网站地图配置,但在编辑页面时可以单独覆盖它们。
  • 在“输入”标签下,配置编辑页面时内容编辑器显示哪些元数据。排除不需要或不应由内容编辑器修改的任何元数据。您还可以排除元数据组,例如完全排除Opengraph部分。
  • 网站管理工具”部分允许您输入Google和Bing验证码,这些验证码作为元标签渲染。

ℹ️ 在模板的上下文中编辑字段,以覆盖模板的任何默认数据。

XML站点地图

如果启用,模块将在请求被ProcessWire处理之后,在ProcessPageView::finished后挂钩以生成XML站点地图。

  • 只有在当前用户已登录且当前页面是管理页面时,才会生成站点地图。
  • 它只包括具有Seo Maestro字段的模板的页面,以便读取站点地图设置。
  • 它包括隐藏的页面。
  • 它排除游客用户无法查看的页面。

不要忘记将站点地图提交给Google,无论是通过搜索控制台还是通过在robots.txt文件中指定路径。

⚠ 如果您的安装有大量页面,请求生成站点地图需要太长时间,或者遇到内存问题,最好禁用自动生成。使用\SeoMaestro\SitemapManager类自行创建站点地图,例如通过CLI脚本。

元数据

通用

不通过字段类型管理但默认渲染的通用元标签。

字段类型

以下元数据通过Seo Maestro字段对每个页面进行管理。元标签按所谓的组织。

网站管理工具

如果您在编辑字段时在“网站管理工具”部分添加了Google和Bing验证码,则将渲染以下附加元标签

输出元标签

元标签必须在模板的<head>区域中渲染

// Render all meta tags, including the common ones.
echo $page->seo;
// or...
echo $page->seo->render();

// Render groups individually, e.g. the opengraph meta data.
echo $page->seo->opengraph->render();

API

模块提供了一个易于使用的API,用于检索和修改页面元数据和站点地图配置

// Get a single value.
echo $page->seo->meta->description;

$page->of(false);

// Set values as strings or placeholders to reference the value of another field.
$page->seo->opengraph->description = 'A description for opengraph';
$page->seo->meta->title = '{title}';

// Inherit the Twitter card value from the field configuration.
$page->seo->twitter->card = 'inherit';

// Include the page in the sitemap and bump its priority.
$page->seo->sitemap->include = 1;
$page->seo->sitemap->priority = 0.9;

$page->save();

始终为当前语言设置值。切换用户的语言以设置不同语言的值

$current = $user->language;

$user->language = $languages->get('de');

$page->of(false);
$page->seo->opengraph->title = 'Hallo Welt';
$page->save();

$user->language = $current;

可用选择器

Seo Maestro字段类型不支持使用选择器查询元数据,例如seo.meta.title%=foo将不会起作用。所有元数据都存储为JSON,允许随时添加新数据而无需更改数据库模式。然而,模块在保存页面时存储了一些有用的标志,这些标志可以用在选择器中

  • sitemap_include可以快速查询页面是否包含在站点地图中。
  • <group>_inherit设置为1,如果页面继承了给定组的所有元数据。

示例

查找所有包含在站点地图中的页面

$pages->find('seo.sitemap_include=1');

查找所有继承所有元数据和opengraph数据的站点地图排除页面

$pages->find('seo.sitemap_include=0,seo.meta_inherit=1,seo.opengraph_inherit=1');

挂钩

有几个挂钩可供开发者自定义模块的行为。

___renderMetatags

添加、删除或修改组的渲染元标签。

// Remove the description and canonical URL.
$wire->addHookAfter('SeoMaestro::renderMetatags', function (HookEvent $event) {
    $tags = $event->arguments(0);
    $group = $event->arguments(1);

    if ($group === 'meta') {
        unset($tags['description']);
        unset($tags['canonicalUrl']);
        $event->return = $tags;
    }
});

___renderSeoDataValue

在渲染后修改元数据的值。

// Add the brand name after the title. 
$wire->addHookAfter('SeoMaestro::renderSeoDataValue', function (HookEvent $event) {
    $group = $event->arguments(0);
    $name = $event->arguments(1);
    $value = $event->arguments(2);
    
    if ($group === 'meta' && $name === 'title') {
        $event->return = $value . ' | acme.com';
    }
});

___alterSeoDataForm

自定义包含SEO数据的表单的输入字段,例如更改折叠状态或描述。

___sitemapAlwaysExclude

指定永远不会出现在站点地图中的页面,无论页面级别的站点地图设置如何。默认情况下排除404页面。

$wire->addHookAfter('SeoMaestro::sitemapAlwaysExclude', function (HookEvent $event) {
    $pageArray = $event->arguments(0);
    $pageArray->add($excludedPage);
});

___sitemapItems

添加或修改站点地图中的条目。

$item = (new SitemapItem())
    ->set('loc', '/en/my-custom-url')
    ->set('priority', 'custom-priority')
    ->set('changefreq', 'changefreq-custom')
    ->addAlternate('de', '/de/my-custom-url-de');

$wire->addHookAfter('SeoMaestro::sitemapItems', function (HookEvent $event) use ($item) {
    $event->return = array_merge($event->return, [$item]);
});

运行测试

该模块包含基于PHPUnit的测试用例,位于./tests目录中。

  • 请确保已安装开发依赖项,在site/modules/SeoMaestro目录下运行composer install
  • 测试将创建页面、字段和模板。一切都应该得到妥善清理,但你绝对不应该在生产环境中运行它们哦 😉。
  • 一些测试期望存在多语言设置。为了使它们通过,请使用ProcessWire提供的多语言网站配置。查看.travis.yml文件以获取自动化设置。

要运行测试

cd site/modules/SeoMaestro && vendor/bin/phpunit --bootstrap tests/bootstrap.php tests/src --colors