Jump to content
Pete

Module: XML Sitemap

Recommended Posts

hey guys,

I just found this plugin. Great work. It saved some time to code some sitemaps on my own! :)

I'm currently developing my site on a windows platform. After installing the plugin I got a weird error message:

Error:     Exception: Unknown Selector operator: '' -- was your selector value properly escaped?

After some debugging I found out that this seems to be an issue with directory seperators on windows machines.

I just added 3 lines of code to fix this problem for me. I don't know if anyone else suffers from this windows... ehh... bug, so here's what I added (in Line 42, after setting $startpage):

            if(DIRECTORY_SEPARATOR == '\\' && $startpage == '\\') {
                $startpage = '/';
            }
 

Perhaps this will help someone else with same problems :)

Cheerio & thanks!

  • Like 1

Share this post


Link to post
Share on other sites

I can't seem to get this to work with a multilingual site on 2.3.

The site is setup with 2 languages like so:

example.com/en/page/

example.com/fr/page/

But when viewing the sitemap I only get

example.com/page/

And ideas?

Share this post


Link to post
Share on other sites

Hi guys, 

I think i found a bug in this module. There is no Sitemap generated when ProcessWire is installed in a subfolder relative to the root directory.

For example:

  • If PW is installed in direct root: www.flipzoom.de - works
  • If PW is installed in the subdirectory: www.flipzoom.de/pw203/ - does not work; trigger a 404

The problem is on line 42 in the MarkupSitemapXML.module.

$startpage = $this->sanitizer->path(dirname($_SERVER['REQUEST_URI']));

The variable $startpage returns "/pw203/" instead of "/".

The following should fix the problem.

Replace line 42

$startpage = $this->sanitizer->path(dirname($_SERVER['REQUEST_URI']));

with

$startpage = str_ireplace(trim(wire('config')->urls->root, '/'), '', $this->sanitizer->path(dirname($_SERVER['REQUEST_URI'])));

Best regards, 

Dave

  • Like 1

Share this post


Link to post
Share on other sites

This is not a bug? Because if you have pw in a subdirectory the directory is in the url. That's the intended behavior.

Share this post


Link to post
Share on other sites

This is not a bug? Because if you have pw in a subdirectory the directory is in the url. That's the intended behavior.

If I have PW in a subdirectory, the 404-Page will be displayed, not the sitemap. And if I remove the directory name from the start variable, it works.

For understanding: It is a real directory, not a segment in the URL as language localization. So PW installed in the root: www.example.com/sitemap.xml (work). PW installed in a real subdir: www.example.com/a-real-subdir-on-server/sitemap.xml (404 page)

Share this post


Link to post
Share on other sites

Sorry I was too quick reading wrong on my small mobile narrow view. I think you could also file an issue on github.

Share this post


Link to post
Share on other sites

I've merged the pull request - thanks :)

Share this post


Link to post
Share on other sites

Sorry to start begging right after joining the community  :undecided:

Are there any plans to make the module work with LanguageSupportPageNames instead of LanguageLocalizedURL? I like how transparent the module is, but I would like to have other languages listed in the sitemap too. Anyway, good work!

Share this post


Link to post
Share on other sites

Hi taqtaq,

you could use Ryans sitemap-template. it works pretty good in different languages. No need to install LanguageLocalizedURL.

For your different languages you should just add something like:
 

<url>
  <loc>http://yoursite.fi/</loc>
  <xhtml:link rel="alternate" hreflang="en" href="http://yoursite.fi/en" />
  <xhtml:link rel="alternate" hreflang="it" href="http://yoursite.fi/it" />
</url>

http://processwire.com/talk/topic/3846-how-do-i-create-a-sitemapxml/

I will check if I could write a small function to implement this for every language in the system.

EDIT:
Here comes Ryans template with added language alternate-links like recommended by google for multilanguage support.
more information here: https://support.google.com/webmasters/answer/2620865?hl=en

