A (short) list of applications that were very useful to me at one time, but then went away or astray. The question is, could one redo these in a current and useful way?

  • Dopplr: showing simple travel plans (city and dates) to facilitate serendipitous meet-ups outside your regular movements. (went away after being acquired)
  • Delicious: social bookmarking (went astray by dropping/breaking-by-redoing the social functionality, then went away). Have a project on the shelf to redo this for myself, called Linqurator.
  • Skype: p2p voip (went astray by dropping p2p in favor of centralised servers, after acquisition by Microsoft). See this and this posting asking questions about the current p2p voip space.
Posted

Some examples for how people create book lists / shelves on their own sites.

Other things of interest:

  • IndieWeb microformat for ‘read’, which you could aggregate into lists.
  • Bookwyrm, an ActivityPub based federated book club platform. Can be self hosted. Allows creation and curation of ‘shelves’ and lists. It isn’t primarily meant for cataloguing or as a data-source for books, but it does do both of those things to some degree…The application is set up to share book and author data between instances, and get book data from arbitrary outside sources. Right now, the only connector is to OpenLibrary, but other connectors could be written.
  • Open Library of the Internet Archive has list making functionality, as well as book records in json and rdf.

The proof of concept book list I made in opml (also see these additional remarks) currently has the following structure:

It follows the OPML 2 specification
It uses schema.org specifications w.r.t. ‘thing’, ‘creative work’, ‘collection’ and ‘book’ for outline elements and data attributes within them, with a few exceptions.

The file

  • A booklist file is in OPML format, and has a .opml file extension.
  • It opens with declaring it to be XML version 1.0 and utf-8 encoding.
  • It declares an XSL stylesheet, for which the URL is specified, which allows HTML rendering of the file. I think it’s important to package a opml to html parser with the booklist file, so that regardless of data structure, anyone can see what data is contained within it.
  • It declares OPML version 2.0

The HEADER section
In the HEADER section of the OPML file the following fields are used:

  • title: mandatory, the name of this booklist file, or of the owner’s main list of lists if this is a sublist
  • url: mandatory, the url of the booklist file meant in the title
  • dateCreated: date created, optional
  • dateModified: date modified, optional
  • ownerName: mandatory, name of the list owner
  • ownerId: the url of the owner, optional
  • ownerEmail: email address of the owner, optional

the OPML HEADER fields for expansion state, vertical scroll state, and for window location are not used (and ignored by the included XSL parser if present).

The BODY section

The body section contains one or more outline elements, with a number of attributes. Each attribute can exist only once within an outline element.

  • type=”collection” : At least one is needed. A collection is a single booklist. With the following data attributes, which are all strings:
    • text: mandatory, the name of the booklist
    • author: the name of the creator of the booklist, expected
    • url: the URL of the collection, if it has its own URL, optional if the current file outlines books within the collection
    • comment: a brief description of the list, optional
  • type=”book”: A book is always part of a collection. If a collection has its own URL attribute (different from the url of the current file), it does not need to have any book within the file where the collection is listed. If a collection does not have its own URL attribute (or is the current file’s url), it is expected have at least one book (otherwise it’s simply an empty collection). With the following data attributes:
    • text: mandatory, a string “[title of book] by [name of author(s)/editor]
    • name: mandatory, the title of the book
    • author: mandatory, the name of the author(s) or editor of the book
    • isbn: the ISBN number of the book, optional
    • comment: a short comment by the booklist owner about the inclusion of the book in the list, optional
    • url: an url for the book itself, optional
    • authorurl: the url to the website of the book’s author. This attribute is not listed as part of schema.org. Optional
    • referencelisturl: the url of a list by a different owner, where this list’s owner found the book. This attribute is not listed as part of schema.org. Optional.
    • referenceurl: the url of a posting or a person’s url that served as recommendation or motivation for the inclusion of the book in this list by its owner. This attribute is not listed as part of schema.org. Optional.
    • inLanguage: the language in which the book is written as ISO-639(-1/2/3) code, optional
    • category: a list of tags, comma separated, optional
  • type=”rss”: a booklist opml file can point to one or more RSS feeds, optional. Multiple rss-type nodes can be grouped together nested in a typeless outline node with only a text attribute for the name of the group. Not a node within a ‘collection’, not a sub node of a ‘book’. E.g. the book reviews site and feed of someone. These feeds are not booklists or collections but content streams, to which the booklist file owner may want to point. With the following data attributes:
    • text: mandatory, the name of the feed
    • xmlUrl: mandatory, the url of the RSS feed
    • htmlUrl: the url of the website the RSS feed originates from, optional
    • author: the author of the RSS feed, optional. I use it mostly to mark my own feeds in the XSL style sheet, so I can display it differently than feed I myself subscribe to
  • type=”include”: points to an OPML file, preferrably a booklist file, that then should be included at this point in this booklist file. In booklists files only to be used at the top level, not as sub node in a ‘collection’ or ‘book’. Optional, and at this point only foreseen, not implemented. With the following attributes:
    • text: mandatory, descrption or title of the file to be included. This is what is shown in outliners and html renderings.
    • url: mandatory, the link to the opml file to be included, the linked file must be an .opml file.

I started self-hosting my presentation slides in september 2020. The immediate trigger was the sale by LinkedIn of Slideshare to Scribd, and the resulting changes in access and tracking.

