Jump to content
gRegor

Module: Webmention

Recommended Posts

Updated 2018-05-06:

Version 2.0.0 released

Updated 2017-03-27:

Version 1.1.3 released

Updated 2016-04-11:

Version 1.1.2 released

Updated 2016-02-26:

Officially in the module directory! http://modules.processwire.com/modules/webmention/

Updated 2016-02-25:

Version 1.1.0 is now released. It's been submitted to the module directory so should appear there soon. In the meantime, it's available on GitHub: https://github.com/gRegorLove/ProcessWire-Webmention. Please refer to the updated README there and let me know if you have any questions!

------------
Original post:
 

This is now out of date. I recommend reading the official README.
 

I've been working on this one for a while. It's not 100%, but it is to the point I'm using it on my own site, so it's time for me to release it in beta. Once I finish up some of the features described below, I will submit it to the modules directory as a stable plugin.

For now, you can install from Github. It works on PW2.5. I haven't tested on PW2.6, but it should work there.

Feedback and questions are welcome. I'm in the IRC channel #processwire as well as #indiewebcamp if you have any questions about this module, webmention, or microformats.

Thanks to Ryan for the Comments Fieldtype which helped me a lot in the handling of webmentions in the admin area.

ProcessWire Webmention Module

Webmention is a simple way to automatically notify any URL when you link to it on your site. From the receiver's perspective, it is a way to request notification when other sites link to it.

Version 1.0.0 is a stable beta that covers webmention sending, receiving, parsing, and display. An easy admin interface for received webmentions is under development, as well as support for the Webmention Vouch extension.

Features

* Webmention endpoint discovery

* Automatically send webmentions asynchronously
* Automatically receive webmentions
* Process webmentions to extract microformats
 
Requirements
* php-mf2 and php-mf2-cleaner libraries; bundled with this package and may optionally be updated using Composer.
* This module hooks into the LazyCron module.
 
Installation
Github: https://github.com/gRegorLove/ProcessWire-Webmention

Installing the core module named "Webmention" will automatically install the Fieldtype and Inputfield modules included in this package.
 
This module will attempt to add a template and page named "Webmention Endpoint" if the template does not exist already. The default location of this endpoint is http://example.com/webmention-endpoint
 
After installing the module, create a new field of type "Webmentions" and add it to the template(s) you want to be able to support webmentions.

Sending Webmentions

When creating or editing a page that has the Webmentions field, a checkbox "Send Webmentions" will appear at the bottom. Check this box and any URLs linked in the page body will be queued up for sending webmentions. Note: you should only check the "Send Webmentions" box if the page status is "published."
 
Receiving Webmentions
This module enables receiving webmentions on any pages that have have "Webmentions" field, by adding the webmention endpoint as an HTTP Link header. If you would like to specify a custom webmention endpoint URL, you can do so in the admin area, Modules > Webmention.
 
Processing Webmentions (beta)
Currently no webmentions are automatically processed. You will need to browse to the page in the backend, click "Edit," and scroll to the Webmentions field. There is a dropdown for "Visibility" and "Action" beside each webmention. Select "Process" to parse the webmention for microformats.
 
A better interface for viewing/processing all received webmentions in one place is under development.
 
Displaying Webmentions (beta)
Within your template file, you can use `$page->Webmentions->render()` [where "Webmentions" is the name you used creating the field] to display a list of approved webmentions. As with the Comments Fieldtype, you can also generate your own output.
 
The display functionality is also under development.
 
Logs
This module writes two logs: webmentions-sent and webmentions-received.
 
Vouch
The Vouch anti-spam extension is still under development.
 
IndieWeb
The IndieWeb movement is about owning your data. It encourages you to create and publish on your own site and optionally syndicate to third-party sites. Webmention is one of the core building blocks of this movement.
 
Learn more and get involved by visiting http://indiewebcamp.com.
 
Further Reading
  • Like 10

Share this post


Link to post
Share on other sites

An example of some cool things this enables:

If you add some simple microformats to your HTML, the recipient of a webmention can parse out the content of your post and display it as a comment on their own site; federated commenting!

For example, I posted this silly physics pun on my site, sent a webmention to the URL it was in-reply-to, and the recipient's website parsed the microformats to display my comment. :)

Share this post


Link to post
Share on other sites

Thanks for sharing, this looks like a handy module! Will definitely give it a closer look soon. Also, your code looks absolutely beautiful, if I may say so :)

