{"id":16926065,"url":"https://github.com/pedroborges/kirby-meta-tags","last_synced_at":"2025-10-07T16:58:20.265Z","repository":{"id":48474154,"uuid":"83175859","full_name":"pedroborges/kirby-meta-tags","owner":"pedroborges","description":"⬢ HTML meta tags generator for Kirby. Supports Open Graph and Twitter Cards out of the box.","archived":false,"fork":false,"pushed_at":"2023-03-22T13:03:47.000Z","size":75,"stargazers_count":97,"open_issues_count":9,"forks_count":11,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-03T13:47:21.121Z","etag":null,"topics":["kirby-cms","kirby-plugin","meta-tags","open-graph","twitter-cards"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pedroborges.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-02-26T01:52:54.000Z","updated_at":"2024-09-12T18:03:28.000Z","dependencies_parsed_at":"2024-06-18T20:00:07.896Z","dependency_job_id":"6f4b77bd-a9c9-4988-bbcf-ae06138ddba2","html_url":"https://github.com/pedroborges/kirby-meta-tags","commit_stats":{"total_commits":36,"total_committers":5,"mean_commits":7.2,"dds":"0.16666666666666663","last_synced_commit":"18f03782e650d3842014770a67409e2aed1d6a9a"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedroborges%2Fkirby-meta-tags","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedroborges%2Fkirby-meta-tags/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedroborges%2Fkirby-meta-tags/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pedroborges%2Fkirby-meta-tags/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pedroborges","download_url":"https://codeload.github.com/pedroborges/kirby-meta-tags/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248018060,"owners_count":21034048,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kirby-cms","kirby-plugin","meta-tags","open-graph","twitter-cards"],"created_at":"2024-10-13T20:28:57.055Z","updated_at":"2025-10-07T16:58:15.225Z","avatar_url":"https://github.com/pedroborges.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kirby Meta Tags [![Release](https://img.shields.io/github/release/pedroborges/kirby-meta-tags.svg)](https://github.com/pedroborges/kirby-meta-tags/releases) [![Issues](https://img.shields.io/github/issues/pedroborges/kirby-meta-tags.svg)](https://github.com/pedroborges/kirby-meta-tags/issues)\n\nHTML meta tags generator for Kirby. Supports [Open Graph](http://ogp.me), [Twitter Cards](https://dev.twitter.com/cards/overview), and [JSON Linked Data](https://json-ld.org) out of the box.\n\n## Requirements\n- Kirby 3\n- PHP 7.1+\n\n## Installation\n\n### Download\nDownload and copy this repository to `site/plugins/meta-tags`.\n\n### Git submodule\n```\ngit submodule add https://github.com/pedroborges/kirby-meta-tags.git site/plugins/meta-tags\n```\n\n### Composer\n```\ncomposer require pedroborges/kirby-meta-tags\n```\n\n\u003e For Kirby 2, you can download [v1.1.1](https://github.com/pedroborges/kirby-meta-tags/archive/v1.1.1.zip) and copy the files to `site/plugins/meta-tags`.\n\n## Basic Usage\nAfter installing the Meta Tags plugin, you need to add one line to the `head` element on your template, or `header.php` snippet:\n\n```diff\n\u003chtml\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"utf-8\"\u003e\n    \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1\"\u003e\n+   \u003c?php echo $page-\u003emetaTags() ?\u003e\n```\n\nBy default the `metaTags` page method will render all tag groups at once. But you can also render only one tag at a time:\n\n```php\n\u003c?php echo $page-\u003emetaTags('title') ?\u003e\n```\n\nOr specify which tags to render:\n\n```php\n\u003c?php echo $page-\u003emetaTags(['og', 'twitter', 'json-ld']) ?\u003e\n```\n\n### Default\nThe plugin ships with some default meta tags enabled for your convenience:\n\n```php\nreturn [\n    // other options...\n    'pedroborges.meta-tags.default' =\u003e function ($page, $site) {\n        return [\n            'title' =\u003e $site-\u003etitle(),\n            'meta' =\u003e [\n                'description' =\u003e $site-\u003edescription()\n            ],\n            'link' =\u003e [\n                'canonical' =\u003e $page-\u003eurl()\n            ],\n            'og' =\u003e [\n                'title' =\u003e $page-\u003eisHomePage()\n                    ? $site-\u003etitle()\n                    : $page-\u003etitle(),\n                'type' =\u003e 'website',\n                'site_name' =\u003e $site-\u003etitle(),\n                'url' =\u003e $page-\u003eurl()\n            ]\n        ];\n    }\n]\n```\n\n**The `pedroborges.meta-tags.default` option is applied to all pages on your Kirby site.** Of course you can change the defaults. In order to do that, just copy this example to your `site/config/config.php` file and tweak it to fit your website needs.\n\n### Templates\nFollowing the flexible spirit of Kirby, you also have the option to add template specific meta tags:\n\n```php\nreturn [\n    // other options...\n    'pedroborges.meta-tags.templates' =\u003e function ($page, $site) {\n        return [\n            'song' =\u003e [\n                'og' =\u003e [\n                    'type' =\u003e 'music.song',\n                    'namespace:music' =\u003e [\n                        'duration' =\u003e $page-\u003eduration(),\n                        'album' =\u003e $page-\u003eparent()-\u003eurl(),\n                        'musician' =\u003e $page-\u003esinger()-\u003ehtml()\n                    ]\n                ]\n            ]\n        ];\n    }\n]\n```\n\nIn the example above, those settings will only be applied to pages which template is `song`.\n\nFor more information on all the `meta`, `link`, Open Graph and Twitter Card tags available, check out these resources:\n\n- [`\u003chead\u003e` Cheat Sheet](http://gethead.info)\n- [Open Graph](http://ogp.me)\n- [Twitter Cards](https://dev.twitter.com/cards/overview)\n\n## Options\nBoth the `pedroborges.meta-tags.default` and `pedroborges.meta-tags.templates` accept similar values:\n\n### `pedroborges.meta-tags.default`\nIt accepts an array containing any or all of the following keys: `title`, `meta`, `link`, `og`, and `twitter`. With the exception of `title`, all other groups must return an array of key-value pairs. Check out the [tag groups](#tag-groups) section to learn which value types are accepted by each key.\n\n```php\n'pedroborges.meta-tags.default' =\u003e function ($page, $site) {\n    return [\n        'title' =\u003e 'Site Name',\n        'meta' =\u003e [ /* meta tags */ ],\n        'link' =\u003e [ /* link tags */ ],\n        'og' =\u003e [ /* Open Graph tags */ ],\n        'twitter' =\u003e [ /* Twitter Card tags */ ],\n        'json-ld' =\u003e [ /* JSON-LD schema */ ],\n    ];\n}\n```\n\n### `pedroborges.meta-tags.templates`\nThis option allows you to define a template specific set of meta tags. It must return an array where each key corresponds to the template name you are targeting.\n\n```php\n'pedroborges.meta-tags.templates' =\u003e function ($page, $site) {\n    return [\n        'article' =\u003e [ /* tags groups */ ],\n        'about' =\u003e [ /* tags groups */ ],\n        'products' =\u003e [ /* tags groups */ ],\n    ];\n}\n```\n\nWhen a key matches the current page template name, it is merged and overrides any repeating properties defined on the `pedroborges.meta-tags.default` option so you don't have to repeat yourself.\n\n## Tag Groups\nThese groups accept string, closure, or array as their values. Being so flexible, the sky is the limit to what you can do with Meta Tags!\n\n### `title`\nCorresponds to the HTML `\u003ctitle\u003e` element and accepts a `string` as value.\n\n```php\n'title' =\u003e $page-\u003eisHomePage()\n    ? $site-\u003etitle()\n    : $page-\u003etitle(),\n```\n\n\u003e You can also pass it a `closure` that returns a `string` if the logic to generate the `title` is more complex.\n\n### `meta`\nThe right place to put any generic HTML `\u003cmeta\u003e` elements. It takes an `array` of key-value pairs. The returned value must be a `string` or `closure`.\n\n```php\n'meta' =\u003e [\n    'description' =\u003e $site-\u003edescription(),\n    'robots' =\u003e 'index,follow,noodp'\n],\n```\n\n\u003cdetails\u003e\n    \u003csummary\u003e\u003cstrong\u003eShow HTML\u003c/strong\u003e 👁\u003c/summary\u003e\u003cp\u003e\n\n```html\n\u003cmeta name=\"description\" content=\"Website description\"\u003e\n\u003cmeta name=\"robots\" content=\"index,follow,noodp\"\u003e\n```\n\n\u003c/p\u003e\u003c/details\u003e\n\n### `link`\nThis tag group is used to render HTML `\u003clink\u003e` elements. It takes an `array` of key-value pairs. The returned value can be a `string`, `array`, or `closure`.\n\n```php\n'link' =\u003e [\n    'stylesheet' =\u003e url('assets/css/main.css'),\n    'icon' =\u003e [\n      ['href' =\u003e url('assets/images/icons/favicon-62.png'), 'sizes' =\u003e '62x62', 'type' =\u003e'image/png'],\n      ['href' =\u003e url('assets/images/icons/favicon-192.png'), 'sizes' =\u003e '192x192', 'type' =\u003e'image/png']\n    ],\n    'canonical' =\u003e $page-\u003eurl(),\n    'alternate' =\u003e function ($page) {\n        $locales = [];\n\n        foreach (kirby()-\u003elanguages() as $language) {\n            if ($language-\u003ecode() == kirby()-\u003elanguage()) continue;\n\n            $locales[] = [\n                'hreflang' =\u003e $language-\u003ecode(),\n                'href' =\u003e $page-\u003eurl($language-\u003ecode())\n            ];\n        }\n\n        return $locales;\n    }\n],\n```\n\n\u003cdetails\u003e\n    \u003csummary\u003e\u003cstrong\u003eShow HTML\u003c/strong\u003e 👁\u003c/summary\u003e\u003cp\u003e\n\n```html\n\u003clink rel=\"stylesheet\" href=\"https://pedroborg.es/assets/css/main.css\"\u003e\n\u003clink rel=\"icon\" href=\"https://pedroborg.es/assets/images/icons/favicon-62.png\" sizes=\"62x62\" type=\"image/png\"\u003e\n\u003clink rel=\"icon\" href=\"https://pedroborg.es/assets/images/icons/favicon-192.png\" sizes=\"192x192\" type=\"image/png\"\u003e\n\u003clink rel=\"canonical\" href=\"https://pedroborg.es\"\u003e\n\u003clink rel=\"alternate\" hreflang=\"pt\" href=\"https://pt.pedroborg.es\"\u003e\n\u003clink rel=\"alternate\" hreflang=\"de\" href=\"https://de.pedroborg.es\"\u003e\n```\n\n\u003c/p\u003e\u003c/details\u003e\n\n### `og`\nWhere you can define [Open Graph](http://ogp.me) `\u003cmeta\u003e` elements.\n\n```php\n'og' =\u003e [\n    'title' =\u003e $page-\u003etitle(),\n    'type' =\u003e 'website',\n    'site_name' =\u003e $site-\u003etitle(),\n    'url' =\u003e $page-\u003eurl()\n],\n```\n\n\u003cdetails\u003e\n    \u003csummary\u003e\u003cstrong\u003eShow HTML\u003c/strong\u003e 👁\u003c/summary\u003e\u003cp\u003e\n\n```html\n\u003cmeta property=\"og:title\" content=\"Passionate web developer\"\u003e\n\u003cmeta property=\"og:type\" content=\"website\"\u003e\n\u003cmeta property=\"og:site_name\" content=\"Pedro Borges\"\u003e\n\u003cmeta property=\"og:url\" content=\"https://pedroborg.es\"\u003e\n```\n\n\u003c/p\u003e\u003c/details\u003e\n\nOf course you can use Open Graph [structured objects](http://ogp.me/#structured). Let's see a blog post example:\n\n```php\n'pedroborges.meta-tags.templates' =\u003e function ($page, $site) {\n    return [\n        'article' =\u003e [ // template name\n            'og' =\u003e [  // tags group name\n                'type' =\u003e 'article', // overrides the default\n                'namespace:article' =\u003e [\n                    'author' =\u003e $page-\u003eauthor(),\n                    'published_time' =\u003e $page-\u003edate('Y-m-d'),\n                    'modified_time' =\u003e $page-\u003emodified('Y-m-d'),\n                    'tag' =\u003e ['tech', 'web']\n                ],\n                'namespace:image' =\u003e function(Page $page) {\n                    $image = $page-\u003ecover()-\u003etoFile();\n    \n                    return [\n                        'image' =\u003e $image-\u003eurl(),\n                        'height' =\u003e $image-\u003eheight(),\n                        'width' =\u003e $image-\u003ewidth(),\n                        'type' =\u003e $image-\u003emime()\n                    ];\n                }\n            ]\n        ]\n    ];\n}\n```\n\n\u003cdetails\u003e\n    \u003csummary\u003e\u003cstrong\u003eShow HTML\u003c/strong\u003e 👁\u003c/summary\u003e\u003cp\u003e\n\n```html\n\u003c!-- merged default definition --\u003e\n\u003ctitle\u003ePedro Borges\u003c/title\u003e\n\u003cmeta name=\"description\" content=\"Passionate web developer\"\u003e\n\u003cmeta property=\"og:title\" content=\"How to make a Kirby plugin\"\u003e\n\u003cmeta property=\"og:site_name\" content=\"Pedro Borges\"\u003e\n\u003cmeta property=\"og:url\" content=\"https://pedroborg.es/blog/how-to-make-a-kirby-plugin\"\u003e\n\u003c!-- template definition --\u003e\n\u003cmeta property=\"og:type\" content=\"article\"\u003e\n\u003cmeta property=\"og:article:author\" content=\"Pedro Borges\"\u003e\n\u003cmeta property=\"og:article:published_time\" content=\"2017-02-28\"\u003e\n\u003cmeta property=\"og:article:modified_time\" content=\"2017-03-01\"\u003e\n\u003cmeta property=\"og:article:tag\" content=\"tech\"\u003e\n\u003cmeta property=\"og:article:tag\" content=\"web\"\u003e\n\u003cmeta property=\"og:image\" content=\"https://pedroborg.es/content/blog/how-to-make-a-kirby-plugin/code.jpg\"\u003e\n\u003cmeta property=\"og:image:width\" content=\"1200\"\u003e\n\u003cmeta property=\"og:image:height\" content=\"630\"\u003e\n\u003cmeta property=\"og:image:type\" content=\"image/jpeg\"\u003e\n```\n\n\u003c/p\u003e\u003c/details\u003e\n\nUse the `namespace:` prefix for structured properties:\n\n- `author` inside `namespace:article` becomes `og:article:author`.\n- `image` inside `namespace:image` becomes `og:image`.\n- `width` inside `namespace:image` becomes `og:image:width`.\n\n\u003e When using Open Graph tags, you will want to add the `prefix` attribute to the `html` element as suggested on [their docs](http://ogp.me/#metadata): `\u003chtml prefix=\"og: http://ogp.me/ns#\"\u003e`\n\n### `twitter`\nThis tag group works just like the previous one, but it generates `\u003cmeta\u003e` tags for [Twitter Cards](https://dev.twitter.com/cards/overview) instead.\n\n```php\n'twitter' =\u003e [\n    'card' =\u003e 'summary',\n    'site' =\u003e $site-\u003etwitter(),\n    'title' =\u003e $page-\u003etitle(),\n    'namespace:image' =\u003e function ($page) {\n        $image = $page-\u003ecover()-\u003etoFile();\n\n        return [\n            'image' =\u003e $image-\u003eurl(),\n            'alt' =\u003e $image-\u003ealt()\n        ];\n    }\n]\n```\n\n\u003cdetails\u003e\n    \u003csummary\u003e\u003cstrong\u003eShow HTML\u003c/strong\u003e 👁\u003c/summary\u003e\u003cp\u003e\n\n```html\n\u003cmeta name=\"twitter:card\" content=\"summary\"\u003e\n\u003cmeta name=\"twitter:site\" content=\"@pedroborg_es\"\u003e\n\u003cmeta name=\"twitter:title\" content=\"My blog post title\"\u003e\n\u003cmeta name=\"twitter:image\" content=\"https://pedroborg.es/content/blog/my-article/cover.jpg\"\u003e\n\u003cmeta name=\"twitter:image:alt\" content=\"Article cover image\"\u003e\n```\n\n\u003c/p\u003e\u003c/details\u003e\n\n### `json-ld`\nUse this tag group to add [JSON Linked Data](https://json-ld.org) schemas to your website.\n\n```php\n'json-ld' =\u003e [\n    'Organization' =\u003e [\n        'name' =\u003e $site-\u003etitle()-\u003evalue(),\n        'url' =\u003e $site-\u003eurl(),\n        \"contactPoint\" =\u003e [\n            '@type' =\u003e 'ContactPoint',\n            'telephone' =\u003e $site-\u003ephoneNumber()-\u003evalue(),\n            'contactType' =\u003e 'customer service'\n        ]\n    ]\n]\n```\n\n\u003e If you leave them out, `http://schema.org` will be added as `@context` and the array key will be added as `@type`.\n\n\u003cdetails\u003e\n    \u003csummary\u003e\u003cstrong\u003eShow HTML\u003c/strong\u003e 👁\u003c/summary\u003e\u003cp\u003e\n\n```html\n\u003cscript type=\"application/ld+json\"\u003e\n{\n    \"@context\": \"http://schema.org\",\n    \"@type\": \"Organization\",\n    \"name\": \"Example Co\",\n    \"url\": \"https://example.com\",\n    \"contactPoint\": {\n        \"@type\": \"ContactPoint\",\n        \"telephone\": \"+1-401-555-1212\",\n        \"contactType\": \"customer service\"\n    }\n}\n\u003c/script\u003e\n```\n\n\u003c/p\u003e\u003c/details\u003e\n\n## Change Log\nAll notable changes to this project will be documented at: \u003chttps://github.com/pedroborges/kirby-meta-tags/blob/master/CHANGELOG.md\u003e\n\n## License\nThe Meta Tags plugin is open-sourced software licensed under the [MIT license](http://www.opensource.org/licenses/mit-license.php).\n\nCopyright © 2019 Pedro Borges \u003coi@pedroborg.es\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedroborges%2Fkirby-meta-tags","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpedroborges%2Fkirby-meta-tags","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpedroborges%2Fkirby-meta-tags/lists"}