Opened 8 years ago

Closed 4 years ago

#27395 closed New feature (fixed)

Allow generating '<link rel="alternate ... hreflang=...>" for sitemaps'

Reported by: Hovi Owned by: Florian Demmer
Component: contrib.sitemaps Version: 1.10
Severity: Normal Keywords:
Cc: Hendy Irawan Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Hovi)

Hello,

django sitemap supports i18n field, that enables generating language-aware sitemaps, here is doc:
https://docs.djangoproject.com/en/1.10/ref/contrib/sitemaps/#django.contrib.sitemaps.Sitemap.i18n

Problem is, that it generates them just as each url separately with no relations. One of google recommendations is to mark same content in different languages using sitemap with xhtml:link element:
https://support.google.com/webmasters/answer/189077
https://support.google.com/webmasters/answer/2620865

Would be cool to add possibility to generate these tags.

Attachments (1)

sitemap_hreflang.diff (2.3 KB ) - added by Hovi 8 years ago.
Path

Download all attachments as: .zip

Change History (22)

comment:1 by Tim Graham, 8 years ago

Is the idea to add something like a template tag that generates something like:

<link rel="alternate"
   hreflang="fr"
   href="https://docs.djangoproject.com/fr/1.10/ref/">
....
<link rel="alternate"
   hreflang="el"
   href="https://docs.djangoproject.com/el/1.10/ref/">
<link rel="alternate"
   hreflang="x-default"
   href="https://docs.djangoproject.com/en/1.10/ref/">
<link rel="alternate"
   hreflang="en"
   href="https://docs
.djangoproject.com/en/1.10/ref/">

for use on a webpage? (If so, I'm not familiar enough with sitemaps code to say whether or not it's feasible.) Or does this involve some change to the sitemap itself?

comment:2 by Hovi, 8 years ago

Both ways actually make sense (in html page and sitemap) and code generating it in both cases would be very similar, but to answer your original question - this involves changes to sitemap itself yes.

comment:3 by Tim Graham, 8 years ago

Summary: Django sitemap and i18nAllow generating '<link rel="alternate ... hreflang=...>" for sitemaps'
Triage Stage: UnreviewedAccepted

What are those changes? Are you able to offer a patch?

comment:4 by Hovi, 8 years ago

I included simple patch to demonstrate what would require changing, by no means it's supposed to be final. There may be a little more work to avoid duplicities, but it does pretty much everything necessary.

comment:5 by Hovi, 8 years ago

Description: modified (diff)

by Hovi, 8 years ago

Attachment: sitemap_hreflang.diff added

Path

comment:6 by Nick Mavrakis, 8 years ago

Based on Hovi's suggestion I have created a branch (https://github.com/manikos/django/commit/5af8551eb025e561c9674032706ff0078eabe2b3) about this.

How may I proceed on this?

I would really like to see this as a built-in in Django.
Until now, I have created a custom template tag in my project which produces Google's <link rel="alternate" hreflang="..." ...> elements. I have submitted my sitemap to Google and it has successfully verified.

comment:7 by Tim Graham, 8 years ago

If you could find another sitemaps user to validate that the design makes sense, the next step would be to add tests and documentation, then send a pull request.

comment:8 by Hendy Irawan, 7 years ago

+1 for this :) I also need such functionality

comment:9 by Hendy Irawan, 7 years ago

Cc: Hendy Irawan added

comment:10 by Hendy Irawan, 7 years ago

Temporary workaround: https://github.com/barseghyanartur/django-qartez (didn't work in Django 1.11 and Python 3)
My fork has been tested working in Django 1.11 and Python 3.6: https://github.com/ceefour/django-qartez/tree/patch-1

It uses this usage pattern:

class ArticleSitemap(RelAlternateHreflangSitemap):
    # If you want to serve the links on HTTPS.
    protocol = 'https'

    def alternate_hreflangs(self, obj):
       return [('en-us', obj.alternative_object_url),]

    def items(self):
       return FooItem._default_manager.all()
Last edited 7 years ago by Hendy Irawan (previous) (diff)

comment:11 by Pierre Sassoulas, 7 years ago

Hello,

There is django-hreflang that seem to do it properly. I just adapted it for django 2.0. Maybe we could integrate some or all of its functionality directly into django ?

There is a lot of way to use it, see https://bitbucket.org/mverleg/django_hreflang/src/master/

But I think if its intregrated in django is should be used like this :

Add django.(...).AddHreflangToResponse to MIDDLEWARE_CLASSES

Then in template :

{% load hreflang %}
<head>
    {% hreflang_tags %}
</head>

Hope this help.

comment:12 by Hendy Irawan, 7 years ago

Now there are at least 3 methods to solve this problem.

I hope contrib.sitemaps is improved soon. @Tim Graham, there are now 3 sitemaps users here that need this functionality.
So the need is valid.

comment:13 by Florian Demmer, 5 years ago

Owner: changed from nobody to Florian Demmer
Status: newassigned

comment:14 by Florian Demmer, 5 years ago

Has patch: set

comment:15 by Simon Charette, 5 years ago

Needs tests: set
Patch needs improvement: set

comment:16 by Florian Demmer, 5 years ago

Needs tests: unset
Patch needs improvement: unset

comment:17 by Carlton Gibson, 5 years ago

Patch needs improvement: set

From discussion on the PR: a few new attributes are suggested that control the alternates rendering. One more is needed, probably alternates, defaulting to False than would enable the opting-in to the new features. (Existing sitemaps would be unchanged until folks turned on the flags.)

Other than that, PR looks pretty good.

comment:18 by Florian Demmer, 4 years ago

Patch needs improvement: unset

Pushed more recommended changes after review by David Smith; please consider merge again :)

comment:19 by Carlton Gibson, 4 years ago

Triage Stage: AcceptedReady for checkin

comment:20 by Carlton Gibson <carlton@…>, 4 years ago

In 50e1ccbb:

Refs #27395 -- Added XML namespace declaration to sitemap template.

As per Google recommendations:
https://support.google.com/webmasters/answer/189077?hl=en

comment:21 by Carlton Gibson <carlton@…>, 4 years ago

Resolution: fixed
Status: assignedclosed

In 16218c20:

Fixed #27395 -- Added sitemap 'alternates' generation.

Updated the sitemap generator and default template to optionally
include link elements with hreflang attribute to alternate language
URLs.

Note: See TracTickets for help on using tickets.
Back to Top