Ich versuche, die Anzahl der Wörter zu reduzieren, die in „Discours“ angezeigt werden, wenn ich einen Artikel in WordPress veröffentliche. Aber stattdessen sehe ich kein einziges Wort ![]()
Verwenden Sie den Block-Editor oder den alten klassischen Editor, um den Beitrag zu veröffentlichen?
Können Sie einen Link zu dem Beitrag teilen? Das könnte Hinweise darauf geben, was schief läuft.
Was passiert, wenn Sie versuchen, dem Beitrag manuell eine Zusammenfassung hinzuzufügen:
Vielen Dank für Ihre Antwort. Wir verwenden immer noch den klassischen Editor.
Es passiert uns derzeit bei allen Artikeln, aber hier sind die Links:
- Quellartikel in WordPress Fotky Google dostanou praktickou vychytávku. Oceníte ji?
- der Zielbeitrag in Discourse Do aplikace Fotky Google se chystá praktická funkce. Usnadní procházení fotografií - Komentáře ke článkům - Komunita Svět Androida
Ich weiß nicht, ob ich vollständig verstehe, wie man einen Auszug manuell hinzufügt.
Wir verwenden “Auszug” für Beiträge in WordPress seit einigen Jahren nicht mehr, ich habe es nicht sofort verstanden.
Aber es scheint, dass alles funktioniert, wenn ich “manuell” in WordPress ausfülle.
Gibt es eine Lösung, um die ersten X Wörter an Discourse zu senden, ohne “Auszug” manuell ausfüllen zu müssen?
Das ist sinnvoll. Die Logik, die verwendet wird, um den Auszug zu erstellen, ist anders, wenn der Auszug manuell erstellt wird, als wenn das WP Discourse-Plugin den Auszug aus dem Inhalt des Beitrags parst.
Es sollte jetzt funktionieren, aber es kann einen Konflikt auf Ihrer Website zwischen dem Discourse-Plugin und einem anderen Plugin geben, das Sie auf der Website installiert haben. Eine weitere Möglichkeit ist, dass Sie Shortcodes in dem Beitrag verwenden, die nicht korrekt geparst werden, wenn das Discourse-Plugin versucht, den Auszug zu erstellen.
Verwenden Sie Shortcodes in Ihren Beiträgen?
Zu meiner eigenen Information scheint das Problem hier zu liegen: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub. Ich gehe davon aus, dass etwas im Zusammenhang mit dem Aufruf von $excerpt = apply_filters( 'the_content', $raw ); schief geht.
Ja, wir verwenden Shortcodes. Ich werde versuchen, sie vorübergehend zu deaktivieren und zu sehen, was passiert. Danke für die Anleitung. Ich werde Sie wissen lassen, was wir herausfinden.
Wenn ich die meisten Plugins auf der Website deaktiviere, scheint alles korrekt zu funktionieren. Danke für die Hinweise. Ich werde nach dem problematischen Plugin suchen ![]()
Ein paar Stunden später :). Ich habe den Schuldigen bereits gefunden, macht das Plugin Lnk.Bio – Plugin WordPressu | WordPress.org Česko es, irgendwelche Ideen, wie man es beheben kann?
Das LnkBio-Plugin hat eine Funktion, die sich in die 'wp_insert_post'-Aktion einklinkt. Diese Funktion ruft unset($post->post_content) für das WordPress $post-Objekt auf. Theoretisch sollte dies das post_content-Attribut des Beitrags außerhalb der LnkBio-Funktion nicht aufheben, aber wenn ich dies lokal teste (indem ich die API-Aufrufe des LnkBio-Plugins simuliere), hebt der Aufruf von unset($post->post_content) den Beitragsinhalt für das WP Discourse-Plugin hier auf: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub.
Dies geschieht nur, wenn Beiträge mit dem Classic Editor veröffentlicht werden. Wenn Beiträge mit dem Block Editor veröffentlicht werden, ist der Beitragsinhalt für das WP Discourse-Plugin verfügbar. Ich gehe davon aus, dass dies daran liegt, dass Beiträge, die mit dem Block Editor veröffentlicht werden, über eine REST-Anfrage veröffentlicht werden.
Beachten Sie, dass ich auf das Problem stoße, dass keine Inhalte in Discourse veröffentlicht werden, sowohl wenn ich eine benutzerdefinierte Auszugslänge festlege als auch wenn ich die Option „Vollständigen Beitragstext verwenden“ von WP Discourse auswähle.
Die einfachste Lösung wäre, auf den Block Editor umzusteigen.
Eine weitere Möglichkeit wäre, LnkBio zu kontaktieren und ihnen von dem Problem zu erzählen. Sie könnten dies beheben, indem sie eine sicherere Methode zum Parsen des Beitragsinhalts für ihre API-Anfrage finden:
function lnkbio_api_sync($post_id, $post, $update) {
unset($post->post_content);
if ($post->post_status === 'publish') {
if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
return;
}
// url wird für Tests ohne LnkBio-Konto auf `example.com` gesetzt
wp_remote_post(
'http://example.com',
[
'blocking' => false,
'body' => [
'ACTION' => 'WP_sync',
'post_id' => $post_id,
'post' => json_encode($post),
'id' => get_option('lnkbio_id'),
'secret' => get_option('lnkbio_secret'),
'permalink' => get_permalink($post),
'is_pub' => true,
'image' => get_the_post_thumbnail_url($post_id, 'full'),
'group_id' => get_option('lnkbio_group'),
]
]
);
}
}
Bearbeiten: Sie könnten auch einfach den Code des LnkBio-Plugins bearbeiten, um den Aufruf von unset($post->post_content); zu entfernen und dann einen Weg zu finden, die entsprechenden Werte für das hier verwendete $post-Objekt festzulegen:
'post' => json_encode($post)
Im Allgemeinen ist die Bearbeitung von Plugins auf diese Weise eine schlechte Idee, aber sie würde funktionieren, wenn Sie sehr vorsichtig sind. Wahrscheinlich sollten Sie dies nur tun, wenn Sie eine Möglichkeit haben, Ihre Änderungen auf einer Nicht-Produktionsseite zu testen.
Hallo,
Dies ist der Maintainer des Lnk.Bio Wordpress-Plugins.
Die Funktion lnkbio_api_sync verwendet nur die Funktion unset für die lokale Variable $post und sollte keinen Code außerhalb der Funktion beeinträchtigen.
Die Variable $post wird auch nicht per Referenz übergeben, daher ist sie definitiv nur lokal für diese Funktion, andernfalls würde sie sich überall im WP-Code auf den Beitrag/Auszug auswirken.
Jede Änderung, die wir an $post vornehmen, ist nur lokal für diese Funktion, es sei denn, der Discourse-Code verwendet möglicherweise globale Variablen?
Haben Sie eine Sandbox-Discourse-Installation, für die Sie die API-Anmeldeinformationen teilen können, damit wir das Discourse-Plugin lokal testen können und wie es mit unserem Code interagiert?
Vielen Dank im Voraus
Ja, das dachte ich auch.
Das WP Discourse Plugin verwendet global $post an drei Stellen:
Ich bin mir nicht sicher, ob dies Auswirkungen auf das Geschehen haben könnte. Ich sehe auch keine gute Möglichkeit, die Verwendung von global $post in diesen Dateien zu vermeiden.
Das ist interessant: Global Variables « WordPress Codex
Entwickler sollten dies als reservierte Liste von Namen betrachten und keine lokalen Variablen mit denselben Namen in Plugins oder Themes erstellen. Unter bestimmten Umständen wird der Wert der globalen Variable durch den Wert der lokalen Variable ersetzt, was zu schwer zu diagnostizierenden Fehlern im WordPress Core führt.
Ich denke, wir haben hier einen Sonderfall gefunden.
Das habe ich nicht. Ich biete hier nur kostenlosen Support an. Ich weiß, dass Sie sich für eine kostenlose Testversion unter Discourse pricing | Discourse - Civilized Discussion anmelden können. Wählen Sie entweder den Standard- oder den Business-Tarif. Es dauert nur wenige Minuten, eine Website einzurichten und einsatzbereit zu machen.
Danke, das Feedback wird geschätzt.
Wir haben uns wie von Ihnen vorgeschlagen für die Testversion angemeldet und konnten das Problem reproduzieren.
Wir haben festgestellt, dass selbst die Umbenennung von $post in $local_post oder Ähnliches das Problem nicht löst. Die einzige Umgehung, die wir gefunden haben, ist, den Inhalt mit json_encode und dann json_decode zu versehen, um ein komplett separates Objekt zu erstellen. Sehr hässlich.
Dennoch haben wir ein Update veröffentlicht, um diese Inkompatibilität zu beheben, auch wenn das vorherige Design aus Codeperspektive zu 100 % korrekt war.
Hier ist der Patch, der bereits veröffentlicht wurde
- unset($post->post_content);
+ $json = json_encode($post);
+ $local_post = json_decode($json);
+ unset($local_post->post_content);
if ($post->post_status === 'publish') {
if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
return;
@@ -138,7 +140,7 @@ function lnkbio_api_sync($post_id, $post, $update) {
'body' => [
'ACTION' => 'WP_sync',
'post_id' => $post_id,
- 'post' => json_encode($post),
+ 'post' => json_encode($local_post),
'id' => get_option('lnkbio_id'),
'secret' => get_option('lnkbio_secret'),
'permalink' => get_permalink($post),
Danke für deine Hilfe!
Es sah für mich korrekt aus. Ich war überrascht, was da los war. Es tut mir leid, wenn ich in meinem ersten Beitrag zu dem Thema etwas harsch rüberkam. Ich hatte mich zu diesem Zeitpunkt schon ein paar Stunden damit herumgequält.
Du warst überhaupt nicht harsch, du hattest großartige Einblicke.
Nachdem wir etwas mehr daran gearbeitet hatten, fanden wir eine bessere, elegantere Lösung mit der clone-Funktion.
Dies wurde bereits in das aktualisierte Lnk.Bio-Plugin veröffentlicht und der Patch ist einfach
diff --git a/lnk.bio.php b/lnk.bio.php
index 65759fc..cc0c0d2 100644
--- a/lnk.bio.php
+++ b/lnk.bio.php
@@ -126,8 +126,7 @@ function lnkbio_api_post(string $url, array $data) {
}
function lnkbio_api_sync($post_id, $post, $update) {
- $json = json_encode($post);
- $local_post = json_decode($json);
+ $local_post = clone($post);
unset($local_post->post_content);
if ($post->post_status === 'publish') {
if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
Vielen Dank Ihnen beiden, Sie haben meine Bewunderung und meinen Respekt dafür, wie schnell Sie das Problem erkennen und lösen konnten. Planen Sie, diese Verbesserung offiziell in das Link.Bio-Plugin-Update aufzunehmen? Wenn ja, wann ungefähr?
Sieht so aus, als wäre das Update des Lnk.Bio-Plugins bereits abgeschlossen und funktioniert einwandfrei (ich war etwas verwirrt, dass die Plugin-Version unverändert blieb). Danke



