Jump to content
Wanze

SeoMaestro

Recommended Posts

A module helping you to manage SEO related tasks like a boss!

  • Automatically generates and maintains a XML sitemap from your pages.
  • Includes a Fieldtype and Inputfield to manage sitemap settings and meta data for pages (Title, Description, Canonical URL, Opengraph, Twitter, Structured Data etc.)
  • Multi language support for the sitemap and meta data.
  • Configure default values for meta data on template level and let pages inherit or overwrite them individually.
  • Map existing fields to meta data, reducing the need to duplicate content.
  • Live preview for content editors how the entered meta data appears on Google.
  • Live preview for content editors how the entered Opengraph data looks like when sharing a page with Facebook.

Check out the README on GitHub for more details, including usage instructions. The module is currently released as beta and needs testing! Please report any issues on GitHub or in this forum thread, if you find time to give it a try 🙂

Examples

Here is an example of rendered meta data you will get from a single SeoMaestro field:

<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">

And some screenshots of the UI:

seomaestro_inputfield.thumb.png.15a669b43c45918e06067bf87018ca85.png seomaestro_inputfield_config.thumb.png.03087bb6c358e8fa4e547b7a9b4211d8.png

  • Like 29
  • Thanks 6

Share this post


Link to post
Share on other sites

This module looks AWESOME, @Wanze !! Thank you, thank you, thank you!  I'll test it on a new project ASAP to give feedback.

  • Like 1

Share this post


Link to post
Share on other sites

Just noticed that the module does not work correctly on single language installations, as I always tested on multi language setups. Should be easy to fix though, I know what the problem is 😄 Cannot fix it today, so if you are testing, you might want to test with multiple languages. Sorry for this, I obviously should have tested this myself. Cheers!

  • Like 1

Share this post


Link to post
Share on other sites

So it is multilanguage-first.

Share this post


Link to post
Share on other sites

Very cool! I used this other markup-seo module since yet but I think I will try to switch soon, because I had to trick some stuff into the other module to get multilang.

One thing what would be cool, I guess: the whole SEO-Fields into an extra "SEO" tab on the page.

Share this post


Link to post
Share on other sites

Version 0.3.0 should fix problems on single language installations. 😅 I will update Travis CI to run the test suite on two installation profiles (single and multi language).

5 hours ago, tiefenbacher_bluetomato said:

One thing what would be cool, I guess: the whole SEO-Fields into an extra "SEO" tab on the page.

This is possible, just wrap the Seo Maestro field in an InputFieldsetOpen.

  • Like 3

Share this post


Link to post
Share on other sites

Great work Wanze!  

15 hours ago, tiefenbacher_bluetomato said:

One thing what would be cool, I guess: the whole SEO-Fields into an extra "SEO" tab on the page.

I think this functionality will be useful and a real time saver for most of the users. 

The easiest way to achieve this, is by allowing the user to select the templates that requires the SEO tab. Like in the Markup SEO plugin

a8FrN

 

Share this post


Link to post
Share on other sites
22 hours ago, B3ta said:

Great work Wanze!  

I think this functionality will be useful and a real time saver for most of the users. 

 The easiest way to achieve this, is by allowing the user to select the templates that requires the SEO tab. Like in the Markup SEO plugin

 

Thanks @B3ta

I think that the decision where the Seo Maestro field is rendered should be left to the user. And it should be done in the same way it works for all fields: By editing the template and placing the field. Display it in a new tab? Create an InputfieldFieldsetOpen and wrap the field. But maybe the content editor only needs to see meta title and description - then it's not worth to create a new tab.

I understand that it requires some manual work to add the field to all templates, but I don't think it is the responsibility of the module to do this. There are other solutions like the Migrations module, which can do this task in a few milliseconds. For the project I built this module, it took me 10 minutes to write a migration that creates and configures the field, adds it to all templates, tweaks the settings per template and also wraps it in a tab. No need to do this by hand if I deploy to production.

Cheers

  • Like 7

Share this post


Link to post
Share on other sites
9 minutes ago, Wanze said:

Thanks @B3ta

I think that the decision where the Seo Maestro field is rendered should be left to the user. And it should be done in the same way it works for all fields: By editing the template and placing the field. Display it in a new tab? Create an InputfieldFieldsetOpen and wrap the field. But maybe the content editor only needs to see meta title and description - then it's not worth to create a new tab.

I understand that it requires some manual work to add the field to all templates, but I don't think it is the responsibility of the module to do this. There are other solutions like the Migrations module, which can do this task in a few milliseconds. For the project I built this module, it took me 10 minutes to write a migration that creates and configures the field, adds it to all templates, tweaks the settings per template and also wraps it in a tab. No need to do this by hand if I deploy to production.

