Wer seine Website pflegt, hält bestehende Artikel aktuell und überarbeitet sie von Zeit zu Zeit. Warum also nicht den überarbeiteten Artikel wieder auf die erste Seite hochziehen und so neue Leser darauf aufmerksam machen.
Leider bekommen davon eure Feed-Abonnenten z.B. über Feedly, Feedbin… wahrscheinlich nichts mit, weil sich der Globally Unique Identifier, kurz GUID, nicht ändert:
<guid isPermaLink="false">https://go-around.de/?p=331</guid>
Code-Sprache: HTML, XML (xml)
WordPress verwendet dafür standardmäßig die Post ID und diese ändert sich nie. Feedaggregate wie Feedly überprüfen in ihrer Datenbank, ob die GUID schon vorhanden ist und zeigen den Lesern nur neue Artikel an. So verhindert Feedly zwar Spam, für die Leser kann es aber auch von Nachteil sein.
Da wir bei Travel-Dealz bevorzugt bestehenden Content recyceln und aktuell halten, ändere ich mithilfe eines kleinen Snippet die GUID bei einem signifikanten Update und der Artikel wird noch einmal von Feedly & co aufgenommen.
Das komplette Snippet findet ihr als Gist auf Github:
Ihr könnt es einfach in euer /wp-content/plugins/
Verzeichnis schieben und als Plugin nutzen.
So funktioniert’s
Als Ersatz nehme ich die aktuelle ID der letzten Revision. Allerdings nur, wenn das Post Date signifikant (um mehr als 24 Stunden) geändert worden ist.
Dafür müssen wir bei jedem Update eines Posts über die post_updated
Action überprüfen, ob sich das Datum geändert hat und anschließend die ID der letzten Revision in den Post Meta speichern.
function check_post_update( $post_id, $post_after, $post_before ) {
$timestamp_before = strtotime( $post_before->post_date );
$timestamp_after = strtotime( $post_after->post_date );
// Check if Post Date changed
if ( $timestamp_before >= $timestamp_after ) {
return;
}
// Check is Post Status is publish and if the Post Date changed significant
if ( 'publish' === $post_after->post_status && 60*60*24 < $timestamp_after - $timestamp_before ) {
// Find lates Revision
if ( $latest_revision = array_shift( wp_get_post_revisions( $post_id ) ) ) {
// Update _last_update_id to the latest revision ID
update_post_meta( $post_id, '_last_update_id', $latest_revision->ID );
}
}
}
add_action( 'post_updated', __NAMESPACE__ . '\check_post_update', 10, 3 );
Code-Sprache: PHP (php)
Anschließend ändern wir die GUID, indem wir den the_guid
Filter nutzen. Dabei überprüfen wir zuerst, ob der aktuelle Query für einen Feed ist und ob für den aktuellen Artikel eine _last_update_id
vorliegt. Wenn das der Fall ist, ergänzen wir die GUID um die vorher gespeicherte ID der Revision:
function feed_guid( $guid, $id ) {
// Check if current query is for a feed
if( ! is_feed() ) {
return $guid;
}
// Get the last id
if ( $last_id = get_metadata( 'post', $id, '_last_update_id', true ) ) {
// Add the last id
$guid .= '#' . (int) $last_id;
}
return $guid;
}
add_filter( 'the_guid', __NAMESPACE__ . '\feed_guid', 10, 2 );
Code-Sprache: PHP (php)
Das Ergebnis sieht im Feed so aus:
<guid isPermaLink="false">https://go-around.de/?p=331#845</guid>
Code-Sprache: HTML, XML (xml)
Ich habe die ID der Revision durch ein #
abgetrennt, damit der GUID Link weiterhin zum Beitrag führt und ein Hashtag hat i.d.R. keinen Einfluss auf den Cache, im Gegensatz zu einem zusätzlichen Parameter, z. B. ?p=331&revision=845
.
Fazit
Anschließend bekommen auch eure Feed-Leser die Updates eurer Artikel mit. Bitte spammt eure Leser aber nicht zu und ändert alle 24 Stunden die GUID. Pusht einen Artikel nur, wenn ihr ihn auch signifikant geändert habt.
Titelbild: Bild von Hin und wieder gibts mal was.
Interessanter Ansatz, dies über das Datum zu automatisieren. Aber die Mühe mit dem Link würd eich mir nicht machen. Die GUID ist ja nur historisch so gewachsen. Der Link wird nicht (bzw. sollte nicht!) als Link irgendwo benutzt werden.
Siehe:
https://deliciousbrains.com/wordpress-post-guids-sometimes-update/
oder
https://developer.wordpress.org/reference/functions/the_guid/
Das Konstrukt sieht aber nicht vor, etwas zu ändern ohne die GUID zu ändern, oder? Wäre ein simpler Button, der die GUID ändert nicht flexibler und auch nicht wesentlich komplizierter für einen Redakteur?
Die GUID ändert sich ja nur, wenn man das Veröffentlichungsdatum ändert. Alles andere kann man beliebig ändern ohne das sich die GUID ändert.
Bis ich den Artikel geschrieben habe, haben ich sogar die ID durch die neue immer ersetzt. Mir ist das nur im schreiben dieses Artikels aufgefallen. So würde man auf einer 404 Seite landen. Das wollte ich vermeiden.
Dieser Artikel wurde erwähnt auf gist.github.com
I added it to the functions.php.
I changed an old post publish date to „today“.
The post is now in the top, on the first page. Unfortnately, feedly and other RSS feed websites didn’t see it as a new post.
Is the function perhaps out of date? If so, can you please look into it. That would be great.
There are other plugins out there, but yours looks very minimal and I love that.
Did you check your RSS feed if the _last_update_id is present?
I just checked and I can see that it’s not present. So something went wrong.
I really added the function and did the steps as explained.
If you remove the function. Should the last updated ID stay? I guess it should. Just asking to double-check because I removed the snippet as it didn’t work.
I can try on my local machine with default theme and without plugins. Perhaps something is breaking the function from working.
Is there a way that I can see the rss feed on localhost? Because right now I am using a site to fetch the rss feed to check the ID. But with localhost, I can’t add the site to lookup the rss feed.
If you remove the function, the _last_update_id will be removed, too.
You can open the feed on any machine, e.g. localhost:80/feed
I still use the same function on Travel-Dealz.de and it works well. Try to remove the __NAMESPACE__ from the add_action and add_filter function, and rename the functions to mytheme_check_post_update and mytheme_feed_guid.
add_action( 'post_updated', 'mytheme_check_post_update', 10, 3 );
add_filter( 'the_guid', 'mytheme_feed_guid', 10, 2 );
Perhaps that is the issue.
Otherwise, send me your functions.php via Email.