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

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

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 Mike Rockett
      Jumplinks for ProcessWire
      Release: 1.5.56
      Composer: rockett/jumplinks
      Jumplinks is an enhanced version of the original ProcessRedirects by Antti Peisa.
      The Process module manages your permanent and temporary redirects (we'll call these "jumplinks" from now on, unless in reference to redirects from another module), useful for when you're migrating over to ProcessWire from another system/platform. Each jumplink supports wildcards, shortening the time needed to create them.
      Unlike similar modules for other platforms, wildcards in Jumplinks are much easier to work with, as Regular Expressions are not fully exposed. Instead, parameters wrapped in curly braces are used - these are described in the documentation.
      Under Development: 2.0, to be powered by FastRoute
      As of version 1.5.0, Jumplinks requires at least ProcessWire 2.6.1 to run.
      View on GitLab
      Download via the Modules Directory
      Read the docs
      Features
      The most prominent features include:
      Basic jumplinks (from one fixed route to another) Parameter-based wildcards with "Smart" equivalents Mapping Collections (for converting ID-based routes to their named-equivalents without the need to create multiple jumplinks) Destination Selectors (for finding and redirecting to pages containing legacy location information) Timed Activation (activate and/or deactivate jumplinks at specific times) 404-Monitor (for creating jumplinks based on 404 hits) Additionally, the following features may come in handy:
      Stale jumplink management Legacy domain support for slow migrations An importer (from CSV or ProcessRedirects) Feedback & Feature Requests
      I’d love to know what you think of this module. Please provide some feedback on the module as a whole, or even regarding smaller things that make it whole. Also, please feel free to submit feature requests and their use-cases.
      Note: Features requested so far have been added to the to-do list, and will be added to 2.0, and not the current dev/master branches.
      Open Source

      Jumplinks is an open-source project, and is free to use. In fact, Jumplinks will always be open-source, and will always remain free to use. Forever. If you would like to support the development of Jumplinks, please consider making a small donation via PayPal.
      Enjoy! :)
    • By BitPoet
      As threatened in Ryan's announcement for 3.0.139, I built a little module for sliding toggles as a replacement for checkboxes. Styling of the input is CSS3 only (with all the usual caveats about older browsers), no JS necessary, and may still be a bit "rough around the edges", so to speak, since I didn't have much time for testing on different devices or brushing things up enough so I'd feel comfortable pushing it to the module directory. But here's the link to the GitHub repo for now:
      InputfieldSlideToggle
      Fieldtype and Inputfield that implements smartphone-style toggles as replacement for checkbox inputs. The visualization is CSS-only, no additional JS necessary.
      Status
      Still very alpha, use with caution!
      Features / Field Settings
      Size
      You can render the toggles in four different sizes: small, medium, large and extra large.
      Off Color
      Currently, "unchecked" toggles can be displayed either in grey (default) or red.
      On Color
      "Checked" toggles can be rendered in one of these colors: blue (default), black, green, grey, orange or red.
      Screenshots

      Some examples with checkbox label


      View all Size and Color Combinations
      Small toggles Medium toggles Big toggles Extra big toggles  









    • By Orkun
      Hi Guys
      I needed to add extended functionalities for the InputfieldDatetime Module (module is from processwire version 2.7.3) because of a Request of Customer.
      So I duplicated the module and placed it under /site/modules/.
      I have added 3 new Settings to the InputfieldDatetime Module.
      1. Day Restriction - Restrict different days based on weekdays selection (e.g. saturday, sunday) - WORKING

       
      2. Time Slots - Define Time slots based on custom Integer Value (max is 60 for 1 hour) - WORKING

       
      3. Time Range Rules per Weekday - Define a minTime and MaxTime per Weekday (e.g. Opening Hours of a Restaurant) - NOT WORKING PROPERLY

       
      The Problem
      Time Slots and Day Restriction working fine so far. But the Time Range Rules per Weekday doesn't work right.
      What should happen is, that when you click on a date, it should update the minTime and maxTime of the Time Select.
      But the change on the select only happens if you select a date 2 times or when you select a date 1 time and then close the datepicker and reopen it again.
      The time select doesn't get change when you select a date 1 time and don't close the picker.
      Here is the whole extended InputfieldDatetime Module.
      The Files that I have changed:
      InputfieldDatetime.module InputfieldDatetime.js jquery-ui-timepicker-addon.js (https://trentrichardson.com/examples/timepicker/) - updated it to the newest version, because minTime and maxTime Option was only available in the new version  
      Thats the Part of the JS that is not working correctly:
      if(datetimerules && datetimerules.length){ options.onSelect = function(date, inst) { var day = $(this).datetimepicker("getDate").getDay(); day = day.toString(); var mintime = $(this).attr('data-weekday'+day+'-mintime'); var maxtime = $(this).attr('data-weekday'+day+'-maxtime'); console.log("weekday: "+day); console.log("minTime: "+mintime); console.log("maxTime: "+maxtime); var optionsAll = $(this).datetimepicker( "option", "all" ); optionsAll.minTime = mintime; optionsAll.maxTime = maxtime; $(this).datetimepicker('destroy'); $(this).datetimepicker(optionsAll); $(this).datetimepicker('refresh'); //$.datepicker._selectDate($(this).attr("id"),date); //$.datepicker._base_getDateDatepicker(); // var inst = $.datepicker._getInst($(this)); // $.datepicker._updateDatepicker(inst); /*$(this).datetimepicker('destroy'); InputfieldDatetimeDatepicker($(this), mintime, maxtime); $(this).datetimepicker('refresh'); */ // $(this).datetimepicker('option', {minTime: mintime, maxTime: maxtime}); } } Can you have a look and find out what the Problem is?
      InputfieldDatetime.zip
       
      Kind Regards
      Orkun
    • By teppo
      This module tracks changes, additions, removals etc. of public (as in "not under admin") pages of your site. Like it's name says, it doesn't attempt to be a version control system or anything like that - just a log of what's happened.
      At the moment it's still a work in progress and will most likely be a victim of many ruthless this-won't-work-let's-try-that-instead cycles, but I believe I've nailed basic functionality well enough to post it here.. so, once again, I'll be happy to hear any comments you folks can provide
      https://modules.processwire.com/modules/process-changelog/
      https://github.com/teppokoivula/ProcessChangelog
      How does it work?
      Exactly like it's (sort of) predecessor, Process Changelog actually consists of two modules: Process Changelog and Process Changelog Hooks. Hooks module exists only to serve main module by hooking into various functions within Pages class, collecting data of performed operations, refining it and keeping up a log of events in it's own custom database table (process_changelog.) Visible part is managed by Process Changelog, which provides users a (relatively) pretty view of the contents of said log table.
      How do you use it?
      When installed this module adds new page called Changelog under Admin > Setup which provides you with a table view of collected data and basic filtering tools See attached screenshots to get a general idea about what that page should look like after a while.
      For detailed installation instructions etc. see README.md.
       


    • By Gadgetto
      Status update links (inside this thread) for SnipWire development will be always posted here:
      2019-08-08
      2019-06-15
      2019-06-02
      2019-05-25
      If you are interested, you can test the current state of development:
      https://github.com/gadgetto/SnipWire
      Please note that the software is not yet intended for use in a production system (alpha version).
      If you like, you can also submit feature requests and suggestions for improvement. I also accept pull requests.
      ---- INITIAL POST FROM 2019-05-25 ----
      I wanted to let you know that I am currently working on a new ProcessWire module that fully integrates the Snipcart Shopping Cart System into ProcessWire. (this is a customer project, so I had to postpone the development of my other module GroupMailer).
      The new module SnipWire offers full integration of the Snipcart Shopping Cart System into ProcessWire.
      Here are some highlights:
      simple setup with (optional) pre-installed templates, product fields, sample products (quasi a complete shop system to get started immediately) store dashboard with all data from the snipcart system (no change to the snipcart dashboard itself required) Integrated REST API for controlling and querying snipcart data webhooks to trigger events from Snipcart (new order, new customer, etc.) multi currency support self-defined/configurable tax rates etc. Development is already well advanced and I plan to release the module in the next 2-3 months.
      I'm not sure yet if this will be a "Pro" module or if it will be made available for free.
      I would be grateful for suggestions and hints!
      (please have a look at the screenshots to get an idea what I'm talking about)
       




×
×
  • Create New...