important: name of language should be same like international language-code (name your pages en for english, de for german, es for spain etc.

Just Follow Ryans instructions to use the template, everything else is done by the template.

Update 29.02.16
This update is made for PW 3.0. To prevent endless redirects in 2.7 and lower please read instructions (comments). You need to comment out the line with the redirect.
multilang-sitemap-xml.php.zip

  • Like 3

Share this post


Link to post
Share on other sites

Thanks for your effort kixe, it's working. Didn't even know you are supposed to do the linking like that. Well, every day is a school day..

I still think it would be great if the module was updated sooner or later. I don't want to see our module directory look like the WordPress'. There are so many plugins doing the same stuff a bit differently..

Share this post


Link to post
Share on other sites

This looks like a great plugin, but it doesn't seem to work for me... A request to /sitemap.xml just throws a 404. I have enabled Cache, but I don't see any XML cache file.

Share this post


Link to post
Share on other sites

Hi mike-anthony,

welcome to the forum.
Did you follow Ryans instructions? Do you use it with multi language site?

1. Copy this file to /site/templates/sitemap-xml.php

2. Add the new template from the admin.
Under the "URLs" section, set it to NOT use trailing slashes.

3. Create a new page at the root level, use your sitemap-xml template
and name the page "sitemap.xml".

more:
http://processwire.c...e-a-sitemapxml/

Just to be clear. This (download link from my post 19 March 2014) is a modified Version of Ryans Template with multi language support recommended by google.
I don't use it by myself. I have a hard-coded sitemap-index and use Ryans Template for language specific sitemaps, which works perfectly.
 

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
   <sitemap>
      <loc>http://example.com/de/sitemap.xml</loc>
   </sitemap>
   <sitemap>
      <loc>http://example.com/en/sitemap.xml</loc>
   </sitemap>
</sitemapindex>

<!-- call this file sitemap.xml put it in the root directory -->

Share this post


Link to post
Share on other sites

Hi kixe, and thank you :)

It's not a multi-language site. So, I'm a tad confused: His post says that I must either use the module, OR his template and page; but you're suggesting that I do both? I simply assumed that the module would be plug-and-play (I don't see any specific instructions for the module itself).

EDIT: Just so you know, I am using Twig for my templates, and I don't think PW can be set to check if a given template is running PHP or Twig, as it's hard-coded into the config file. Woild be nice if I could set it like so:

    $config->templateExtension = 'twig|php';

As such, I don't think I can use the page/template-based approach as Twig is designed for that.

EDIT: Although, I could use Hanna Code... Yes?

Share this post


Link to post
Share on other sites

Hi,
you didn't understand me right. In generally you have 2 options: Module or Template.

Module: There exists a sitemap-module made by Pete. Module-Download and Instructions on the modules page: http://modules.processwire.com/modules/markup-sitemap-xml/

Template: Template made by Ryan: https://processwire.com/talk/topic/3846-how-do-i-create-a-sitemapxml/

Both can be used on single and multi-language sites. Use Module OR Template.

The template, which you can download from my post above is a modification of Ryans Template and works only on multilanguage sites, don't use it together with the hard coded sitemap-index I have posted.

I don't use twig and I don't know how to implement it in PW. But I think it is easier and faster just to use php-Templates with PW-Api. Read PW Instructions and you will see how easy the use is. If you want to talk about twig, Hanna Code or whatever find the right thread or start a new one.

Share this post


Link to post
Share on other sites

Right, so I don't use multi-language, and I have followed the instructions for the module by Pete - but, the module is not working for me, and I need to figure out why.

As I use Twig, I cannot use the template, and must use the module.

I have to assume that something's broken with the module, because it just doesn't initiate.

Share this post


Link to post
Share on other sites

The client pushed me to put the site live, which I have now done. Funny thing: it works on production, but not on staging... Weird. Have you seen this happening before?

My staging server is a simple XAMPP setup with PHP 5.5. The production server is running 5.4.

Share this post


Link to post
Share on other sites

First I want to thank you for this module, it's so easy to use.

I added sitemap_ignore als global page setting.
Therefore I changed ___install and ___uninstall.

And I added two hooks to handle this:

$this->addHookAfter('ProcessPageEdit::buildFormSettings', $this, 'addIgnoreXML');
$this->addHookAfter('Pages::save', $this, 'saveIgnoreXML');

The main functionality stayed unchanged. And I added some content to the ReadMe file  :rolleyes: 

Feedback welcome  :)

  • Like 1

Share this post


Link to post
Share on other sites

Hello,

First off - thanks for the module!

I'm trying to uninstall the module (version 1.1.0) on a site that doesn't require a sitemap, but I keep getting the following error:

Recoverable Fatal Error: Argument 1 passed to Fields::___delete() must implement interface Saveable, null given (line 265 of ...wire/core/Fields.php)

Any ideas? Will manually uninstall it if needbe.

Cheers,

Chris

Share this post


Link to post
Share on other sites

@chriswthomson - you've likely deleted the checkbox field this module sets up on install. To get past this error add a new field with a name of:

sitemap_ignore