I set up two separate WordPress sites to host my slide decks.
tonz.nl which hosts my Dutch language slides
tonz.eu which hosts my English and German language slides.
With my hosting provider I checked if it was ok to host a site whose only purpose is to provide downloads, as nominally it would be against their ToS to provide a download website. My purpose, sharing my own slides was no problem, as the expected traffic is light anyway.

The short domain names, and my ability to create URLs on those domains as I want, allow me to create short easily sharable URLs for my presentations. I announce the URL on my slides during delivery, enabling participants in the audience to immediately access and reshare my presentation file and/or notes, and embed the slide in their own sites.

I use the Speakerstack WP plugin to manage my slides. The workflow is uploading the PDF to my WP media library. The plugin then uses ConvertAPI to convert my slides PDF to a series of images and adds them in an embeddable slider. That slider can be seen full screen.
Next to that I create a page, with the short URL mentioned, in which I embed the slides, add a transcript, links to blog posts and PDF download.

I am now in the process of uploading presentations to the two sites, creating the pages and replacing the original Slideshare embeds with the new self-hosted embeds. It is a pleasing experience to bring slides home.

I am trying to add an additional RSS feed, using a different template, to my blog. Most documentation on WordPress.org seems to be aimed at replacing an existing feed, or alter its contents.

The additional feed is meant to fulfill Peter’s request to have a comments feed that shows only real comments, not all the likes, reposts etc I also receive through WebMentions. It is a very logical request, but I also want to keep the original comments RSS feed that includes all interaction with content on this site. So I need to add a new RSS feed.

WordPress.org doesn’t really contain any complete step-by-step explanations for anything, including for adding customised RSS feeds. It also doesn’t have any info on excluding pingbacks from comment feeds, which would be similar to what I’m trying to do. I tried stuff based on snippets of documentation I did find, but couldn’t put those snippets together into a coherent path to a solution.

Then I found a guide at WPBeginner dot com (WP beginner, that’s me, even though I’ve been a WP user and tinkerer since 2004) It’s from 2016 so maybe not concurrent with today’s version of WP. Following their explanation, I added the following to my child theme’s functions.php:

add_action('init', 'extracommentsRSS');
function extracommentsRSS(){
add_feed('commentsdupe', 'extracommentsrssFunc');
}

function extracommentsrssFunc() {
get_template_part('rss2', 'commentsdupe');
}

The first part adds the new feed to WP, the second function tells it where to look for the template for the feed. That template, named rss2-commentsdupe.php, is located within the child-theme folder.

The URL for the feed now works, however it first prompted a download of an empty file due to the template file having a wrong name. With that name corrected (based on Jan’s comments below), it does load the template correctly.

The template itself still has issues (meaning it doesn’t work as intended at all): the while has_comments() loop provides no results, as it does not get passed any variables. Because the get_template_part is not provided with those variables before getting called. Jan suggested adding the query to the template. Did that, but now struggle to find a way to lift the comments from the query result.

The query below gets the latest 20 approved reactions on my site of the type ‘comment’ (as opposed to e.g. pingback or webmention):

$query = new WP_Comment_Query( array( 'status' => 'approve', 'type' => 'comment', 'number' => 20, 'orderby' => 'commentdate_date' ) );

The result if I print it as arrays, contains 7 elements (the query, the query arguments, default query arguments (?), an empty one, an array with the 20 requested WP comment objects, and two more empty ones).
The query works as intended, but now I do not know how a) to access the 5th element, and b) handle the WP comment objects within it. What seems to be intended functions for it (have_comments(), the_comment()) don’t seem to work.

The below code at least does not work. If I test it like this, it never enters the while loop, so never echoes ‘BOE’

while ( $query->have_comments() ) :
echo 'BOE';
$query->the_comment();
$comment_post = get_post( $comment->comment_post_ID );
$GLOBALS['post'] = $comment_post;
?> etc.

After some more suggestions by Jan Boddez, ao that have_comments() doesn’t work for wp_comment_query, I then established that get_comments to query the comments, and then a foreach to loop through them works the way I need it to.

$query = get_comments( array( 'status' => 'approve', 'type' => 'comment', 'number' => 20, 'orderby' => 'commentdate_date' ) );

foreach ($query as $comment):
$comment_post = get_post( $comment->comment_post_ID );
$GLOBALS['post'] = $comment_post;

Once I had that the original feed template could be fully re-used, and now validates:

[Valid RSS]

  • I use Category to Pages WUD plugin, but the author pulled that plugin.
  • I want to have a similar set-up on my local WP install, and my public one.
  • So that I can use WP pages as my personal wiki, and push parts of that into public pages on my site
  • Now trying to figure out how the current plugin works and stores categories. Jan Boddez has kindly provided some information in the comments to my blogpost on this.

Things I found out:

  • I use separate categories for my pages
  • If I deactivate the plugin those categories are no longer visible and not shown on my pages
  • If I reactivate the plugin they are back, so deleting the plugin does not delete the data (as was expected)
  • The database structure is not yet clear to me, but will find out using this image
  • Question is what is the difference in representation between a category for a post and a page
  • All links have the same structure http://blog/categories/mygreatpagecategory. However if you deactivate the plugin that goes to the front page. Reactivating the plugin brings the correct result again.
  • In my test set-up also will test what happens if I use the same categories as for postings, (or seperately named but commonly used) That might make the plugin superfluous as a whole
Posted