Tanelorn.net
Medien & Phantastik => Multimedia => Multimedia - Software & Betriebsysteme => Thema gestartet von: Blechpirat am 15.02.2023 | 19:58
-
Moin.
Ich versuche gerade automatisch auf Mastodon einen Hinweis zu posten, wenn rsp-blogs.de einen neuen Beitrag veröffentlicht.
Das klappt auch soweit - ich nutze dazu ein Plugin namens Share on Mastodon, denn rsp-blogs.de basiert auf Wordpress.
Im Default-Zustand erzeugt es Beiträge im Format
Titel
Link
Beispiel: https://social.karsten-voigt.de/@rspblogs/109864459059950800
Der Verfasser des Blogs hat ein paar hilfreiche Anmerkungen gemacht, wie man das ändern kann: https://jan.boddez.net/wordpress/share-on-mastodon
Ich habe deshalb in meine functions.php folgendes aufgenommen:
add_filter( 'share_on_mastodon_enabled', '__return_true' );
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$status = wp_strip_all_tags( $post->post_content );
$status .= "\n\n" . get_permalink( $post );
return $status;
}, 10, 2 );
Jetzt klappt das insoweit, dass alle Beiträge bis 500 Zeichen auch auf Mastodon zu sehen sind. Beispiel: https://social.karsten-voigt.de/@rspblogs/109867222715399402
Was ich also brauche, ist eine Begrenzung der Zeichenzahl des Textes, der zu Mastodon gesendet wird. Kann mir da jemand helfen?
-
Grundsätzlich müsstest Du vermutlich irgendwo eine Substring-Funktion einbauen (Link zur Doku (https://www.php.net/manual/en/function.substr.php)). Allerdings ist mir anhand des gezeigten Codes nicht ganz klar, wo eigentlich der Aufruf der Mastodon-API passiert, insofern kann ich jetzt nicht sicher sagen, wo genau das wäre.
-
Ich würde denken, dass der Inhalt von $status der Text ist, der hinterher bei Mastodon auftauchen soll. Dann wäre irgendwo hier
$status = wp_strip_all_tags( $post->post_content );
die Zeichenbegrenzung einzuziehen - oder denke ich zu einfach?
-
Könnte tatsächlich funktionieren. Ich hatte beim ersten Lesen gedacht, $status wäre tatsächlich ein Status, aber das scheint tatsächlich der Text zu sein. Insofern könnte es reichen, da den substr drum zu basteln.
Ggf. musst Du noch schauen, ob Du die Länge des Permalinks bei der maximalen Zeichenzahl berücksichtigen musst (dann brauchst Du noch strlen (https://www.php.net/manual/en/function.strlen.php)). Falls nicht, kannst Du wahrscheinlich einfach hart auf 500 Zeichen (bzw. 497 Zeichen plus drei Punkte) kürzen.
-
Könnte tatsächlich funktionieren. Ich hatte beim ersten Lesen gedacht, $status wäre tatsächlich ein Status, aber das scheint tatsächlich der Text zu sein. Insofern könnte es reichen, da den substr drum zu basteln.
Ggf. musst Du noch schauen, ob Du die Länge des Permalinks bei der maximalen Zeichenzahl berücksichtigen musst (dann brauchst Du noch strlen (https://www.php.net/manual/en/function.strlen.php)). Falls nicht, kannst Du wahrscheinlich einfach hart auf 500 Zeichen (bzw. 497 Zeichen plus drei Punkte) kürzen.
Sehr schön. Und jetzt kommt der Teil, den ich halt nicht kann... jemand müsste das in PHP für mich ausdrücken.
-
Ist 15 Jahre her, dass ich das letzte Mal PHP verwendet habe, aber hier mal ein Versuch:
add_filter( 'share_on_mastodon_enabled', '__return_true' );
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$status_text = wp_strip_all_tags( $post->post_content );
$status_link = get_permalink( $post );
if (strlen($status_text) + strlen($status_link) > 498) {
$status_text = substr($status_text,0,495 - strlen($status_link)) . "...";
}
$status = $status_text . "\n\n" . $status_link;
return $status;
}, 10, 2 );
-
Danke! Ich werde das mal probieren!
-
Diese Filter-Struktur ist ein Feature von Wordpress und eine der üblichen Weisen, wie man in Wordpress in den Programmablauf eingreift (Hat also erstmal nichts mit Basis-PHP und auch nichts mit Mastodon zu tun).
Allerdings ist mir anhand des gezeigten Codes nicht ganz klar, wo eigentlich der Aufruf der Mastodon-API passiert, insofern kann ich jetzt nicht sicher sagen, wo genau das wäre.
Irgendwo im Mastodo-Plugin gibt es einen Aufruf $enabled = apply_filters('share_on_mastodon_enabled, $enabled) bzw. $status = apply_filters( 'share_on_mastodon_status', $status, $post).
Die Variablen-Namen könnten auch anders heißen, aber diese sind recht wahrscheinlich. Das heißt, dass jeder Aufruf von add_filter abgehandelt wird, bevor die Variable weiter verarbeitet wird.
Es können sich also beliebig viele Filter hier einklinken und den Inhalt verändern, auch nacheinander. Die Reihenfolge bestimmt sich aus dem zweiten Parameter nach der Funktion, in diesem Fall also 10. Der 2er zeigt an, wie viele Attribute übergeben werden (2, also $status und $post), wobei das erste Attribut immer das ist, das verändert wird und weitere Zusatzinformation darstellen.
$post->post_content ist auch eine Sache von Wordpress und ist der zentrale Inhalt einer Seite bzw. eines Beitrags
wp_strip_all_tags schmeißt alle HTML-Styles und Scripts raus und macht aus dem Inhalt normalen Text. Also ja, $status ist der Inhalt, nachdem er bereinigt wurde.
Die Variablennamen wählst außerdem du, d.h. wenn du dich damit wohler fühlst, kannst du statt $status auch überall $text o.Ä. schreiben, es muss nur im Funktionsaufruf und im Verarbeitungscode der selbe sein.
$status .= "\n\n" . get_permalink( $post ); fügt dann noch Link zum Beitrag hinten an den den Text an. get_permalink holt den Link zu $post und . ist die normale String-Zusammenfügung in PHP.
Schneelands Code-Anpassung sollte korrekt sein. Ich nehme an die Anpassung auf 498 erfolgt zur Einbeziehung der beiden Zeilenumbrüche (\n)?
-
Vielen Dank!
Mir ist dabei aufgefallen, dass vor der Änderung ja der Titel übergeben wurde - jetzt nicht mehr. Kann ich das anders machen?
-
Ich nehme an die Anpassung auf 498 erfolgt zur Einbeziehung der beiden Zeilenumbrüche (\n)?
Ja genau. Ich bin mir nicht sicher, wie hart Mastodon sein Zeichenlimit durchsetzt - insofern sollte das sicherstellen, dass nicht von der URL was abgeschnitten wird.
(ansonsten vielen Dank für die Filter-Erläuterung - den Wordpress-Code habe ich mir nie genau angeschaut)
Mir ist dabei aufgefallen, dass vor der Änderung ja der Titel übergeben wurde - jetzt nicht mehr. Kann ich das anders machen?
Möglicherweise passiert das irgendwo anders im Code. Das ist leider schwer zu sagen, ohne das eigentliche Plugin zu kennen.
-
Möglicherweise passiert das irgendwo anders im Code. Das ist leider schwer zu sagen, ohne das eigentliche Plugin zu kennen.
vermutlich gibt es noch ein get_title() :D
Edit: Fast! get_the_title - https://developer.wordpress.org/reference/functions/get_the_title/
-
So?
add_filter( 'share_on_mastodon_enabled', '__return_true' );
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$status_title = get_the_title ( $post );
$status_text = wp_strip_all_tags( $post->post_content );
$status_link = get_permalink( $post );
if (strlen( $status_title ) + strlen($status_text) + strlen($status_link) > 398) {
$status_text = substr($status_text,0,395 - strlen($status_link)) . "...";
}
$status = $status_title . "\n\n" . $status_text . "\n\n" . $status_link;
return $status;
}, 10, 2 );
-
Ich würde die 3 Bausteine einzeln betrachten.
Den Link willst Du ja immer posten.
Hat der immer eine feste Länge? Dann kannst Du die von den 500 abziehen.
Wenn nicht, dann musst Du die Länge des Links ermitteln (+ ein Leerzeichen) und die von 500 abziehen.
Das ist dann der "Rest", der Dir für Titel + Text bleibt.
Die checkst Du auf den "Rest" und wenn sie länger sind, kürzt Du sie auf "Rest"-3 und fügst "..." hinzu.
-
Scath hat recht.
Das müsste funktionieren:
add_filter( 'share_on_mastodon_enabled', '__return_true' );
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$text = wp_strip_all_tags( $post->post_content );
$link = get_permalink( $post );
$text = substr($text,0, 493 - strlen($post->post_title) - strlen ($link)); //500 - 4 line breaks, 3 dots
return $post->post_title . "\n\n" . $text . "...\n\n" . $link;
}, 10, 2 );
Willst du den Titel noch fett haben oder als h?
-
Du bist super, vielen Dank!
Willst du den Titel noch fett haben oder als h?
Lass mich erstmal sehen, wie es aussieht.
Aber derweil können wir vielleicht einen Blick auf https://social.karsten-voigt.de/@rspblogs/109875360634920931 werfen. Irgendwas ist da noch drin, was ziemlich komische Formatierungen hervorruft.
Der Originalbeitrag: http://pen-and-pinsel.de/handwerkliches.html#a1471
Auf Mastodon: https://social.karsten-voigt.de/@rspblogs/109875360634920931
Auf rsp-blogs.de sieht es ganz normal aus, da scheint es schon einen Filter zu geben.
-
Evtl. musst Du es a) doch mal mit get_the_title() bzw. the_title_attribute() versuchen - letzteres scheint eventuelle HTML-Tags im Titel rauszuwerfen (siehe https://developer.wordpress.org/reference/functions/get_the_title/ (https://developer.wordpress.org/reference/functions/get_the_title/)).
add_filter( 'share_on_mastodon_enabled', '__return_true' );
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$text = wp_strip_all_tags( $post->post_content );
$link = get_permalink( $post );
$title = the_title_attribute ( $post );
$text = substr($text,0, 493 - strlen($title) - strlen ($link)); //500 - 4 line breaks, 3 dots
return $post->post_title . "\n\n" . $text . "...\n\n" . $link;
}, 10, 2 );
-
Zwischen get_the_title und $post->post_title sollte eigentlich kein Unterschied sein, wenn keine weiteren Filter im Spiel sind (Was aber natürlich je nach Plugins und Theme der Seite nicht auszuschließen ist).
the_title_attribute könnte evtl. funktionieren. Ich vermute aber eher, dass sich da noch ein weiterer Filter reinhängt, weil irgendwoher nimmt er auch noch Datum, Autor und mehrere br mit in den Mastodon-Titel und die sollten eigentlich nicht Teil des Wordpress-Post-Titels sein.
Versuch mal die Filter-Priorität zu erhöhen, z.B. von 10 auf 100.
-
Wir haben jetzt einen Beitrag gezogen: https://social.karsten-voigt.de/@rspblogs/109876941245970007
Das ist schon recht fein so!
Allerdings scheint bei der Verwendung von Sonderzeichen (hier Anführungszeichen unten) noch ein Fehler zu sein.
Zum Title... Da ist noch Luft drin. Denn irgendwie wird der "ursprüngliche" Titel weitergegeben - nicht der auf der Website angezeigte. Denn dort wird noch ein "$NamedesBlogs: " davorgesetzt.
-
deutsche Sonderzeichen scheinen sonst zu funktionieren.
-
Allerdings scheint bei der Verwendung von Sonderzeichen (hier Anführungszeichen unten) noch ein Fehler zu sein.
Vermutlich waren Anführungsstriche die im ursprünglichen Beitrag html-escaped. Das heißt, du müsstest html rück-escapen. Ich bin mir nicht sicher, ob php dafür eine Funktion hat.
Ich würde auch vorschlagen, noch ein
. " #pnpde"
mit einzufügen. Müsste der Text ggf. noch um 7 weitere Zeichen gekürzt werden.
-
htmlentities konvertiert Sonderzeichen in HTML.
html_entity_decode macht das umgekehrte.
-
Sehr wahrscheinlich muss man substr und strlen durch die "mutltibyte"-Funktionen mb_substr bzw. mb_strlen ersetzen, sonst gibt es noch andere falsche Resultate bei Sonderzeichen. (https://www.php.net/manual/de/intro.mbstring.php)
$text = html_entity_decode($text);
// dasselbe für $title und link?
$text = mb_substr($text, 0, 500 - 4 - 3 - mb_strlen($title) - mb_strlen ($link)); // 500 - 4 line breaks, 3 dots
-
Jetzt sieht es so aus:
// Always share supported Post Types.
add_filter( 'share_on_mastodon_enabled', '__return_true' );
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$text = wp_strip_all_tags( $post->post_content );
$text = html_entity_decode($text);
$link = get_permalink( $post );
$text = mb_substr($text,0, 480 - mb_strlen($post->post_title) - mb_strlen ($link)); //500 - 4 line breaks, 3 dots - 9 für Hashtags
return $post->post_title . "\n\n" . $text . "...\n\n" . $link . "\n\n #pnpde";
}, 10, 2 );
Versuch mal die Filter-Priorität zu erhöhen, z.B. von 10 auf 100.
Versuche ich dann nach dem Test von dieser Iteration.
Edit: Letzter Post vor der Änderung: https://social.karsten-voigt.de/@rspblogs/109885578998970094
-
Notiz: https://fwpplugin.com/wiki/syndicated_item_title könnte den Titel mit Herkunft enthalten.
-
$text = html_entity_decode($text);
// dasselbe für $title und link?
$text = mb_substr($text, 0, 500 - 4 - 3 - mb_strlen($title) - mb_strlen ($link)); // 500 - 4 line breaks, 3 dots
Also ganz offenbar für den Titel dann auch: https://social.karsten-voigt.de/@rspblogs/109891309732689248
-
Beim Link wirst Du's m.E. nicht brauchen, aber ja, der Titel möchte dann anscheinend auch dekodiert werden.
-
Ich habe das jetzt mal so gefasst - wird das funktionieren?
// Always share supported Post Types.
add_filter( 'share_on_mastodon_enabled', '__return_true' );
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$title= html_entity_decode($post->post_title);
$text = wp_strip_all_tags( $post->post_content );
$text = html_entity_decode($text);
$link = get_permalink( $post );
$text = mb_substr($text,0, 480 - mb_strlen($post->post_title) - mb_strlen ($link)); //500 - 4 line breaks, 3 dots - 9 für Hashtags
return $title . "\n\n" . $text . "...\n\n" . $link . "\n\n #pnpde";
}, 10, 2 );
-
Im Prinzip ja, aber beim Längencheck m.E. besser auch den dekodierten Titel verwenden:
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$title= html_entity_decode($post->post_title);
$text = wp_strip_all_tags( $post->post_content );
$text = html_entity_decode($text);
$link = get_permalink( $post );
$text = mb_substr($text,0, 484 - mb_strlen($title) - mb_strlen ($link)); //500 - 6 line breaks, 3 dots, 1 space, 6 for hashtag
return $title . "\n\n" . $text . "...\n\n" . $link . "\n\n #pnpde";
}, 10, 2 );
(ich hab' außerdem mal den Kommentar angepasst und die Maximallänge auf 484 korrigiert)
-
Arg!
Ein "I'm" zieht dann doch einen Fehler. Okay, englische Beiträge sollte eh nicht sein, aber:
https://social.karsten-voigt.de/@rspblogs/109903211946640035
Was ist da schief gegangen?
-
Es scheint als bräuchtest Du einen zusätzlichen Parameter für html_entity_decode (siehe Stackoverflow (https://stackoverflow.com/questions/3574609/php-html-decoding-help-converting-a-039quote039-is-bbold-b)).
Probier' mal html_entity_decode($var, ENT_QUOTES) statt html_entity_decode($var), sprich:
add_filter( 'share_on_mastodon_status', function( $status, $post ) {
$title= html_entity_decode($post->post_title, ENT_QUOTES);
$text = wp_strip_all_tags( $post->post_content );
$text = html_entity_decode($text, ENT_QUOTES);
$link = get_permalink( $post );
$text = mb_substr($text,0, 484 - mb_strlen($title) - mb_strlen ($link)); //500 - 6 line breaks, 3 dots, 1 space, 6 for hashtag
return $title . "\n\n" . $text . "...\n\n" . $link . "\n\n #pnpde";
}, 10, 2 );
-
Danke, probieren wir es mal!