Autodetect Language

Recommended Posts

On GitHubhttps://github.com/plauclair/AutodetectLanguage
PW's Modules repohttp://modules.processwire.com/modules/autodetect-language/
This ProcessWire 2.x module tries finds a best match between HTTP_ACCEPT_LANGUAGE and currently installed languages.
If a match is found, the user will be redirected from the requested page to the same page in his preferred language. This match occurs only on the first page load, and will work with default caching on. If no match is found, the website will revert back to the "default" language.
Installation info and more details on GitHub. Please submit any bug on the bug tracker, as it is easier to track different issues.

  • Like 12

Share this post

Link to post
Share on other sites

I just pushed version 1.0.3. This version introduces a new option: "Do not detect language if GET parameter is set". You can now set a GET parameter to prevent language redirection on some requests with this parameter. For example, if this parameter is set to "nodetect" and the user requests "http://example.com/de/?nodetect", the plugin will not redirect the user to the user's preferred language or fall back to default.

  • Like 2

Share this post

Link to post
Share on other sites


have you tested this great  :) module with ProCache (or default cache only)?

On production I see a strange behaviour (= it does not work, no redirect) but if I clear or disable ProCache it works well.

My default language isn't EN but IT, so it should redirect always to /en/ with a browser with HTTP_ACCEPT_LANGUAGE  != it.


Share this post

Link to post
Share on other sites

Nope, unfortunately I don't typically use ProCache on my projects. My understanding is that ProCache completely bypasses the typical rendering procedure, and this module hooks to Page::render so they might not be compatible. I would suggest contacting support and see if there's a way to hook into it, I'd be glad to implement this.

Share this post

Link to post
Share on other sites


Aside from ProCache.. another little question.

My default system language is it (customer request) but for all request outside it browser I want to fallback to en.

With defaultSiteLanguageCode set to en all the call from it browser are redirected to en (because not match it -> "default").

Does it make sense for you?

- defaultSiteLanguageCode -> it

- fallbackSiteLanguageCode -> en

Or something similar..


Share this post

Link to post
Share on other sites

And.. add a check for not active language (e.g. fr): so when a language is visible but not active translator can translate pages in backend but the module does not redirect on the /fr/ page.

Share this post

Link to post
Share on other sites

@Pierre-Luc, thanks for your module, but I always thought that redirect to a language automatically isn't good and Google seems to support this:


Avoid automatic redirection based on the user’s perceived language. These redirections could prevent users (and search engines) from viewing all the versions of your site.

What do you guys think?

Share this post

Link to post
Share on other sites

The problem for google is that the crawler most likely will be redirected everytime it visits your site, depending on how "first visit" detection is implemented. For real users it's bad if you just autodetect the language without letting them change the language afterwards, everything else is no problem.

Share this post

Link to post
Share on other sites

Hey Sérgio, I've read that too but after doing some research it's really not as clear cut at StackOverflow might want it to be. :P

As far as I know crawlers don't use Accept-Language typically, and the plugin does absolutely no redirection when it is not set so it should not change their behaviour. This is what Google's documentation says, and others too, and it's also why I implemented the plugin the way it is implemented.

From the "Location-aware crawling" page from Google, you can read this:

If your website has pages that return different content based on the perceived country or preferred language of the visitor (i.e., you have locale-adaptive pages), Google might not crawl, index, or rank all of your locale-adaptive content. This is because the default IP addresses of the Googlebot crawler appear to be based in the USA. In addition, the crawler sends HTTP requests without setting Accept-Language in the request header.

This means that if your website is serving purely based on Accept-Language, there might be trouble cause Google isn't sending any typically, I've seen this happen in the past. The plugin does none of this, it's in your hands to implement a good solution.

What you want to do :

  • DO use <link> with hreflang to help the crawlers find other pages.
  • Don't serve multiple languages from the same URL — always use lang.example.com/.. or example.com/lang/.. It's confusing to users not to and they can't send pages to their friends in the "right" language.
  • Don't use GET parameters to set anything language related.
  • Don't prevent the user (or crawlers) from switching languages and become trapped in a language that isn't their own — aka always have a language switcher in a prominent place and don't detect more than once.
  • Read all the "International" section very carefully and find a solution that works for you. Localization is not an easy topic. 

