Jump to content
Nico Knoll

MarkupSEO - The all-in-one SEO solution for ProcessWire.

Recommended Posts

I fixed this bug and changed how customs are rendered. So now they will overwrite existing meta tags if they have the same key.

That means: I won't add a special "robots" field to pages, but if you define "robots := index,follow" in the custom area, that will overwrite config settings. Guess that should do the job, too.

Share this post


Link to post
Share on other sites

And some more minor changes: I switched to PHP_EOL instead of \n and \n\r, which should solve the double line break issue. And I added a option, to add a whitespace at the beginning if automatically inserted. (will publish it in 10min)

  • Like 1

Share this post


Link to post
Share on other sites
That means: I won't add a special "robots" field to pages, but if you define "robots := index,follow" in the custom area, that will overwrite config settings. Guess that should do the job, too.

Good idea!

And some more minor changes: I switched to PHP_EOL instead of \n and \n\r, which should solve the double line break issue. And I added a option, to add a whitespace at the beginning if automatically inserted. (will publish it in 10min) 

Even more good ideas :-)

  • Like 1

Share this post


Link to post
Share on other sites

Even more questions ;-)

After a short look into the source i found :

  • seo_tab
  • seo_tab_END
  • seo_title
  • seo_keywords
  • seo_description
  • seo_custom
  • seo_image
  • seo_canonical

As accessible fields in the Template when using manual mode ?

How do i access  things like the generated Open Graph or Twitter Cards or maybe the Robots setting? Are they added to Custom ?

Share this post


Link to post
Share on other sites

Everything rendered should be available through $page->seo->...

(More complicated keys like "og:site_name" are available through $page->seo->{"og:site_name"})

  • Thanks 1

Share this post


Link to post
Share on other sites

@ Nico

I believe the Google Preview shows the wrong path. Underneath the title the path of the admin page shows in stead of front end url.

Share this post


Link to post
Share on other sites

@Nico: Thx! 

Can you also take look at this part:

When you fill in the Twitter Username, it prints in the metatags correctly. But when you visit another page and go back to the modules settings page, the field of Twitter Username is empty!  

Share this post


Link to post
Share on other sites

Getting this nice little error (see screenshot)

The image_main of this template actually is just a single image so i guess $main_image does not return the array or object your functions expects. Plus the "Formated value" of this field is set to  "single item(null if empty)" in field settings.  

But i am not sure if this is the reason ?

Edit: I used the image_main field as fallback for seo_url in module settings , even if this is not wanted for as one is a plaintext(url) field and the other is an image field , i think a fatal error should not happen.

post-2434-0-86433000-1419267352_thumb.pn

Share this post


Link to post
Share on other sites

Hi Nico, I tried your module today, installed version 030 first from a previous download, then upgraded to the current version 060. 

After that I tried to uninstall the module to try that out and got an error:

Catchable fatal error: Argument 1 passed to Fields::___delete() must implement interface Saveable, null given in /mypath/wire/core/Fields.php on line 265

Share this post


Link to post
Share on other sites

Hey - the problem is that there are no fields to delete if only updated and not installed. 0.3.0 is not compatible to 0.6.0 and I think the best thing todo is to delete 0.3.0 first and then install 0.6.0. (Still beta until 1.0.0).

In your case you just have to comment the uninstall method out or delete it completely from the module's file.

@everyone with the other bug: I manged to get it working today. Need to do some more test and will upload it tomorrow.

Share this post


Link to post
Share on other sites

I deleted the module directly from the database and installed it again.

Yes: install/uninstall is fine when doing a fresh, clean install. The update was the problem.

Share this post


Link to post
Share on other sites

Hi Nico,

Just found out about this module! I'm going to give a spin tomorrow :)

I guess I was away a little bit too long from the forum....

  • Like 1

Share this post


Link to post
Share on other sites

Nico, I'm using your module in many sites, it's great...but just one think, what about pagination? I would like to add something like {pageNum} or similar into title format like

