Lunghezza personalizzata dell'estratto non funzionante per me

Sto cercando di ridurre il numero di parole che appaiono in “Discours” quando pubblico un articolo in WordPress. Ma invece non vedo una sola parola :slight_smile:


2 Mi Piace

Stai usando l’editor a blocchi o il vecchio editor classico per pubblicare il post?

Riesci a condividere un link al post? Potrebbe fornire alcuni indizi su cosa sta andando storto.

Cosa succede se provi ad aggiungere manualmente un estratto al post:

Grazie per la tua risposta. Stiamo ancora utilizzando l’editor classico.
Ci sta succedendo attualmente per tutti gli articoli, ma ecco i link:

Non so se capisco appieno come aggiungere manualmente un estratto.

Non utilizziamo “Estratto” per i post in WordPress da alcuni anni, non l’ho capito subito.

Ma sembra che quando compilo “manualmente” in WordPress tutto funzioni bene.

Esiste una soluzione per inviare le prime X parole a Discourse senza dover compilare manualmente “Estratto”?

1 Mi Piace

Ha senso. La logica utilizzata per creare l’estratto è diversa quando l’estratto viene creato manualmente rispetto a quando il plugin WP Discourse analizza l’estratto dal contenuto del post.

Dovrebbe funzionare ora, ma potrebbe esserci un conflitto sul tuo sito tra il plugin Discourse e un altro plugin che hai installato sul sito. Un’altra possibilità è che tu stia usando degli shortcode nei post che non vengono analizzati correttamente quando il plugin Discourse tenta di creare l’estratto.

Stai usando degli shortcode nei tuoi post?

Per mia informazione, il problema sembra essere qui: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub. Presumo che qualcosa stia andando storto in relazione alla chiamata a $excerpt = apply_filters( 'the_content', $raw );

3 Mi Piace

Sì, usiamo gli shortcode. Proverò a disabilitarli temporaneamente e vedrò cosa succede. Grazie per le indicazioni. Vi farò sapere cosa scopriamo.

1 Mi Piace

Se disabilito la maggior parte dei plugin sul sito, tutto sembra funzionare correttamente. Grazie per le indicazioni. Cercherò il plugin problematico :slight_smile:

2 Mi Piace

Qualche ora dopo :). Ho già trovato il colpevole, il plugin Lnk.Bio – Plugin WordPressu | WordPress.org Česko lo fa, hai qualche idea su come risolverlo?

1 Mi Piace

Il plugin LnkBio ha una funzione che si aggancia all’azione 'wp_insert_post'. Tale funzione chiama unset($post->post_content) sull’oggetto $post di WordPress. In teoria, questo non dovrebbe rimuovere l’attributo post_content del post al di fuori della funzione LnkBio, ma quando lo testo localmente (simulando le chiamate API del plugin LnkBio), la chiamata a unset($post->post_content) sta rimuovendo il contenuto del post per il plugin WP Discourse qui: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub.

Questo accade solo quando i post vengono pubblicati con l’Editor Classico. Se i post vengono pubblicati con l’Editor a Blocchi, il contenuto del post è disponibile per il plugin WP Discourse. Presumo che ciò sia dovuto al fatto che i post pubblicati con l’Editor a Blocchi vengono pubblicati tramite una richiesta REST.

Si noti che sto riscontrando il problema di nessun contenuto pubblicato su Discourse sia quando imposto una lunghezza personalizzata dell’estratto sia quando seleziono l’opzione WP Discourse “Usa contenuto completo del post”.

La soluzione più semplice sarebbe passare all’uso dell’Editor a Blocchi.

Un’altra opzione sarebbe contattare LnkBio e segnalare il problema. Potrebbero risolverlo trovando un modo più sicuro per analizzare il contenuto del post per la loro richiesta API:

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 impostato su `example.com` per testare senza un account lnkbio
		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'),
				]
			]
		);
	}
}

