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