One thing you might want to check, though, are the SQL queries. I noticed that you're sanitizing inserted URLs with $sanitizer->url(), and while this will make sure that they're valid URLs, they can still contain unescaped apostrophes. I don't see a straightforward way to exploit this for SQL injections, but it could probably result in broken SQL statements.

Usually I'd suggest using prepared statements over plain queries, even in simple use cases, as they do make it easier to avoid various parameter-related problems.

You were referring to a particular ProcessWire issue in your WireHttp "shim". From the issue it seems like Ryan has already implemented this, or at least added the completed tag to the issue itself; is this still necessary?

Share this post


Link to post
Share on other sites

Thanks, teppo! Yeah, I was looking over the code after I posted and realized I should be using prepared statements. D'oh! I'll make that fix quickly :)

Yeah, the WireHttp shim gives you an indication how long I've been working on this, heh. I decided to leave it in for now so that the module could be 2.5-compatible; I think my WireHttp PR didn't make it in until 2.6 (not sure which version, exactly). Perhaps I could perform a version check in the code and if it's before X, use the shim, otherwise use the core version.

Share this post


Link to post
Share on other sites

That's amazing! Thought about something like that couple of month ago but couldn't get my head around it..

Just to clarify, is it compatible with Wordpress? So I could mention a Wordpress blog and they could parse it and vice versa?

Share this post


Link to post
Share on other sites

That's amazing! Thought about something like that couple of month ago but couldn't get my head around it..

Just to clarify, is it compatible with Wordpress? So I could mention a Wordpress blog and they could parse it and vice versa?

Yes, if the WordPress site supports webmentions. If the site doesn't support webmentions and does support pingback, this module will fallback to sending a pingback.

There are WordPress plugins to add webmention support,. See http://indiewebcamp.com/WordPress for more info. As I understand it, there's actually two plugins to get the full features: Webmention and Semantic Linkbacks. The latter gives you more user-friendly text for linkbacks (of all types). There's a pretty active group of WordPress users in the indiewebcamp community and I know they'd love to help anyone get set up with these plugins. Feel free to stop by the IRC for any help: http://indiewebcamp.com/IRC

  • Like 2

Share this post


Link to post
Share on other sites

Thank you so much for creating this Gregor! I didn't have a closer look at it yet, but I will definitely test the module on my site.

Out of necessity I wrote a very simple webmentions implementation for Processwire a couple of weeks ago at Indie Web Camp in Brighton. But it's by far not as advanced as yours. At the moment it can only receive and display webmentions and I use it in combination with brid.gy to pull in responses to tweets I send out from my site (like here).

One question came up when I read your documentation. You wrote that every URL in the page body would be sent a webmention.

Would it be possible to specify just one URL that I can send a reply to?

I can't wait to give your module a test run and I will be back with further feedback soon!

Share this post


Link to post
Share on other sites

Thanks for the kind words, Johannes.

Yes, making the plugin more flexible about the fields it looks for URLs in is something I've been thinking about. I chose "body" since it seems the most common field people will have in their templates, but even that is not guaranteed. I think I will add a module configuration that will accept a comma-separated list of fields to check for URLs. If the template has one of those fields, it will parse for URLs and send webmentions to them.

This is something I already need for my site. For example, my notes have a separate field for the in-reply-to URL, so I currently cannot webmention those URLs automatically.

This module will work with your Brid.gy backfeed, by the way.

P.S. I made a reply to this note and sent a webmention.

Edited by adrian
Fix brid.gy link

Share this post


Link to post
Share on other sites

Really looking forward to trying this, thank you so much gRegor, and for drawing my attention to the fact that the W3C had a spec on this, fab!

Share this post


Link to post
Share on other sites

Fixed as of v1.1.1: I caught (and filed) a bug to be fixed: if you use the Webmentions Manager to try to manually process/delete a received webmention, it does not work currently. This doesn't affect the automatic processing, if you have that enabled, or manually processing from the page that received the webmention.

Do feel free to try it out by sending a webmention to this post on my site: http://gregorlove.com/2016/02/quite-pleased-to-officially-release/

  • Like 1

Share this post


Link to post
Share on other sites

Version 1.1.2 is released: http://mods.pw/BC

- Updated packaged php-mf2 library to version 0.3.0

- Added config option to automatically monitor a page for approved vouch domains (see below).
- Better authorship algorithm support.

One of the bottlenecks for the Vouch protocol is "how do you easily manage the list of domains you will accept a vouch from?" In the 1.1.0 release, it was just a text field that you had to manually enter each domain into. 

As of version 1.1.1, there is a new config field “Vouch whitelist URL.” You can enter the URL of your blogroll or other whitelist. It will be monitored once a day and new domains will be added to the list of approved vouch domains. Links must use the h-card microformat. No domains will be removed from the approved vouch domains. This should help automate the approved vouch domains list. I'm trying this out on my own site currently: http://gregorlove.com/following/

If you're using this plugin, I'd love to hear from you! Feel free to send webmentions to this post: http://gregorlove.com/2016/02/quite-pleased-to-officially-release/

  • Like 5

Share this post


Link to post
Share on other sites

Actually I can't get this working even in PW 2.7.x. When I tried to install it, I got the following untrapped, fatal error:

Error: Class 'WebmentionItem' not found (line 78 of [path to webroot]/site/modules/Webmention/ProcessWebmentionsManager/ProcessWebmentionsManager.module)

I manually removed the Webmention folder from the modules folder and refreshed modules. Now if I put the folder back, I get an ISE, and this error is logged:

Error: Class 'ProcessWebmentionsManager' not found (line 407 of [path to webroot]/wire/core/Modules.php)

Suggestions welcome.

Share this post


Link to post
Share on other sites

@Jason Huck So sorry for the delay in reply. I somehow missed the notifications for responses here.

Are you still experiencing the problems on 2.7 or 2.8? I will try doing some fresh installs on those as well as 3.x. It's not explicitly set up for 3.x yet, but it should be easy for me to add the namespaces and have a 3.x-ready version.

Share this post


Link to post
Share on other sites

Version 1.1.3 is out: http://modules.processwire.com/modules/webmention/

  • Fixed fatal error on install (thanks @Jason Huck!)
  • Improved validation of source, target, and vouch parameters
  • Enabled sending webmentions to links that have been removed from a post
  • Added hookable methods for image caching
  • Fixed handling of HTTP 410 Gone responses

This works on version 2.6, 2.7, and 2.8. It does not work on on 3.x yet. I'll make a branch with a 3.x compatible version soon, though.

As usual, if you're using this plugin I'd love to hear from you. Feel free to send webmentions to this post: https://gregorlove.com/2017/03/webmention-for-processwire-update/

  • Like 1

Share this post


Link to post
Share on other sites

I'm working on a PW 3.x version of the module in this branch: https://github.com/gRegorLove/ProcessWire-Webmention/tree/master-pw3. It's in beta currently; it should generally work, but if you run into any problems, let me know.

Also, I realized it was not obvious that the webmention endpoint requires a template file in order for this plugin to work. Otherwise the endpoint would return 404 to any requests. I've added a sample template file here and info in the README: https://github.com/gRegorLove/ProcessWire-Webmention/blob/master/Webmention/extras/site/templates/webmention-endpoint.php 

I hope to release 1.1.4 soon along with an official PW3 version.

  • Like 1

Share this post


Link to post
Share on other sites

Version 2.0.0 is finally here and supports ProcessWire 3!

Release post: https://gregorlove.com/2018/05/webmention-for-processwire-update/
Modules directory: https://modules.processwire.com/modules/webmention/

  • Update to support ProcessWire 3.x
  • Update php-mf2 library to version 0.4.x
  • Improve verification of source linking to target
  • Fix delete webmention bug
  • Fix webmention author display in admin
  • Fix WebmentionList render() method

If you're still on ProcessWire 2, you're not forgotten. :] Check the release post for more details.

As usual, if you are using this plugin I would love to hear from you. Feel free to send webmentions to the release post linked above.

  • Like 1

Share this post


Link to post
Share on other sites

Oops, I made a mistake in the directory update! I linked to the PW2 zip file instead of the PW3 zip file.

If you tried to install this on PW3 using the "Add Module From Directory" option between yesterday's announcement and just now, please uninstall and try installing  it fresh. The directory is updated now to point to the correct zip file.

If you're on a PW2 site, the instructions in the release post are still correct.

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 gebeer
      I am happy to present my new fieldtype FieldtypeImageFromPage. It is made up of 2 modules:
      Fieldtype Image Reference From Another Page is a Fieldtype that stores a reference to a single image from another page. The image can be selected with the associated Inputfield.
      Inputfield Select Image From Page is an Inputfield to select a single image from images on a predefined page and it's children.
      And there also is a helper module that takes care of cleanup tasks.
      This module evolved out of a discussion about my other Module FieldtypeImagePicker.  It caters for use cases where a set of images is being reused multiple times across a site. With this fieldtype these images can be administered through a chosen page. All images uploaded to that page will be available in the inputfield.
      When to use ?
      Let editors choose an image from a set of images that is being used site-wide. Ideal for images that are being re-used across the site.
      Suited for images that are used on multiple pages throughout the site (e.g. icons).
      Other than the native ProcessWire images field, the images here are not stored per page. Only references to images on another page are stored. This has several advantages:
      one central place to organize images when images change, you only have to update them in one place. All references will be updated, too. (Provided the name of the image that has changed stays the same) Features
      images can be manipulated like native ProcessWire images (resizing, cropping etc.) image names are fully searchable through the API orphaned references to images that get deleted are automatically removed. When you delete an image from one of the pages that hold your site-wide images, all pages that use this fieldtype will be searched. If any page contains a reference to the image you just deleted, that reference will be reset. You will get warning messages to edit those pages and add new image references there. How to install and setup
      Download and install this module like any other modules in ProcessWire Create a page in the page tree that will hold your images. This page's template must have an images field Upload some images to the page you created in step 2 Create a new field. As type choose 'Image Reference From Another Page'. Save the field. In 'Details' Tab of the field choose the page you created in step 2 Click Save button Choose the images field name for the field that holds your images (on page template from step 2) Click Save button again Add the field to any template You are now ready to use the field View of the inputfield on the page edit screen:

      View of the field settings

      The module can be installed from this github repo. Some more info in the README there, too.
      In my tests it was fairly stable. After receiving your valued feedback, I will eventually add it to the modules directory.
      My ideas for further improvement:
      - add ajax loading of thumbnails
      Happy to hear your feedback!
       
    • By gebeer
      Although the PW backend is really intuitive, ever so often my clients need some assistance. Be it they are not so tech savvy or they are not working in the backend often.
      For those cases it is nice to make some help videos available to editors. This is what this module does.
      ProcessHelpVideos Module
      A Process module to display help videos for the ProcessWire CMS. It can be used to make help videos (screencasts) available to content editors.
      This module adds a 'Help Videos" section to the ProcessWire backend. The help videos are accessible through an automatically created page in the Admin page tree. You can add your help videos as pages in the page tree. The module adds a hidden page to the page tree that acts as parent page for the help video pages. All necessary fields and templates will be installed automatically. If there are already a CKEditor field and/or a file field for mp4 files installed in the system, the module will use those. Otherwise it will create the necessary fields. Also the necessary templates for the parent help videos page and it's children are created on module install. The module installs a permission process-helpvideos. Every user role that should have access to the help video section, needs this permission. I use the help video approach on quite a few production sites. It is stable so far and well received by site owners/editors. Up until now I installed required fields, templates and pages manually and then added the module. Now I added all this logic to the install method of the module and it should be ready to share.
      The module and further description on how to use it is available on github: https://github.com/gebeer/ProcessHelpVideos
      If you like to give it a try, I am happy to receive your comments/suggestions here.
    • By Robin S
      A module created in response to the topic here:
      Page List Select Multiple Quickly
      Modifies PageListSelectMultiple to allow you to select multiple pages without the tree closing every time you select a page.
      The screencast says it all:

       
      https://github.com/Toutouwai/PageListSelectMultipleQuickly
      https://modules.processwire.com/modules/page-list-select-multiple-quickly/
    • By gebeer
      Hello all,
      sharing my new module FieldtypeImagePicker. It provides a configurable input field for choosing any type of image from a predefined folder.
      The need for it came up because a client had a custom SVG icon set and I wanted the editors to be able to choose an icon in the page editor.
      It can also be used to offer a choice of images that are used site-wide without having to upload them to individual pages.
      There are no image manipulation methods like with the native PW image field.
      Module and full description can be found on github https://github.com/gebeer/FieldtypeImagePicker
      Kudos to @Martijn Geerts. I used his module FieldTypeSelectFile as a base to build upon.
      Here's how the input field looks like in the page editor:

      Hope it can be of use to someone.
      If you like to give it a try, I'm happy to hear your comments or suggestions for improvement. Eventually this will go in the module directory soon, too.
    • By bernhard
      @Sergio asked about the pdf creation process in the showcase thread about my 360° feedback/survey tool and so I went ahead and set my little pdf helper module to public.
      Description from PW Weekly:
       
      Modules Directory: https://modules.processwire.com/modules/rock-pdf/
      Download & Docs: https://github.com/BernhardBaumrock/RockPDF
       
      You can combine it easily with RockReplacer: 
      See also a little showcase of the RockPdf module in this thread:
       
×
×
  • Create New...