Note tough that Google tells you what alternative methods supported (tough there's a huge red warning box at the top of the page) :

Currently, Googlebot recognizes a number of signals and hints to determine if your website serves locale-specific content:

  • 1) Serving different content on the same URL—based on the user’s perceived country (geolocation)
  • 2) Serving different content on the same URL—based on the Accept-Language field set by the user’s browser in the HTTP request header
  • 3) Completely blocking access to requests from specific countries

In each case :

1) AutoDetect language isn't a location (geo-ip or else) aware plugin.

2) Discussed earlier, wouldn't recommend for various reasons but might still work. Google says "usually don't".

3) That's the firewall's job! :P

However, if you guys still follow best practices and have trouble being indexed, I'm open to look at more "advanced" solutions. …But more complexity means more points of failure and that's something I usually want to avoid. Just want something that's accessible to beginners and works in the most common cases. :)

  • Like 1

Share this post

Link to post
Share on other sites

Hi Pierre-Luc,

first, thank you for this nice module!

I added a new variable 'noBackend' which allows to test if the page requested belongs to the backend. As I configure the language for login user explicitly, I wanted to have a possibility to prevent admin pages from being redirected, without using a GET parameter.

Shall I send you a patch?

Cheers Oliver

Share this post

Link to post
Share on other sites

Hi oliverx, that's a nice addition. Send me a patch (in a new issue) or pull request on GitHub, I'll review it and incorporate it in the next few days. If you're not on GitHub send it over at info@plauclair.me


Share this post

Link to post
Share on other sites

As far as I know crawlers don't use Accept-Language typically,

I had a problem with Wordpress recently. After the Google Update from last week, all translated pages got dropped from the index and their content was replaced with the default EN language content. A mega disaster. A fix was to switch off automatic language redirection (WPML).

I am mentioning this here, because if this module is crafted on the above mentioned assumption that crawlers don't use Accept-Language, it might be interesting whether this is still the case and what the consequences are, if not.

 I am not a SEO specialist but I found this brand new article from 2016:


If your site alters its content based on any Accept-Language field set by browsers’ HTTP headers, Googlebot uses a variety of signals to try to crawl your content using different Accept-Language HTTP headers. This means Google is more likely to discover, index, and rank your content in the different languages your site supports.

So, what do you think?

Share this post

Link to post
Share on other sites

Hard to say without seeing the <head> on the specific pages you're talking about.

Google still says this though: IMPORTANT: We continue to support and recommend using separate locale URL configurations and annotating them with rel=alternate hreflang annotations.