Cheers

I think this is okay - maybe to put some documentation note about that in the readme for user's who used MarkupSEO and will migrate zu SeoMaestro.

  • Like 1

Share this post


Link to post
Share on other sites

hi Guys

I try again with Processwire and now I finally want to improve my PHP knowledge.

I just joined the SEO-Maestro like this one.

  <?php
    $page->seo->render();
  ?>


Nu I get but this message.

Quote

Fatal error: Uncaught Error: Call to a member function render() on null in /var/www/vhosts/hosting115194/httpdocs/www.example.de/site/templates/_main.php:22 Stack trace: #0 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/core/TemplateFile.php(297): require() #1 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/core/Wire.php(380): ProcessWire\TemplateFile->___render() #2 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/core/WireHooks.php(723): ProcessWire\Wire->_callMethod('___render', Array) #3 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/core/Wire.php(442): ProcessWire\WireHooks->runHooks(Object(ProcessWire\TemplateFile), 'render', Array) #4 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/modules/PageRender.module(514): ProcessWire\Wire->__call('render', Array) #5 /var/www/vhosts/hosting115 in /var/www/vhosts/hosting115194/httpdocs/www.example.de/site/templates/_main.php on line 22

Schwerwiegender Fehler: Uncaught Error: Call to a member function render() on null in /var/www/vhosts/hosting115194/httpdocs/www.example.de/site/templates/_main.php:22
Stack trace:
#0 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/core/TemplateFile.php(297): require()
#1 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/core/Wire.php(380): ProcessWire\TemplateFile->___render()
#2 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/core/WireHooks.php(723): ProcessWire\Wire->_callMethod('___render', Array)
#3 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/core/Wire.php(442): ProcessWire\WireHooks->runHooks(Object(ProcessWire\TemplateFile), 'render', Array)
#4 /var/www/vhosts/hosting115194/httpdocs/www.example.de/wire/modules/PageRender.module(514): ProcessWire\Wire->__call('render', Array)
#5 /var/www/vhosts/hosting115 (Zeile 22 in /var/www/vhosts/hosting115194/httpdocs/www.example.de/site/templates/_main.php)

Diese Fehlermeldung wurde angezeigt wegen: Site ist im Debug-Modus. ($config->debug = true; => /site/config.php). Fehler wurde protokolliert

 

Share this post


Link to post
Share on other sites

@csaeum Are you sure that the name of your Seo Maestro field is "seo"? Did you create the field? Looks like the $page is not aware of it.

Cheers

  • Like 1

Share this post


Link to post
Share on other sites

Thank you for your answer.

I did not think so far. In order to get used to it, I did not call it seo but seo_Maestro

thank you for your quick help

Share this post


Link to post
Share on other sites
On 2/8/2019 at 4:32 PM, Wanze said:

I understand that it requires some manual work to add the field to all templates

With the the relatively new ProField FieldtypeFieldsetGroup it should be a quick job to add this to all templates.

  • Like 5

Share this post


Link to post
Share on other sites

Version 0.5.0 fixes two issues, please update:

  • Fix wrong url in the <link rel="alternate" hreflang="x-default"> meta tag.
  • Fix date formatting for the lastmod property in the XML sitemap.

Cheers

  • Like 4
  • Thanks 1

Share this post


Link to post
Share on other sites

Hi @Wanze, congrats on your nice module! I'm currently testing it out for a client and find it overall very nice, thank you for your work!

I have some feedback, even though I'm not sure if I'm understanding everything you do correctly. So please excuse me if I'm mistaken 😅 

  1. Having to set the default values for the meta tags on the field/template level, instead of using the PageTree (the Page level) seems unpractical.

    Most of the time I give a site editor access to the PageTree, sometimes to some modules, but I definitely keep them away from 'dangerous' stuff like Fields and Templates. However, editors should always be able to edit the SEO information without bugging the developer for an update. 
    In other words, the preferred place for the default SEO information should imho be at the root of the tree: the homepage. (Or perhaps inside the a module config).
     
  2. To me it would make total sense that SEO information follows the same inheritance structure as pages do. Often rendered titles will consist of a page title and some ancestor title.  So you should be able to select the parent's title and expand on it, much like the 'List of fields to display in the admin Page List')

    -home (title: "My Site")
    |-projects (title: "Projects")
    ||-project1 (title: "Project number 1")
    ||-project2 (title: "Another project")

    It would make sense to be able to get the following:

    -home (seo.meta.title: {title} would result in "My Site")
    |-projects (seo.meta.title: {title} - {parent.title} would result in "Projects - My Site")
    ||-project1 (seo.meta.title: {title} - {parent.parent.title} would result in "Project number 1 - My Site")
    ||-project2 (seo.meta.title: {title} | {parent.title} | {parent.parent.title} would result in "Another project | Projects | My Site")

     

 

 

  • Like 2

