OpenGraph, Twitter Card and Schema.org snippet tags for Wagtail CMS pages.
The current version is tested for compatiblily with the following:
Wagtail versions 6.3 to 7.4
Django versions 5.2, 6.0 and 6.1
Python versions 3.10 to 3.14
Authored by Basil Shubin, and some great contributors.
Installation
First install the module, preferably in a virtual environment. It can be installed from PyPI:
pip install wagtail-metadata-mixin
Requirements
You must have django-meta installed and configured, see the django-meta documentation for details and setup instructions.
Setup
First make sure the project is configured for django-meta.
Then add the following settings:
INSTALLED_APPS += (
'wagtailmetadata',
)
and just include meta/meta.html template in your templates
{% load meta %}
<html {% meta_namespaces_schemaorg %}>
<head {% meta_namespaces %}>
{% include "meta/meta.html" %}
</head>
<body>...</body>
</html>
Check django-meta documentation for more details.
Usage
# models.py
from wagtail.models import Page, PageBase
from wagtailmetadata.models import MetadataPageMixin
# ensure MetadataPageMixin class goes before Page class
class CustomPage(MetadataPageMixin, Page):
schemaorg_type = "Page"
promote_panels = Page.promote_panels + MetadataPageMixin.panels
MetadataPageMixin already provides sensible defaults for every field (title uses seo_title or title, description uses search_description, image uses search_image, and so on). There are two ways to customise them on your own page.
Overriding the get_meta_* methods
The most common approach – override the relevant method(s), the same way MetadataPageMixin itself overrides MetadataMixin:
class ArticlePage(MetadataPageMixin, Page):
body = RichTextField(blank=True)
def get_meta_description(self):
return self.search_description or Truncator(strip_tags(self.body)).words(30)
def get_meta_twitter_type(self):
return "summary_large_image"
Overriding _metadata
If you just want to point an existing field at a different attribute or method, without writing a whole new get_meta_* method, extend _metadata instead:
class ArticlePage(MetadataPageMixin, Page):
_metadata = {
**MetadataPageMixin._metadata,
# use the actual publish date, instead of the latest (possibly
# unpublished) revision's timestamp
"modified_time": "last_published_at",
}
Both approaches can be freely combined, and work the same way for _schema and for adding custom tags/properties.
Schema.org support
wagtail-metadata-mixin provides full support for schema.org in JSON-LD format, out of the box, through the _schema attribute.
In the same way as the basic _metadata attribute, _schema resolves and builds the per-page Schema.org representation. As per _metadata, its values can be the name of a method, property or attribute available on the class. MetadataPageMixin already ships with a sensible default:
_schema = {
"name": "get_meta_title",
"headline": "get_meta_title",
"description": "get_meta_description",
"image": "get_meta_image",
"url": "get_meta_url",
"author": "get_author_name",
"datePublished": "published_time",
"dateModified": "latest_revision_created_at",
}
You can create your own schema, extending or overriding the default one, without having to touch MetadataPageMixin itself:
class ArticlePage(MetadataPageMixin, Page):
schemaorg_type = "Article"
_schema = {
**MetadataPageMixin._schema,
"articleSection": "get_categories",
"keywords": "get_keywords",
}
def get_categories(self):
return list(self.categories.values_list("name", flat=True))
def get_keywords(self):
return self.get_meta_keywords()
Check django-meta’s schema.org documentation for more details.
Customising the search image rendition
By default, the search image rendition is set to fill-800x450.
If you wish to use a different rendition, you can set the WAGTAILMETADATA_SEARCH_IMAGE_RENDITION setting to change the filter used. e.g.
WAGTAILMETADATA_SEARCH_IMAGE_RENDITION = "fill-1200x630"
Contributing
If you like this module, forked it, or would like to improve it, please let us know! Pull requests are welcome too. :-)
License
wagtail-metadata-mixin is released under the MIT license.
Changes
3.0.1 (2026-08-15)
Added og/twitter/schemaorg title and description fields, JSON-LD toggle, and OG type/app_id/profile_id/publisher/author_url fields, matching django-meta’s current API.
Added full support for schema.org in JSON-LD format via the _schema attribute.
Fixed get_meta_image_width()/get_meta_image_height() to build off a rendition, consistent with get_meta_image().
Fixed get_meta_site_name(), get_domain() and build_absolute_uri() to no longer crash silently when used on a non-Page model.
3.0.0 (2026-08-15)
Bumped requirements: Wagtail 6.3+, Django 5.2/6.0/6.1, Python 3.10+, django-meta 2.5+.
2.0.2 (2021-11-29)
Fixed stupid typo.
2.0.1 (2021-11-29)
Added ru translation.
2.0.0 (2021-11-28)
Added Wagtail 2.15 and Django 3.2 support.
Dropped Wagtail 2.7 support.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wagtail_metadata_mixin-3.0.1.tar.gz.
File metadata
- Download URL: wagtail_metadata_mixin-3.0.1.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8603c33ad8a30518819270c3328a728961ebb1dec4142cf0b8d4eb81dbe79af0
|
|
| MD5 |
44e8eecc16676e460db64f1e3a1fec14
|
|
| BLAKE2b-256 |
2d7e7b0034177a04d5168899661c35259555bde6fd16159e9667a684c6059fb0
|
Provenance
The following attestation bundles were made for wagtail_metadata_mixin-3.0.1.tar.gz:
Publisher:
release.yml on bashu/wagtail-metadata-mixin
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wagtail_metadata_mixin-3.0.1.tar.gz -
Subject digest:
8603c33ad8a30518819270c3328a728961ebb1dec4142cf0b8d4eb81dbe79af0 - Sigstore transparency entry: 2475382281
- Sigstore integration time:
-
Permalink:
bashu/wagtail-metadata-mixin@fe15063c1786361ba68fb9a04d3d7d48ca67758e -
Branch / Tag:
refs/tags/3.0.1 - Owner: https://github.com/bashu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fe15063c1786361ba68fb9a04d3d7d48ca67758e -
Trigger Event:
push
-
Statement type:
File details
Details for the file wagtail_metadata_mixin-3.0.1-py3-none-any.whl.
File metadata
- Download URL: wagtail_metadata_mixin-3.0.1-py3-none-any.whl
- Upload date:
- Size: 14.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0bb3ce2f74282d49812c6e031f5d49da12d832ec43ccd465bd9cf90eb59851f2
|
|
| MD5 |
da65d9dca64d37b2c8d7e55eab918ad1
|
|
| BLAKE2b-256 |
bcd7f22418436303f43b9e720b138bb34fdbfbea94690de569084a2c40dff3a7
|
Provenance
The following attestation bundles were made for wagtail_metadata_mixin-3.0.1-py3-none-any.whl:
Publisher:
release.yml on bashu/wagtail-metadata-mixin
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wagtail_metadata_mixin-3.0.1-py3-none-any.whl -
Subject digest:
0bb3ce2f74282d49812c6e031f5d49da12d832ec43ccd465bd9cf90eb59851f2 - Sigstore transparency entry: 2475382310
- Sigstore integration time:
-
Permalink:
bashu/wagtail-metadata-mixin@fe15063c1786361ba68fb9a04d3d7d48ca67758e -
Branch / Tag:
refs/tags/3.0.1 - Owner: https://github.com/bashu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@fe15063c1786361ba68fb9a04d3d7d48ca67758e -
Trigger Event:
push
-
Statement type: