Jump to content

Module: Webmention


gRegor
 Share

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

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

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

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

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

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

  • 6 months later...

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

  • 1 month later...

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

  • 7 months later...

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.

Link to comment
Share on other sites

  • 3 months later...

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

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

  • 2 months later...

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

  • 11 months later...

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

Link to comment
Share on other sites

  • 2 years later...
  • 5 months later...

I just installed all the Webmention modules (version 2.0.0) on ProcessWire 3.0.164. It looks like everything is installed well. I created the field for webmentions and added it to the template.

It returns this error message in Modules.php on line 3420:

Exception has occurred.
ReflectionException: Class\ProcessWire\FieldtypeWebmentions does not exist

The template returns this:

Fatal error: Uncaught Error: Call to a member function render() on null in /var/www/.../processwire/site/templates/micropost.php on line 25

My template looks like this:

<?php namespace ProcessWire; ?>
...
<?= $page->body ?>
...
<?= $page->Webmentions->render(); ?>

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
 Share

×
×
  • Create New...