Jump to content

Module: XML Sitemap


Pete

Recommended Posts

  • 4 months later...

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
Link to comment
Share on other sites

  • 4 weeks later...
  • 1 month later...

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
Link to comment
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)

Link to comment
Share on other sites

  • 5 weeks later...
  • 1 month later...

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!

Link to comment
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
Link to comment
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..

Link to comment
Share on other sites

  • 1 month later...

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 -->
Link to comment
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?

Link to comment
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.

Link to comment
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.

Link to comment
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.

Link to comment
Share on other sites

  • 5 months later...

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
Link to comment
Share on other sites

  • 1 month later...

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

Link to comment
Share on other sites

  • 5 weeks later...

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

Link to comment
Share on other sites

  • 3 months later...

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
Link to comment
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

Link to comment
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
×
×
  • Create New...