Autor Thema: PHP-Hilfe?  (Gelesen 2481 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
PHP-Hilfe?
« 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?




Online schneeland

  • Moderator
  • Titan
  • *****
  • Cogito ergo possum
  • Beiträge: 12.646
  • Username: schneeland
Re: PHP-Hilfe?
« Antwort #1 am: 15.02.2023 | 20:06 »
Grundsätzlich müsstest Du vermutlich irgendwo eine Substring-Funktion einbauen (Link zur Doku). 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.
Brothers of the mine rejoice!
Swing, swing, swing with me
Raise your pick and raise your voice!
Sing, sing, sing with me

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #2 am: 15.02.2023 | 20:12 »
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?
« Letzte Änderung: 15.02.2023 | 20:15 von Blechpirat »

Online schneeland

  • Moderator
  • Titan
  • *****
  • Cogito ergo possum
  • Beiträge: 12.646
  • Username: schneeland
Re: PHP-Hilfe?
« Antwort #3 am: 15.02.2023 | 20:20 »
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). Falls nicht, kannst Du wahrscheinlich einfach hart auf 500 Zeichen (bzw. 497 Zeichen plus drei Punkte) kürzen.
Brothers of the mine rejoice!
Swing, swing, swing with me
Raise your pick and raise your voice!
Sing, sing, sing with me

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #4 am: 15.02.2023 | 20:49 »
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). 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.

Online schneeland

  • Moderator
  • Titan
  • *****
  • Cogito ergo possum
  • Beiträge: 12.646
  • Username: schneeland
Re: PHP-Hilfe?
« Antwort #5 am: 15.02.2023 | 21:06 »
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 );

Brothers of the mine rejoice!
Swing, swing, swing with me
Raise your pick and raise your voice!
Sing, sing, sing with me

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #6 am: 15.02.2023 | 21:09 »
Danke! Ich werde das mal probieren!

Offline aikar

  • Legend
  • *******
  • Beiträge: 6.848
  • Username: aikar
Re: PHP-Hilfe?
« Antwort #7 am: 16.02.2023 | 06:56 »
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)?


Für Fans von Aventurien, denen DSA zu komplex ist: Aventurien 5e: https://aventurien5e-fanconversion.de/

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #8 am: 16.02.2023 | 08:49 »
Vielen Dank!

Mir ist dabei aufgefallen, dass vor der Änderung ja der Titel übergeben wurde - jetzt nicht mehr. Kann ich das anders machen?

Online schneeland

  • Moderator
  • Titan
  • *****
  • Cogito ergo possum
  • Beiträge: 12.646
  • Username: schneeland
Re: PHP-Hilfe?
« Antwort #9 am: 16.02.2023 | 09:07 »
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.
Brothers of the mine rejoice!
Swing, swing, swing with me
Raise your pick and raise your voice!
Sing, sing, sing with me

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #10 am: 16.02.2023 | 11:58 »
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/

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #11 am: 16.02.2023 | 12:06 »
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 );

Offline Scath

  • Experienced
  • ***
  • Palim Palim
  • Beiträge: 441
  • Geschlecht: Männlich
  • Username: Scath
    • My Life 2.0
Re: PHP-Hilfe?
« Antwort #12 am: 16.02.2023 | 17:33 »
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.
Tharanor ist am 05.10.2024 gestartet!
Ein rundenbasiertes High-Fantasy Browsergame.
Du kontrollierst Dein eigenes Reich und wählst welche diplomatischen, wirtschaftlichen, militärischen oder anderweitigen Ziele Du verfolgst.
Es bleibt Dir selbst überlassen, ob Du eher mit dem Schwert agierst oder mit der Feder.
Ein „ewiges Spiel“: Reiche werden gegründet, gedeihen, wandeln sich und bleiben bestehen oder vergehen womöglich auch wieder.
Mehr Infos: https://www.tharanor.de

Offline aikar

  • Legend
  • *******
  • Beiträge: 6.848
  • Username: aikar
Re: PHP-Hilfe?
« Antwort #13 am: 16.02.2023 | 18:02 »
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?
« Letzte Änderung: 16.02.2023 | 18:05 von aikar »
Für Fans von Aventurien, denen DSA zu komplex ist: Aventurien 5e: https://aventurien5e-fanconversion.de/

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #14 am: 16.02.2023 | 19:16 »
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.

Online schneeland

  • Moderator
  • Titan
  • *****
  • Cogito ergo possum
  • Beiträge: 12.646
  • Username: schneeland
Re: PHP-Hilfe?
« Antwort #15 am: 16.02.2023 | 19:32 »
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/).

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 );
Brothers of the mine rejoice!
Swing, swing, swing with me
Raise your pick and raise your voice!
Sing, sing, sing with me

Offline aikar

  • Legend
  • *******
  • Beiträge: 6.848
  • Username: aikar
Re: PHP-Hilfe?
« Antwort #16 am: 16.02.2023 | 21:04 »
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.
« Letzte Änderung: 16.02.2023 | 21:06 von aikar »
Für Fans von Aventurien, denen DSA zu komplex ist: Aventurien 5e: https://aventurien5e-fanconversion.de/

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #17 am: 17.02.2023 | 08:48 »
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.

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #18 am: 17.02.2023 | 10:09 »
deutsche Sonderzeichen scheinen sonst zu funktionieren.

Offline 1of3

  • Richtiges Mädchen!
  • Titan
  • *********
  • Proactive Scavenger
  • Beiträge: 19.142
  • Username: 1of3
    • Sea Cucumbers and RPGs
Re: PHP-Hilfe?
« Antwort #19 am: 17.02.2023 | 17:10 »
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.

Offline aikar

  • Legend
  • *******
  • Beiträge: 6.848
  • Username: aikar
Re: PHP-Hilfe?
« Antwort #20 am: 17.02.2023 | 18:27 »
htmlentities konvertiert Sonderzeichen in HTML.
html_entity_decode macht das umgekehrte.
Für Fans von Aventurien, denen DSA zu komplex ist: Aventurien 5e: https://aventurien5e-fanconversion.de/

Offline Wonko

  • Experienced
  • ***
  • Beiträge: 304
  • Username: Wonko
Re: PHP-Hilfe?
« Antwort #21 am: 17.02.2023 | 19:32 »
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

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #22 am: 18.02.2023 | 13:51 »
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

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #23 am: 18.02.2023 | 14:00 »
Notiz: https://fwpplugin.com/wiki/syndicated_item_title könnte den Titel mit Herkunft enthalten.

Offline Blechpirat

  • Administrator
  • Titan
  • *****
  • Beiträge: 13.706
  • Username: Karsten
    • Richtig Spielleiten!
Re: PHP-Hilfe?
« Antwort #24 am: 19.02.2023 | 13:08 »
$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