Share this post


Link to post
Share on other sites

Hi @eelkenet

Thanks for your feedback, glad you are liking the module!

13 hours ago, eelkenet said:

Most of the time I give a site editor access to the PageTree, sometimes to some modules, but I definitely keep them away from 'dangerous' stuff like Fields and Templates. However, editors should always be able to edit the SEO information without bugging the developer for an update. 
In other words, the preferred place for the default SEO information should imho be at the root of the tree: the homepage. (Or perhaps inside the a module config).

I see your point. Content editors are currently limited to edit meta data on page level. However, I doubt that the home page would be the desired place to to so: Setting default values on field level allows to leverage different data per template. You can edit the field in the context of any template and change the default meta data, you can even change what groups/fields are displayed to the editor per template. If we place this on the home page, we are mixing configuration and content + we would need to build another UI around that. I think the correct place to edit the default values would be a dedicated page in the admin (e.g. under "Setup"), with a new permission (e.g. "seomaestro-edit-config") that you could give to your content editors.

13 hours ago, eelkenet said:

To me it would make total sense that SEO information follows the same inheritance structure as pages do.

I am not 100% sure what you mean by "follow the same inheritance structure as pages do". Does this mean that any page should inherit meta data of the parent page, unless overridden? I do not think that this works well for meta data, because the goal is to have unique meta data (no duplicate titles or descriptions). This data must be defined on the current page, or mapped from a field of the current page.

Quote

Often rendered titles will consist of a page title and some ancestor title.  So you should be able to select the parent's title and expand on it, much like the 'List of fields to display in the admin Page List')

This should work already 🙂 Just enter {title} | {parent.title} and save the page.

Cheers

  • Like 1

Share this post


Link to post
Share on other sites
2 hours ago, Wanze said:

I think the correct place to edit the default values would be a dedicated page in the admin (e.g. under "Setup"), with a new permission (e.g. "seomaestro-edit-config") that you could give to your content editors.

👍 this would be really nice. I also used to put stuff in the homepage, but this can get cluttered really easy.

  • Like 2

Share this post


Link to post
Share on other sites

Hi @Wanze, congrats for your great module! 

Only one issue: if you try to set as meta tag input a repeater field, all the title of items in repeater are listed without space and commas between each of them.

Also my items title are uppercase and it would be nice if they would but lowercase.

Thank you very much!!!!

Andrea

Share this post


Link to post
Share on other sites

Hey @Wanze

What a great module! Thank you very much - I love the flexibility. 

One update I would like is the ability to use the meta image field as an actual image field, it would be much more understandable for clients rather than trying to find the image URL. 

  • Like 1

Share this post


Link to post
Share on other sites
On 2/25/2019 at 6:19 PM, a.masca said:

Hi @Wanze, congrats for your great module! 

Only one issue: if you try to set as meta tag input a repeater field, all the title of items in repeater are listed without space and commas between each of them.

Also my items title are uppercase and it would be nice if they would but lowercase.

 Thank you very much!!!!

Andrea

Hi Andrea,

Thanks! Out of curiosity, what is the reason to put the SeoMaestro field inside a repeater? Just can't think of any use case 🙂 I'll look into it.

Cheers

Share this post


Link to post
Share on other sites
On 2/26/2019 at 6:07 PM, Tom. said:

Hey @Wanze

What a great module! Thank you very much - I love the flexibility. 

One update I would like is the ability to use the meta image field as an actual image field, it would be much more understandable for clients rather than trying to find the image URL. 

Hey @Tom.

Thanks for the nice words and your feedback. I agree, it would be neat to have an image field for clients. Could you open a feature request on GitHub? I would like to discuss the implementation with you, or anyone interested in this. I guess there are may ways to achieve this, and I'm not sure which one's the best 🙂

  • Like 2

Share this post


Link to post
Share on other sites
32 minutes ago, Wanze said:

Hi Andrea,

Thanks! Out of curiosity, what is the reason to put the SeoMaestro field inside a repeater? Just can't think of any use case 🙂 I'll look into it.

Cheers

Hi @Wanze

I have a product template with a repeater that I use for tags of the product.

I think that it would be great use the tags of the product for populate the meta tag of the page 🙂

buy

Andrea

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...