then try running the uninstall again.

Share this post


Link to post
Share on other sites

I forked this module to add an ignore list feature, see here:

https://github.com/rolandtoth/ProcessWire-MarkupSitemapXML/blob/master/MarkupSitemapXML.module

This adds a textarea where you can enter ProcessWire selectors. Matching pages will be excluded from the sitemap.

For example:

artist.date_birth!=""
name=my-page
parent.path=/my-page/

Screenshot:

post-3156-0-76397000-1431985790_thumb.pn

This is how the exlusion works, using $page->is():

public function processExcludeList($page)
    {
        // get module settings
        $configData = wire('modules')->getModuleConfigData($this);

        // process exclude list
        if ($configData['sitemap_exclude_list'] != '') {

            $excludeList = trim($configData['sitemap_exclude_list']);
            $excludeList = explode("\n", $excludeList);
            $excludeList = array_filter($excludeList, 'trim'); // remove any extra \r characters left behind

            // loop through lines and return false if current page matches
            foreach ($excludeList as $item) {
                if ($page->is($item)) {
                    return false;
                }
            }
        }

        return true;
    }

Submitting the module settings doesn't clear the cache - this has to be done manually (just like in the current 1.1.0 release).

I made some attempts to fix this but no success.

It would be nice if a ProcessWire expert could have a look on it as this is my first module contribution and I'm relatively new to PW.

  • Like 1

Share this post


Link to post
Share on other sites
Here is a quick screencap of "Generate sitemap" feature I'm experimenting with. It is button added by JavaScript that ajax-calls " /sitemap.xml?nocache=1".

In the module, if "nocache=" GET parameter is 1, then cache time is set to 0 instead of 3600. Because of this, the sitemap is re-generated.

If module settings (currently only the exclude list) is modified, then the user have to save settings first, only then is possible to regenerate sitemap.