{title} - {sitename} - {pageNum}

Other idea: what about having a title format based on template? I have a photo website and and I would like to create custom title for each photo, I cannot edit each photo one by one, right now I detect the template in my head.inc and for those pages I add a custom title but could be nice having something inside your module
example:
I have "picture" template and I would like the title as:

{phototitle} - This is a Photo by {author} for category {category.title}

where 
phototitle & author & (category is a pagefield so I can access other data like title)
are fields of picture template

Share this post


Link to post
Share on other sites

PageNum makes sense to me but how do I find out the actual page number? Only by getting "page" from the url?

For your picture profile I would recommend to disable "auto title" and  just to do it like this in your picture template:

<?php

$custom_title = $page->title.' - This is a Photo by '.$page->user->title.' for category '.$page->category->title;

include 'head.inc';

.
.
.

And in your head something like:

<title><?php ((isset($custom_title)) ? $custom_title : (($page->seo->title != '') ? $page->seo->title : $page->title. ' - '.'My cool Webseite')); ?></title>
  • Like 1

Share this post


Link to post
Share on other sites

Nico, when I set a title in the SEO tab, the preview doesn't update according to the default title setting... So, the preview won't match up.

Also, is it no longer possible to set different titles? The site title format is now applying to both the page title and the SEO title. Is this by design?

Share this post


Link to post
Share on other sites

Well, there aren't "default title settings". If you leave the seo title field empty it uses the "{titile} - {sitename}" thing. If you put a title into the seo field it shouldn't use "{titile} - {sitename}". I'll take a look at the code. Could you add this as an issue on github? 

Share this post


Link to post
Share on other sites

In the previous version (0.3), the title tag and the og:title tag would differ as, before, the title tag was not automatically inserted.

Now, the title field (and not the seo title field) becomes useless when it comes to the title tag, as the seo title field will be used for it if filled out.

With the previous version, it did what I expected it to do: insert og:title for me, so that the Google result title would be different. Of course, I entered in my title tag manually, which worked.

So, I think that there should be an option to not include the title tag, if someone wants to insert it manually.

I'll open an issue regarding making the option available.

Share this post


Link to post
Share on other sites

Hi Nico,

it's about time for me trying your module. Fist of all: Thank you for sharing!

I have a question about the title (or maybe a wish):

The title can be pre-filled automatically. I like that. But it is limiting for me.

Right now I have a separate field for the window title, called title_window.

The reason:

This gives me the freedom to name the page differently in the admin (for the page list and selections) and the real title output.

The title is filled in by the editor and the title_window is left to set by the seo guy.

In case the title_window (SEO) is not set, there is a fallback to the title, when I output the site.

(I think that is the way Wordpress handles that too, in combination with the SEO module, if I recall this correctly.)

(EDIT: Why an extra field and not the module: I do not like the tab clicking to the SEO area in the normal workflow of an editor.

I want the editor to have the title and the SEO title close together. - But this is a matter of taste)

Is there a way to mimic that in the module?

Select a custom field with a fallback to title?

(Of course there are workarounds for me - maybe this idea finds friends in the community But maybe this makes things too complicated. :-) )

And some small thoughts:

canonical

I would like a comment to the canonical tag field what default you set in case the field is empty.

(it is probably the page url without segments and variables?)

segments and variable

A question is how to handle segments and variables (page numbers) best?

I use segments and page numbers for filtering content.

To avoid double content I set my templates manually at the moment to set a noindex tag in case a segment or page number is found.

I wonder if this is good practice/needed when there is a canonical tag.

link rel="alternate" hreflang

On my multi-language sites I have something like this:

<link rel="alternate" hreflang="en" href="http://mysite.com/en/press/" />
<link rel="alternate" hreflang="es" href="http://mysite.com/es/prensa/" />
<link rel="alternate" hreflang="en-us" href="http://mysite.com/us/press/" />

This links same content in different languages together for Google.

Depending on how languages are set up on the site, the module could easily write such code automatically.