Discovering based accept-language is one thing (this targets the users), you should still use the hreflang tags and <html lang="…"> (this targets crawlers). This will give better results as it's not prone to interpretation I believe. I haven't seen anything weird on the sites I use the plugin on yet, but will be monitoring. 
  • Like 1

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By kongondo
      Process Sites Manager
      ProcessWire supports multiple site setups using various methods. One of the more common approaches is running multiple sites from the same core installation with each site maintaining its own database (aka option #1). This approach requires the site admin to initially install ProcessWire in a temporary directory for each new site. The directory then needs to be renamed as site-xxx, where ‘xxx’ is any name you want to use to differentiate the installation from other sites, before it is moved to the webroot. For instance, site-mysite, site-another, site-whatever. In addition, the /wire/index.config.php file must be copied/moved to the webroot. Each time a site is added, the index.config.php has to be edited to add ‘domain’ => ‘site-directory’ key=>value pairs for the site. This process can become a bit tedious. This module aims to automate the whole process.
      The module is based off the official ProcessWire installer. Creating a site is as simple as completing and submitting a single form! The module will:
      Install a ProcessWire site in your named directory, applying chmod values as specified
      Move the directory to your webroot
      Update/Create a Superuser account as per the submitted form, including setting the desired admin theme and colour
      Update sites.json (used by index.config.php to get array of installed sites)
      Please note that this module is not a multiple sites solution! It is just a helper class for those using option #1. Your multi-sites solution will still be delivered by ProcessWire core. The only difference is index.config.php is slightly different from the one that ships with ProcessWire.
      This module works as expected. However, it needs a bit more testing in different environments. In light of this, it is labelled as alpha and should not be used in a production environment.
      Download from GitHub: Sites Manager
      Install unlimited number of sites in one ProcessWire install
      Choose an Admin Theme to auto-install along with the site installation
      Install and maintain site profiles for reuse to create other sites
      Client and server-side validation of site creation form
      Edit uploaded profiles (e.g., replace profile file)
      Lock installed sites and profiles to prevent editing
      Bulk delete site profiles, installed site directories and/or databases (confirmation required for latter two)
      View important site details (admin login, chmod, etc)
      Links to installed sites home and admin pages
      Timezones auto-complete/-suggest
      Installations’ domains/sub-domains must exist before installing the site. This is needed in order to update/save the Superuser account for the new site. For instance, if creating a site with the subdomain blog.mydomain.com (with directory site-blog), that subdomain must be active. For local development, if using Apache, for instance, a virtual host directive for blog.mydomain.com must have been set up prior to the installation. For remote/live sites, the subdomain must have been set up at your Domain Name Registrar.
      Site Profiles
      You will need to prepare site profiles for use with the module. Example site profiles ship with ProcessWire. These include ‘site-default’, ‘site-classic’, ‘site-blank’, etc. The module only accepts zip files. Each of these folders needs to be compressed into a zip file, for instance ‘site-default.zip’, ‘site-languages.zip’, etc. Please note that the other content you get with ProcessWire downloads are not required. These include the wire folder and .gitignore, index.php, etc files. Do not include any of these in the ‘site-whatever.zip’.
      You are not limited to using the site profiles that ship with ProcessWire. You can create and use your own custom profiles as long as they are structured according to the format ProcessWire expects (@see site-default that ships with ProcessWire as an example).
      Install the module like any other. It will create required templates, fields and pages (hidden in admin under Multi Sites). The install will also copy two files to your webroot; sites.json and index.config.php. If any identical module components (field, templates, files, etc) are found in your system, the module will not install but will instead error out with a relevant message.
      Module Files
      The two file sites.json and index.config.php should not be removed from your webroot if you are using this module. The former should remain writable at all times. The index.config.php is a modified version of the one that ships with ProcessWire. Rather than editing the file directly with new entries for installed sites, it fetches the information about multi-sites sites that ProcessWire needs to serve directly from the site.json contents which it converts to an array before passing off to ProcessWire. We haven’t done any real-world testing (yet) but have not observed any noticeable delays in serving the multi-sites sites in this manner.
      The module will be useful in both development and production (@see note above! When ready) environments.
      For development work, there are times when you need to quickly put up a temporary site to test something, debug an install or create a mock website to present draft ideas to a client, etc. This module allows you to do all these, and more, easily and quickly.
      For live sites, the module can be a time saver, allowing you to install and manage (very limited feature-set at present) your sites from one dashboard.
      Site Profiles
      The first thing to do after installing the module is to upload at least one site profile. In the Upload page, complete the ‘upload a site profile form’. Give the profile upload a title, optionally a description (good reminder about what the profile features), ProcessWire compatibility and of course the profile zip file itself. Profile uploads are saved as hidden pages in the admin. This enables reuse of the profile, so that you don’t have to upload it over and over every time you need to install a site.
      Uploaded profiles are listed under the page Profiles. Head over there to see a list of available profiles. Using this page, you can edit individual profiles, e.g. change the title or replace the profile zip file. You can also lock/unlock or delete profiles. You are now ready to create sites.
      Create/Install Sites
      Head over to the Create page. This is where the automation really happens. Complete the form as required. Most of the inputs/fields should be familiar if you’ve ever installed ProcessWire. All fields, except for Description and HTTP Host Names, must be completed. It is recommended to complete these as well. Each field is accompanied by an explanation about what what it does (straight off the ProcessWire install you are used to). One bonus you get is you are able to select both an Admin Theme and Colour Theme to install! If you like AdminThemeReno in Blue, for instance, you can have that installed for you. Another bonus is the Default Timezone field. It uses auto-complete so that you don’t have to type the whole timezone name. Please note that, unlike in the official installer, profile previews are not (currently?) available.
      When you are happy with your settings click save to start the install. Please note that due to the additional client-side validation, if any of the checks fail, the errors to correct will be displayed in a modal and the form will not be submitted. Checks include mismatched Superuser passwords, empty required fields, invalid emails, short admin login URL/name, etc.
      If all went well, the site should install! Please note that currently (and a tad annoyingly!), the install will abort (sometimes half-way), if it hits an error. This has nothing to do with the official ProcessWire install but the checks we have put in the module code, currently. Hopefully, with feedback from the community, we can change how the module deals with errors. Most errors, if they appear, will be related to the file system...cannot write to file blah blah, etc.
      If you clicked on the button Save & View Sites, you should, momentarily (it may take a while depending on your system), see your new site on the page Installed. Otherwise, navigate to that page.
      On this page you see a list of installed sites and information about them. To view your site, click on the link in Domain. The site opens in a new tab. To head straight to the admin, click on the link in Admin Login. Log in with the Superuser credentials you supplied on the ‘create site form’. Voilà! Your new site’s admin with the theme and colours your selected applied for the Superuser!
      On the Installed sites page, you can lock/unlock the installed sites records (the pages). You can also bulk delete the sites’ directories (the site-mydomain directories in webroot) and/or their databases. A dialog appears asking you to confirm these latter two actions. Be careful with these! They are useful for erasing temporary test sites but you need to double check your intended action. It is therefore advisable to lock sites to prevent unintended erasure.
      Deleting a site’s directory and/or database also deletes its associated page record. This means you won’t be able to view it in the Installed page.
      Use this to make a clean getaway before uninstalling the module. The page will also allow you to specify whether you wish to delete the sites.json and index.config.php files from your webroot.
      Only Superusers can use the module.
      ProcessWire 2.7 - 3.x compatible
      Currently using ProcessWire 2.7 installer (install.php)
      Potential race condition when sites.json is being updated on a new site install vs. index.config.php accessing the json file?
      Not tested with sub-directory installs (for instance localhost/pw/my-site-here/)
      Currently not doing the extra/experimental database stuff (database charset and engine)
      Future Possibilities
      Install specified modules along with the ProcessWire install
      Create installation profiles and/or allow JSON/CSV install configurations (useful for repetitive values, e.g. where Superuser email doesn’t change)
      Profile previews?
      @ryan: for the ProcessWire installer
      @abdus: for the index.config.php reading from JSON idea
      @swampmusic: for the challenge
      Please help test and report any issues. Feature suggestions are also welcome. Comments on anything from UX to technical stuff to make this as robust as possible are appreciated.
      Video Demo
      Quick Demo (excuse the video quality please )

    • By Robin S
      Some introduction...
      This module is experimental and there are probably bugs - so treat it as alpha and don't use it on production websites.
      I started on this module because there have been quite a few requests for "fake" or "invisible" parent functionality and I was curious about what is possible given that the idea sort of goes against the PW page structure philosophy. I'm not sure that I will use this module myself, just because I don't really see a long list of pages under Home (or anywhere else) as untidy or cluttered. I would tend to use Lister Pro when I want to see some set of pages as a self-contained group. But maybe others will find it useful.
      At the moment this module does not manipulate the breadcrumb menu in admin. So when you are editing or adding a virtual child the real location of the page is revealed in the breadcrumb menu. That's because I don't see the point in trying to comprehensively fool users about the real location of pages - I think it's better that they have some understanding of where the pages really are. But I'm open to feedback on this and it is possible to alter the breadcrumbs if there's a consensus that it would be better that way.
      Virtual Parents
      Allows pages in Page List to be grouped under a virtual parent.
      This module manipulates the page list and the flyout tree menu to make it appear that one or more pages are children of another page when in fact they are siblings of that page.
      Why would you do that instead of actually putting the child pages inside the parent? Mainly if you want to avoid adding the parent name as part of the URL. For example, suppose you have some pages that you want to be accessed at URLs directly off the site root: yourdomain.com/some-page/. But in the page list you want them to be appear under a parent for the sake of visual grouping or to declutter the page list under Home.
      Example of how the page structure actually is

      Example of how the page structure appears with Virtual Parents activated

      How it works
      This module identifies the virtual parents and virtual children by way of template. You define a single template as the virtual parent template and one or more templates as the virtual child templates. Anytime pages using the child template(s) are siblings of a page using the parent template, those child pages will appear as children of the virtual parent in the page list and tree menu.
      You will want to create dedicated templates for identifying virtual parents and virtual children and reserve them just for use with this module.
      Adjusts both page list and tree flyout menu to show the virtual parent/child structure, including the count of child pages. Works everywhere page list is used: Page List Select / Page List Select Multiple (and therefore CKEditor link dialog). Intercepts the "Add page" process in admin, so that when an attempt is made to add a child to a virtual parent, the child is added where it belongs (the next level up) and the template selection is limited to virtual child templates. Intercepts moving and sorting pages in the page list, to ensure only virtual children may be moved/sorted under the virtual parent. Superusers have a toggle switch at the bottom of the page list to easily disable/enable Virtual Parents in order to get a view of what the real page structure is. Usage
      Install the Virtual Parents module.
      In the module config, enter pairs of parent/child template names in the form virtual_parent_template=virtual_child_template. If needed you can specify multiple pipe-separated child templates: virtual_parent_template=child_template_1|child_template_2. One pair of template names per line.
      There is a checkbox in the module config to toggle Virtual Pages on and off, but it's more convenient to use this from the page list.
      It's important to keep in mind the real location of the virtual child pages. This module is only concerned with adjusting the appearance of page list and tree menu for the sake of visual grouping and tidiness. In all other respects the virtual children are not children of the virtual parent at all.
      It's recommended to select an icon for the virtual parent template (Advanced tab) so virtual parents are marked out in the page list as being different from normal parent pages.
      Do not place real children under a virtual parent. There is some protection against this when moving pages in the page list, but when it comes to changing a page's parent via the Settings tab the only protection is common sense.
    • By horst
      Wire Mail SMTP

      An extension to the new WireMail base class that uses SMTP-transport

      This module integrates EmailMessage, SMTP and SASL php-libraries from Manuel Lemos into ProcessWire. I use this continously evolved libraries for about 10 years now and there was never a reason or occasion not to do so. I use it nearly every day in my office for automated composing and sending personalized messages with attachments, requests for Disposition Notifications, etc. Also I have used it for sending personalized Bulkmails many times.

      The WireMailSmtp module extends the new email-related WireMail base class introduced in ProcessWire 2.4.1 (while this writing, the dev-branch only).
      Here are Ryans announcement.

      Current Version 0.2.7
      get it from the Modules Directory Install and Configure

      Download the module into your site/modules/ directory and install it.

      In the config page you fill in settings for the SMTP server and optionaly the (default) sender, like email address, name and signature.
      You can test the smtp settings directly there. If it says "SUCCESS! SMTP settings appear to work correctly." you are ready to start using it in templates, modules or bootstrap scripts.

      Usage Examples
      The simplest way to use it:
      $numSent = wireMail($to, $from, $subject, $textBody); $numSent = wireMail($to, '', $subject, $textBody); // or with a default sender emailaddress on config page This will send a plain text message to each recipient.
      You may also use the object oriented style:
      $mail = wireMail(); // calling an empty wireMail() returns a wireMail object $mail->to($toEmail, $toName); $mail->from = $yourEmailaddress; // if you don't have set a default sender in config // or if you want to override that $mail->subject($subject); $mail->body($textBody); $numSent = $mail->send(); Or chained, like everywhere in ProcessWire:
      $mail = wireMail(); $numSent = $mail->to($toEmail)->subject($subject)->body($textBody)->send(); Additionaly to the basics there are more options available with WireMailSmtp. The main difference compared to the WireMail BaseClass is the sendSingle option. With it you can set only one To-Recipient but additional CC-Recipients.
      $mail = wireMail(); $mail->sendSingle(true)->to($toEmail, $toName)->cc(array('person1@example.com', 'person2@example.com', 'person3@example.com')); $numSent = $mail->subject($subject)->body($textBody)->send(); The same as function call with options array:
      $options = array( 'sendSingle' => true, 'cc' => array('person1@example.com', 'person2@example.com', 'person3@example.com') ); $numSent = wireMail($to, '', $subject, $textBody, $options); There are methods to your disposal to check if you have the right WireMail-Class and if the SMTP-settings are working:
      $mail = wireMail(); if($mail->className != 'WireMailSmtp') { // Uups, wrong WireMail-Class: do something to inform the user and quit echo "<p>Couldn't get the right WireMail-Module (WireMailSmtp). found: {$mail->className}</p>"; return; } if(!$mail->testConnection()) { // Connection not working: echo "<p>Couldn't connect to the SMTP server. Please check the {$mail->className} modules config settings!</p>"; return; } Following are a ...

      List of all options and features

      testConnection () - returns true on success, false on failures

      sendSingle ( true | false ) - default is false

      sendBulk ( true | false ) - default is false, Set this to true if you have lots of recipients (50+)

      to ($recipients) - one emailaddress or array with multiple emailaddresses

      cc ($recipients) - only available with mode sendSingle, one emailaddress or array with multiple emailaddresses

      bcc ($recipients) - one emailaddress or array with multiple emailaddresses

      from = 'person@example.com' - emailaddress, can be set in module config (called Sender Emailaddress) but it can be overwritten here

      fromName = 'Name Surname' - optional, can be set in module config (called Sender Name) but it can be overwritten here

      priority (3) - 1 = Highest | 2 = High | 3 = Normal | 4 = Low | 5 = Lowest

      dispositionNotification () or notification () - request a Disposition Notification

      subject ($subject) - subject of the message

      body ($textBody) - use this one alone to create and send plainText emailmessages

      bodyHTML ($htmlBody) - use this to create a Multipart Alternative Emailmessage (containing a HTML-Part and a Plaintext-Part as fallback)

      addSignature ( true | false ) - the default-behave is selectable in config screen, this can be overridden here
      (only available if a signature is defined in the config screen)

      attachment ($filename, $alternativeBasename = "") - add attachment file, optionally alternative basename

      send () - send the message(s) and return number of successful sent messages

      getResult () - returns a dump (array) with all recipients (to, cc, bcc) and settings you have selected with the message, the message subject and body, and lists of successfull addresses and failed addresses,

      logActivity ($logmessage) - you may log success if you want

      logError ($logmessage) - you may log warnings, too. - Errors are logged automaticaly
      useSentLog (true | false) - intended for usage with e.g. third party newsletter modules - tells the send() method to make usage of the sentLog-methods - the following three sentLog methods are hookable, e.g. if you don't want log into files you may provide your own storage, or add additional functionality here

      sentLogReset ()  - starts a new LogSession - Best usage would be interactively once when setting up a new Newsletter

      sentLogGet ()  - is called automaticly within the send() method - returns an array containing all previously used emailaddresses

      sentLogAdd ($emailaddress)  - is called automaticly within the send() method
      Changelog: https://github.com/horst-n/WireMailSmtp/blob/master/CHANGELOG.md
    • By ukyo
      Call ProcessWire API Functions Inside STRING
      Github Repo
      Current status : BETA
      Each called method must return string value !
      I added all functions, but not tested all. I focused page(), page()->render and field properties (label, description and notes). I also tested some basic pages() api calls.
      Your API calls must start with { and must end with }. For use multiple arguments inside functions, separate arguments with ~ char.
      NOTE If you pass directly arguments to api {page(title)}, this call will check for requestedApiCall()->get(arguments).
      processString(string, page, language); Get page title <?php $str = "You are here : {page:title}"; echo processString($str); ?> Get page children render result <?php $str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.<hr>{page:render:children}"; echo processString($str); ?> Get homepage title <?php $str = "You can visit our <a hre='{pages(1):url}'>{pages:get(1):title}</a>"; echo processString($str); ?> Get title field label, description or notes <?php $str = "Our title field properties are : label: {label(title)} - description: {description(title)} - notes: {notes(title)}"; echo processString($str); ?> Multiple examples <?php $str = " <ul class='uk-list uk-list-striped'> <li><b>01: GET FIELD LABEL</b> <code>&#123;label(title)&#125;</code> <b>RESULT :</b> <code>{label(title)}</code></li> <li><b>02: GET FIELD LABEL WITH PREFIX</b> <code>&#123;label(title~=> )&#125;</code> <b>RESULT :</b> <code>{label(title~=> )}</code></li> <li><b>03: GET FIELD LABEL WITH SUFFIX</b> <code>&#123;label(title~~ <=)&#125;</code> <b>RESULT :</b> <code>{label(title~~ <=)}</code></li> <li><b>04: GET FIELD DESCRIPTION</b> <code>&#123;description(title)&#125;</code> <b>RESULT :</b> <code>{description(title)}</code><br> <li><b>05: GET FIELD DESCRIPTION WITH PREFIX</b> <code>&#123;description(title~=> )&#125;</code> <b>RESULT :</b> <code>{description(title~=> )}</code></li> <li><b>06: GET FIELD DESCRIPTION WITH SUFFIX</b> <code>&#123;description(title~~ <=)&#125;</code> <b>RESULT :</b> <code>{description(title~~ <=)}</code></li> <li><b>07: GET FIELD NOTES</b> <code>&#123;notes(title)&#125;</code> <b>RESULT :</b> <code>{notes(title)}</code><br> <li><b>08: GET FIELD NOTES WITH PREFIX</b> <code>&#123;notes(title~=> )&#125;</code> <b>RESULT :</b> <code>{notes(title~=> )}</code></li> <li><b>09: GET FIELD NOTES WITH SUFFIX</b> <code>&#123;notes(title~~ <=)&#125;</code> <b>RESULT :</b> <code>{notes(title~~ <=)}</code></li> <li><b>10: GET PAGE TITLE</b> <code>&#123;page(title)&#125;</code> <b>RESULT :</b> <code>{page(title)}</code></li> <li><b>11: GET PAGE TITLE</b> <code>&#123;page:title&#125;</code> <b>RESULT :</b> <code>{page:title}</code></li> <li><b>12: GET PAGE RENDER TITLE</b> <code>&#123;page:render:title&#125;</code> <b>RESULT :</b> <code>{page:render:title}</code></li> <li><b>12: GET HOMEPAGE TITLE</b> <code>&#123;pages:get(template=home):title&#125;</code> <b>RESULT :</b> <code>{pages:get(template=home):title}</code></li> <li><b>13: GET HOMEPAGE TEMPLATE ID</b> <code>&#123;pages:get(template=home):template:id&#125;</code> <b>RESULT :</b> <code>{pages:get(template=home):template:id}</code></li> </ul> "; echo processString($str); ?>
    • By Robin S
      This module corrects a few things that I find awkward about the "Add New Template" workflow in the PW admin. I opened a wishlist topic a while back because it would good to resolve some of these things in the core, but this module is a stopgap for now.
      Originally I was going to share these as a few standalone hooks, but decided to bundle them together in a configurable module instead. This module should be considered alpha until it has gone through some more testing.
      Add Template Enhancements
      Adds some efficiency enhancements when adding or cloning templates via admin.

      Derive template label from name: if you like to give each of your templates a label then this feature can save some time. When one or more new templates are added in admin a label is derived automatically from the name. There are options for underscore/hyphen replacement and capitalisation of the label. Edit template after add: when adding only a single template, the template is automatically opened for editing after it is added. Copy field contexts when cloning: this copies the field contexts (a.k.a. overrides such as column width, label and description) from the source template to the new template when using the "Duplicate/clone this template?" feature on the Advanced tab. Copy field contexts when duplicating fields: this copies the field contexts if you select the "Duplicate fields used by another template" option when adding a new template. Usage
      Install the Add Template Enhancements module.
      Configure the module settings according to what suits you.