View in action (in the upper part there's WinSCP window):

post-3156-0-28188500-1432113882_thumb.gi

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 MoritzLost
      This module allows you to integrate hCaptcha bot / spam protection into ProcessWire forms. hCaptcha is a great alternative to Google ReCaptcha, especially if you are in the EU and need to comply with privacy regulations.

      The development of this module is sponsored by schwarzdesign.
      The module is built as an Inputfield, allowing you to integrate it into any ProcessWire form you want. It's primarily intended for frontend forms and can be added to Form Builder forms for automatic spam protection. There's a step-by-step guide for adding the hCaptcha widget to Form Builder forms in the README, as well as instructions for API usage.
      Features
      Inputfield that displays an hCaptcha widget in ProcessWire forms. The inputfield verifies the hCaptcha response upon submission, and adds a field error if it is invalid. All hCaptcha configuration options for the widget (theme, display size etc) can be changed through the inputfield configuration, as well as programmatically. hCaptcha script options can be changed through a hook. Error messages can be translated through ProcessWire's site translations. hCaptcha secret keys and site-keys can be set for each individual inputfield or globally in your config.php. Error codes and failures are logged to help you find configuration errors. Please check the README for setup instructions.
      Links
      Github Repository and documentation InputfieldHCaptcha in the module directory (pending approval) Screenshots (configuration)

      Screenshots (hCaptcha widget)

       
       

       
    • By joshua
      This module is (yet another) way for implementing a cookie management solution.
      Of course there are several other possibilities:
      - https://processwire.com/talk/topic/22920-klaro-cookie-consent-manager/
      - https://github.com/webmanufaktur/CookieManagementBanner
      - https://github.com/johannesdachsel/cookiemonster
      - https://www.oiljs.org/
      - ... and so on ...
      In this module you can configure which kind of cookie categories you want to manage:

      You can also enable the support for respecting the Do-Not-Track (DNT) header to don't annoy users, who already decided for all their browsing experience.
      Currently there are four possible cookie groups:
      - Necessary (always enabled)
      - Statistics
      - Marketing
      - External Media
      All groups can be renamed, so feel free to use other cookie group names. I just haven't found a way to implement a "repeater like" field as configurable module field ...
      When you want to load specific scripts ( like Google Analytics, Google Maps, ...) only after the user's content to this specific category of cookies, just use the following script syntax:
      <script type="text/plain" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script> <script type="text/plain" data-type="text/javascript" data-category="marketing" data-src="/path/to/your/mareketing/script.js"></script> <script type="text/plain" data-type="text/javascript" data-category="external_media" data-src="/path/to/your/external-media/script.js"></script> <script type="text/plain" data-type="text/javascript" data-category="marketing">console.log("Inline scripts are also working!");</script> The type has to be "optin" to get recognized by PrivacyWire, the data-attributes are giving hints, how the script shall be loaded, if the data-category is within the cookie consents of the user. These scripts are loaded asynchronously after the user made the decision.
      If you want to give the users the possibility to change their consent, you can use the following Textformatter:
      [[privacywire-choose-cookies]] It's planned to add also other Textformatters to opt-out of specific cookie groups or delete the whole consent cookie.
      You can also add a custom link to output the banner again with a link / button with following class:
      <a href="#" class="privacywire-show-options">Show Cookie Options</a> <button class="privacywire-show-options">Show Cookie Options</button> This module is still in development, but we already use it on several production websites.
      You find it here: PrivacyWire Git Repo
      Download as .zip
      I would love to hear your feedback 🙂
      CHANGELOG
      0.1.1 Debugging: fixed error during uninstall 0.1.0 Added new detection of async scripts for W3C Validation 0.0.6 CSS-Debugging for hiding unused buttons, added ProCache support for the JavaScript tag 0.0.5 Multi-language support included completely (also in TextFormatter). Added possibility to async load other assets (e.g. <img type="optin" data-category="marketing" data-src="https://via.placeholder.com/300x300">) 0.0.4 Added possibility to add an imprint link to the banner 0.0.3 Multi-language support for module config (still in development) 0.0.2 First release 0.0.1 Early development
    • By bernhard
      --- Please use RockFinder3 ---
    • By MoritzLost
      Cacheable Placeholders
      This module allows you to have pieces of dynamic content inside cached output. This aims to solve the common problem of having a mostly cacheable site, but with pieces of dynamic output here and there.  Consider this simple example, where you want to output a custom greeting to the current user:
      <h1>Good morning, <?= ucfirst($user->name) ?></h1> This snippet means you can't use the template cache (at least for logged-in users), because each user has a different name. Even if 99% of your output is static, you can only cache the pieces that you know won't include this personal greeting. A more common example would be CSRF tokens for HTML forms - those need to be unique by definition, so you can't cache the form wholesale.
      This module solves this problem by introducing cacheable placeholders - small placeholder tokens that get replaced during every request. The replacement is done inside a Page::render hook so it runs during every request, even if the response is served from the template cache. So you can use something like this:
      <h1>Good morning, {{{greeting}}}</h1> Replacement tokens are defined with a callback function that produces the appropriate output and added to the module through a simple hook:
      // site/ready.php wire()->addHookAfter('CachePlaceholders::getTokens', function (HookEvent $e) { $tokens = $e->return; $tokens['greeting'] = [ 'callback' => function (array $tokenData) { return ucfirst(wire('user')->name); } ]; $e->return = $tokens; }); Tokens can also include parameters that are parsed and passed to the callback function. There are more fully annotated examples and step-by-step instructions in the README on Github!
      Features
      A simple and fast token parser that calls the appropriate callback and runs automatically. Tokens may include multiple named or positional parameters, as well as multi-value parameters. A manual mode that allows you to replace tokens in custom pieces of cached content (useful if you're using the $cache API). Some built-in tokens for common use-cases: CSRF-Tokens, replacing values from superglobals and producing random hexadecimal strings. The token format is completely customizable, all delimiters can be changed to avoid collisions with existing tag parsers or template languages. Links
      Github Repository & documentation Module directory (pending approval) If you are interested in learning more, the README is very extensive, with more usage examples, code samples and usage instructions!
    • By Craig
      I've been using Fathom Analytics for a while now and on a growing number of sites, so thought it was about time there was a PW module for it.
      WayFathomAnalytics
      WayFathomAnalytics is a group of modules which will allow you to view your Fathom Analytics dashboard in the PW admin panel and (optionally) automatically add and configure the tracking code on front-end pages.
      Links
      GitHub Readme & documentation Download Zip Modules directory Module settings screenshot What is Fathom Analytics?
      Fathom Analytics is a simple, privacy-focused website analytics tool for bloggers and businesses.

      Stop scrolling through pages of reports and collecting gobs of personal data about your visitors, both of which you probably don't need. Fathom is a simple and private website analytics platform that lets you focus on what's important: your business.
      Privacy focused Fast-loading dashboards, all data is on a single screen Easy to get what you need, no training required Unlimited email reports Private or public dashboard sharing Cookie notices not required (it doesn't use cookies or collect personal data) Displays: top content, top referrers, top goals and more
×
×
  • Create New...