(Right now I have some hand coded stuff which does exactly that...)

EDITED

  • 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.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By teppo
      MarkupMenu is a markup module for generating menu trees. When provided a root page as a starting point, it generates a navigation tree (by default as a HTML "<ul>" element wrapped by a "<nav>" element) from that point onwards. If you've also provided it with current (active) page, the menu will be rendered accordingly, with current item highlighted and items rendered up to that item and its children (unless you disable the "collapsed" option, in which case the full page tree will be rendered instead).
      Modules directory: https://modules.processwire.com/modules/markup-menu/ GitHub repository: https://github.com/teppokoivula/MarkupMenu Usage
      As a markup module, MarkupMenu is intended for front-end use, but you can of course use it in a module as well. Typically you'll only need the render() method, which takes an array of options as its only argument:
      echo $modules->get('MarkupMenu')->render([ 'root_page' => $pages->get(1), 'current_page' => $page, ]); Note: if you omit root_page, site root page is used by default. If you omit current_page, the menu will be rendered, but current (active) page won't be highlighted etc.
      A slightly more complex example, based on what I'm using on one of my own sites to render a (single-level) top menu:
      echo $modules->get('MarkupMenu')->render([ 'current_page' => $page, 'templates' => [ 'nav' => '<nav class="{classes} menu--{menu_class_modifier}" aria-label="{aria_label}">%s</nav>', 'item_current' => '<a class="menu__item menu__item--current" href="{item.url}" tabindex="0" aria-label="Current page: {item.title}">{item.title}</a>', ], 'placeholders' => [ 'menu_class_modifier' => 'top', 'aria_label' => 'Main navigation', ], 'include' => [ 'root_page' => true, ], 'exclude' => [ 'level_greater_than' => 1, ], ]); Note: some things you see above may not be entirely sensible, such as the use of {menu_class_modifier} and {aria_label} placeholders. On the actual site the "nav" template is defined in site config, so I can define just these parts on a case-by-case basis while actual nav markup is maintained in one place.
      Please check out the README file for available render options. I'd very much prefer not to keep this list up to date in multiple places. Basically there are settings for defining "templates" for different parts of the menu (list, item, etc.), include array for defining rules for including in the menu and exclude array for the opposite effect, classes and placeholders arrays for overriding default classes and injecting custom placeholders, etc. 🙂
      MarkupMenu vs. MarkupSimpleNavigation
      TL;DR: this is another take on the same concept. There are many similarities, but also some differences – especially when it comes to the supported options and syntax. If you're currently using MarkupSimpleNavigation then there's probably no reason to switch over.
      I'd be surprised if anyone didn't draw lines between this module and Soma's awesome MarkupSimpleNavigation. Simply put, I've been using MSN (...) for a number of years, and it's been great – but there have been some smallish issues with it, particularly with the markup generation part, and it's also doing some things in a way that just doesn't work for me – the xtemplates thing being one of these. In many ways it's less about features, and more about style.
      In MarkupMenu I've tried to correct these little hiccups, modernise the default markup, and allow for more flexibility with placeholder variables and additional / different options. MarkupMenu was built for ProcessWire 3.0.112+ and PHP 7.1+, it's installable with Composer, and I have a few additional ideas (such as conditional placeholders) on my todo list.
      One smallish and rather specific difference is that MarkupMenu supports overriding default options via $config->MarkupMenu. I find myself redefining the default markup for every site, which until now meant that each site has a wrapper function for MarkupSimpleNavigation (to avoid code / config repetition), and this way I've been able to omit that 🙂
      Requirements
      ProcessWire >= 3.0.112 PHP >= 7.1.0 If you're working on an earlier version of ProcessWire or PHP, use MarkupSimpleNavigation instead.
    • By Robin S
      Repeater Images
      Adds options to modify Repeater fields to make them convenient for "page-per-image" usage. Using a page-per-image approach allows for additional fields to be associated with each image, to record things such as photographer, date, license, links, etc.
      When Repeater Images is enabled for a Repeater field the module changes the appearance of the Repeater inputfield to be similar (but not identical) to an Images field. The collapsed view shows a thumbnail for each Repeater item, and items can be expanded for field editing.
      Screencast

      Installation
      Install the Repeater Images module.
      Setup
      Create an image field to use in the Repeater field. Recommended settings for the image field are "Maximum files allowed" set to 1 and "Formatted value" set to "Single item (null if empty)". Create a Repeater field. Add the image field to the Repeater. If you want additional fields in the Repeater create and add these also. Repeater Images configuration
      Tick the "Activate Repeater Images for this Repeater field" checkbox. In the "Image field within Repeater" dropdown select the single image field. You must save the Repeater field settings to see any newly added Image fields in the dropdown. Adjust the image thumbnail height if you want (unlike the core Images field there is no slider to change thumbnail height within Page Edit). Note: the depth option for Repeater fields is not compatible with the Repeater Images module.
      Image uploads feature
      There is a checkbox to activate image uploads. This feature allows users to quickly and easily add images to the Repeater Images field by uploading them to an adjacent "upload" field.
      To use this feature you must add the image field selected in the Repeater Images config to the template of the page containing the Repeater Images field - immediately above or below the Repeater Images field would be a good position.
      It's recommended to set the label for this field in template context to "Upload images" or similar, and set the visibility of the field to "Closed" so that it takes up less room when it's not being used. Note that when you drag images to a closed Images field it will automatically open. You don't need to worry about the "Maximum files allowed" setting because the Repeater Images module overrides this for the upload field.
      New Repeater items will be created from the images uploaded to the upload field when the page is saved. The user can add descriptions and tags to the images while they are still in the upload field and these will be retained in the Repeater items. Images are automatically deleted from the upload field when the page is saved.
      Tips
      The "Use accordion mode?" option in the Repeater field settings is useful for keeping the inputfield compact, with only one image item open for editing at a time. The "Repeater item labels" setting determines what is shown in the thumbnail overlay on hover. Example for an image field named "image": {image.basename} ({image.width}x{image.height})  
      https://github.com/Toutouwai/RepeaterImages
      https://modules.processwire.com/modules/repeater-images/
    • By EyeDentify
      Hello There Guys.

      I am in the process of getting into making my first modules for PW and i had a question for you PHP and PW gurus in here.

      I was wondering how i could use an external library, lets say TwitterOAuth in my PW module.
      Link to library
      https://twitteroauth.com/

      Would the code below be correct or how would i go about this:
      <?PHP namespace ProcessWire; /* load the TwitterOAuth library from my Module folder */ require "twitteroauth/autoload.php"; use Abraham\TwitterOAuth\TwitterOAuth; class EyeTwitter extends WireData,TwitterOAuth implements Module { /* vars */ protected $twConnection; /* extend parent TwitterOAuth contructor $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token, $access_token_secret); */ public function myTwitterConnection ($consumer_key, $consumer_secret, $access_token, $access_token_secret) { /* save the connection for use later */ $this->twConnection = TwitterOAuth::__construct($consumer_key, $consumer_secret, $access_token, $access_token_secret); } } ?> Am i on the right trail here or i am barking up the wrong tree?
      I don´t need a complete solution, i just wonder if i am including the external library the right way.
      If not, then give me a few hint´s and i will figure it out.

      Thanks a bunch.

      /EyeDentify
    • By dimitrios
      Hello,
      this module can publish content of a Processwire page on a Facebook page, triggered by saving the Processwire page.
      To set it up, configure the module with a Facebook app ID, secret and a Page ID. Following is additional configuration on Facebook for developers:
      Minimum Required Facebook App configuration:
      on Settings -> Basics, provide the App Domains, provide the Site URL, on Settings -> Advanced, set the API version (has been tested up to v3.3), add Product: Facebook Login, on Facebook Login -> Settings, set Client OAuth Login: Yes, set Web OAuth Login: Yes, set Enforce HTTPS: Yes, add "http://www.example.com/processwire/page/" to field Valid OAuth Redirect URIs. This module is configurable as follows:
      Templates: posts can take place only for pages with the defined templates. On/Off switch: specify a checkbox field that will not allow the post if checked. Specify a message and/or an image for the post.
      Usage
      edit the desired PW page and save; it will post right after the initial Facebook log in and permission granting. After that, an access token is kept.
       
      Download
      PW module directory: http://modules.processwire.com/modules/auto-fb-post/ Github: https://github.com/kastrind/AutoFbPost   Note: Facebook SDK for PHP is utilized.


    • By kongondo
      FieldtypeRuntimeMarkup and InputfieldRuntimeMarkup
       
      Modules Directory: http://modules.processwire.com/modules/fieldtype-runtime-markup/
      GitHub: https://github.com/kongondo/FieldtypeRuntimeMarkup
      As of 11 May 2019 ProcessWire versions earlier than 3.x are not supported
      This module allows for custom markup to be dynamically (PHP) generated and output within a page's edit screen (in Admin).
       
      The value for the fieldtype is generated at runtime. No data is saved in the database. The accompanying InputfieldRuntimeMarkup is only used to render/display the markup in the page edit screen.
       
      The field's value is accessible from the ProcessWire API in the frontend like any other field, i.e. it has access to $page and $pages.
       
      The module was commissioned/sponsored by @Valan. Although there's certainly other ways to achieve what this module does, it offers a dynamic and flexible alternative to generating your own markup in a page's edit screen whilst also allowing access to that markup in the frontend. Thanks Valan!
       
      Warning/Consideration
      Although access to ProcessWire's Fields' admin pages is only available to Superusers, this Fieldtype will evaluate and run the custom PHP Code entered and saved in the field's settings (Details tab). Utmost care should therefore be taken in making sure your code does not perform any CRUD operations!! (unless of course that's intentional) The value for this fieldtype is generated at runtime and thus no data is stored in the database. This means that you cannot directly query a RuntimeMarkup field from $pages->find(). Usage and API
       
      Backend
      Enter your custom PHP snippet in the Details tab of your field (it is RECOMMENDED though that you use wireRenderFile() instead. See example below). Your code can be as simple or as complicated as you want as long as in the end you return a value that is not an array or an object or anything other than a string/integer.
       
      FieldtypeRuntimeMarkup has access to $page (the current page being edited/viewed) and $pages. 
       
      A very simple example.
      return 'Hello'; Simple example.
      return $page->title; Simple example with markup.
      return '<h2>' . $page->title . '</h2>'; Another simple example with markup.
      $out = '<h1>hello '; $out .= $page->title; $out .= '</h1>'; return $out; A more advanced example.
      $p = $pages->get('/about-us/')->child('sort=random'); return '<p>' . $p->title . '</p>'; An even more complex example.
      $str =''; if($page->name == 'about-us') { $p = $page->children->last(); $str = "<h2><a href='{$p->url}'>{$p->title}</a></h2>"; } else { $str = "<h2><a href='{$page->url}'>{$page->title}</a></h2>"; } return $str; Rather than type your code directly in the Details tab of the field, it is highly recommended that you placed all your code in an external file and call that file using the core wireRenderFile() method. Taking this approach means you will be able to edit your code in your favourite text editor. It also means you will be able to type more text without having to scroll. Editing the file is also easier than editing the field. To use this approach, simply do:
      return wireRenderFile('name-of-file');// file will be in /site/templates/ If using ProcessWire 3.x, you will need to use namespace as follows:
      return ProcessWire\wireRenderFile('name-of-file'); How to access the value of RuntimeMarkup in the frontend (our field is called 'runtime_markup')
       
      Access the field on the current page (just like any other field)
      echo $page->runtime_markup; Access the field on another page
      echo $pages->get('/about-us/')->runtime_markup; Screenshots
       
      Backend
       

       

       
      Frontend
       

×
×
  • Create New...