Modifica: potresti anche semplicemente modificare il codice del plugin LnkBio per rimuovere la chiamata a unset($post->post_content); e quindi trovare un modo per impostare i valori appropriati per l’oggetto $post che viene utilizzato qui:

'post' => json_encode($post)

In generale, modificare i plugin in questo modo è una cattiva idea, ma funzionerebbe se si è molto attenti. Probabilmente fallo solo se hai un modo per testare le tue modifiche su un sito non di produzione.

1 Mi Piace

Ciao,

Questo è il manutentore del plugin Lnk.Bio per Wordpress.

La funzione lnkbio_api_sync utilizza solo la funzione unset sulla variabile locale $post e non dovrebbe influire su alcun codice esterno alla funzione.

La variabile $post non viene passata per riferimento, quindi è decisamente locale a quella funzione, altrimenti influirebbe sul post/estratto ovunque nel codice di WP.

Qualsiasi modifica che apportiamo a $post è locale solo a quella funzione, a meno che il codice di Discourse non utilizzi in qualche modo variabili globali?

Avete un’installazione sandbox di Discourse per la quale potete condividere le credenziali API in modo da poter testare il plugin Discourse localmente e come interagisce con il nostro codice?

Grazie in anticipo

2 Mi Piace

Sì, è quello che pensavo.
Il plugin WP Discourse utilizza global $post in tre punti:

Non sono sicuro che ciò possa avere un impatto su ciò che sta accadendo. Inoltre, non vedo un buon modo per evitare l’uso di global $post in quei file.

Questo è interessante: Global Variables « WordPress Codex

Si consiglia agli sviluppatori di considerare questo un elenco di nomi riservati e di non creare variabili locali con gli stessi nomi nei plugin o nei temi. In alcune circostanze, il valore della variabile globale verrà sostituito dal valore della variabile locale, causando errori nel core di WordPress difficili da diagnosticare.

Penso che potremmo aver trovato un caso limite.

Non ne ho. Sto solo fornendo supporto gratuito qui. So che puoi iscriverti per una prova gratuita su Discourse pricing | Discourse - Civilized Discussion. Scegli il piano Standard o Business. Bastano pochi minuti per mettere in funzione un sito.

2 Mi Piace

Grazie, apprezzo il feedback.

Ci siamo iscritti alla versione di prova come hai suggerito e siamo stati in grado di riprodurre il problema.

Abbiamo scoperto che anche rinominare $post in $local_post o simile non risolve il problema. L’unica soluzione temporanea che abbiamo trovato è quella di json_encode e poi json_decode il contenuto, in modo da creare un oggetto completamente separato. Molto brutto.

Tuttavia, abbiamo pubblicato un aggiornamento per risolvere questa incompatibilità, anche se il design precedente era corretto al 100% dal punto di vista del codice.

Ecco la patch che è già stata pubblicata

-       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),
1 Mi Piace

Grazie per averlo fatto!

Anche a me sembrava corretto. Sono rimasto sorpreso da quello che stava succedendo. Mi scuso se sono sembrato un po’ brusco nel mio post iniziale riguardo al problema. Ci stavo riflettendo da qualche ora.

4 Mi Piace

Non sei stato affatto duro, hai avuto ottime intuizioni.

Dopo averci lavorato un po’ di più, abbiamo trovato una soluzione migliore e più elegante utilizzando la funzione clone.

Questo è già stato pubblicato nel plugin Lnk.Bio aggiornato e la patch è semplicemente

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')) {
4 Mi Piace

Grazie mille a entrambi, avete la mia ammirazione e il mio rispetto per la rapidità con cui siete riusciti a individuare e risolvere il problema. Avete in programma di integrare ufficialmente questo miglioramento nell’aggiornamento del plugin Link.Bio? Se sì, quando approssimativamente?

1 Mi Piace

Sembra che l’aggiornamento del plugin Lnk.Bio sia già stato completato e funzioni correttamente (ero un po’ confuso dal fatto che la versione del plugin non fosse cambiata). Grazie.

1 Mi Piace