Il pulsante "Mostra post completo" non funziona nelle installazioni in sottocartella

Ho recentemente spostato la nostra installazione di Discourse in una sottocartella. Dopo averlo fatto, il pulsante “Mostra post completo” ha smesso di funzionare: si fa clic per espandere il contenuto, ma il post completo non viene caricato.

Non è cambiato nulla nelle mie configurazioni di WP Discourse.

https://tecnoblog.net/comunidade/t/paramount-oferece-us-108-bilhoes-em-dinheiro-para-tomar-warner-da-netflix/157441

Quando si accede direttamente all’URL dell’embed nel browser, restituisce un errore 404:

https://tecnoblog.net/comunidade/posts/483289/expand-embed

1 Mi Piace

Questo non è correlato, questa rotta risponde solo con un content-type application/json. https://tecnoblog.net/comunidade/posts/483289/expand-embed.json sta restituendo

"\"\u003cdiv\u003e\u003cdiv\u003e\u003c/div\u003e\u003c/div\u003e\\n\u003chr\u003e\\n\u003csmall\u003eQuesto è un thread di discussione di supporto per il post originale su \u003ca href='https://tecnoblog.net/noticias/paramount-oferece-us-108-bilhoes-em-dinheiro-para-tomar-warner-da-netflix'\u003ehttps://tecnoblog.net/noticias/paramount-oferece-us-108-bilhoes-em-dinheiro-para-tomar-warner-da-netflix\u003c/a\u003e\u003c/small\u003e\\n\""

Il \u003cdiv\u003e\u003cdiv\u003e\u003c/div\u003e\u003c/div\u003e dovrebbe essere il contenuto.

Hai anche modificato l’URL del blog per caso?

Anche la visualizzazione onebox mi sembra strana, mi aspetterei che avesse un contenuto troncato memorizzato nella cache invece, quindi presumo che body.present? sia falso nella condizione sopra.

Puoi accedere alla console Rails e verificare se TopicEmbed.where(topic_id: 157441).pick(:embed_url) ti mostra l’URL corretto del contenuto del blog?

Puoi individuare eventuali errori correlati su https://tecnoblog.net/comunidade/logs?

2 Mi Piace

Oh, ok!

Restituisce l’URL del post:

discourse(prod) => TopicEmbed.where(topic_id: 157441).pick(:embed_url)
=> “``https://tecnoblog.net/noticias/paramount-oferece-us-108-bilhoes-em-dinheiro-para-tomar-warner-da-netflix”

Non credo ci siano errori correlati nel log.

Nop! L’URL del blog è sempre stato tecnoblog.net

Vale anche la pena menzionare che l’IP del server è bypassato nel Firewall di CF:

2 Mi Piace

Ho dovuto eseguire il debug di questi problemi in questo modo un paio di volte ed è complicato, quindi abbi pazienza.

Esegui lo script seguente e condividi l’output qui

# Sostituisci con l'ID o l'URL del topic che stai debuggando
topic_id = 386983

# 1. Verifica se TopicEmbed esiste e il suo contenuto
te = TopicEmbed.find_by(topic_id: topic_id)
puts "TopicEmbed esiste: #{te.present?}"
puts "URL Embed: #{te&.embed_url}"
puts "Cache del contenuto presente: #{te&.embed_content_cache.present?}"
puts "Lunghezza della cache del contenuto: #{te&.embed_content_cache&.length || 0}"
puts "SHA1 del contenuto: #{te&.content_sha1}"

# 2. Verifica il contenuto memorizzato nella cache effettivo (primi 500 caratteri)
puts "\n--- Anteprima del contenuto memorizzato nella cache ---"
puts te&.embed_content_cache&.truncate(500)

# 3. Prova a recuperare dall'URL remoto
if te&.embed_url.present?
  puts "\n--- Tentativo di recupero remoto ---"
  begin
    response = TopicEmbed.find_remote(te.embed_url)
    puts "Recupero remoto riuscito: #{response.present?}"
    puts "Corpo remoto presente: #{response&.body.present?}"
    puts "Lunghezza del corpo remoto: #{response&.body&.length || 0}"
    puts "Titolo remoto: #{response&.title}"
    puts "Corpo remoto: #{response&.body&.truncate(500)}"
  rescue => e
    puts "Recupero remoto FALLITO: #{e.message}"
  end
end

# 4. Verifica cosa restituirebbe expanded_for
if te.present?
  puts "\n--- Test di expanded_for ---"
  post = Post.find(te.post_id)

  # Svuota la cache per forzare un nuovo recupero
  Discourse.cache.delete("embed-topic:#{topic_id}")

  begin
    expanded = TopicEmbed.expanded_for(post)
    puts "Contenuto espanso presente: #{expanded.present?}"
    puts "Lunghezza del contenuto espanso: #{expanded&.length || 0}"
  rescue => e
    puts "expanded_for FALLITO: #{e.message}"
  end
end

# 5. Verifica le impostazioni del sito
puts "\n--- Impostazioni del sito ---"
puts "embed_truncate: #{SiteSetting.embed_truncate}"
puts "allowed_embed_selectors: #{SiteSetting.allowed_embed_selectors}"
puts "blocked_embed_selectors: #{SiteSetting.blocked_embed_selectors}"

Questo mostrerà perché https://tecnoblog.net/comunidade/t/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento/157462?u=falco non funziona

4 Mi Piace
discourse(prod)> # Replace with the topic ID or URL you’re debugging
discourse(prod)> topic_id = 386983
discourse(prod)>
discourse(prod)> # 1. Check if TopicEmbed exists and its content
discourse(prod)> te = TopicEmbed.find_by(topic_id: topic_id)
discourse(prod)> puts “TopicEmbed exists: #{te.present?}”
discourse(prod)> puts “Embed URL: #{te&.embed_url}”
discourse(prod)> puts “Content cache present: #{te&.embed_content_cache.present?}”
discourse(prod)> puts “Content cache length: #{te&.embed_content_cache&.length || 0}”
discourse(prod)> puts “Content SHA1: #{te&.content_sha1}”
discourse(prod)>
discourse(prod)> # 2. Check the actual cached content (first 500 chars)
discourse(prod)> puts “\n— Cached content preview —”
discourse(prod)> puts te&.embed_content_cache&.truncate(500)
discourse(prod)>
discourse(prod)> # 3. Try fetching from the remote URL
discourse(prod)* if te&.embed_url.present?
discourse(prod)*   puts “\n— Attempting remote fetch —”
discourse(prod)*   begin
discourse(prod)*     response = TopicEmbed.find_remote(te.embed_url)
discourse(prod)*     puts “Remote fetch success: #{response.present?}”
discourse(prod)*     puts “Remote body present: #{response&.body.present?}”
discourse(prod)*     puts “Remote body length: #{response&.body&.length || 0}”
discourse(prod)*     puts “Remote title: #{response&.title}”
discourse(prod)*     puts “Remote body: #{response&.body&.truncate(500)}”
discourse(prod)*   rescue => e
discourse(prod)*     puts “Remote fetch FAILED: #{e.message}”
discourse(prod)*   end
discourse(prod)* end
discourse(prod)>
discourse(prod)> # 4. Check what expanded_for would return
discourse(prod)* if te.present?
discourse(prod)*   puts “\n— Testing expanded_for —”
discourse(prod)*   post = Post.find(te.post_id)
discourse(prod)*
discourse(prod)*   # Clear cache to force fresh fetch
discourse(prod)*   Discourse.cache.delete(“embed-topic:#{topic_id}”)
discourse(prod)*
discourse(prod)*   begin
discourse(prod)*     expanded = TopicEmbed.expanded_for(post)
discourse(prod)*     puts “Expanded content present: #{expanded.present?}”
discourse(prod)*     puts “Expanded content length: #{expanded&.length || 0}”
discourse(prod)*   rescue => e
discourse(prod)*     puts “expanded_for FAILED: #{e.message}”
discourse(prod)*   end
discourse(prod)* end
discourse(prod)>
discourse(prod)> # 5. Check relevant settings
discourse(prod)> puts “\n— Site Settings —”
discourse(prod)> puts “embed_truncate: #{SiteSetting.embed_truncate}”
discourse(prod)> puts “allowed_embed_selectors: #{SiteSetting.allowed_embed_selectors}”
discourse(prod)> puts “blocked_embed_selectors: #{SiteSetting.blocked_embed_selectors}”
TopicEmbed exists: false
Embed URL:
Content cache present: false
Content cache length: 0
Content SHA1:

— Cached content preview —

— Site Settings —
embed_truncate: true
allowed_embed_selectors:
blocked_embed_selectors:
=> nil
discourse(prod)>

:thinking:

1 Mi Piace

Sei sicuro che questo sia l’ID del topic corretto? https://tecnoblog.net/comunidade/t/-/386983 porta a un 404.

1 Mi Piace

Ah, ecco. L’argomento a cui ho collegato è in realtà il 157462.

Le mie scuse!

Ecco i risultati per l’ID del topic corretto

TopicEmbed exists: true
Embed URL: https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento
Content cache present: true
Content cache length: 22
Content SHA1:

— Cached content preview —

<div><div></div></div>

— Attempting remote fetch —
Remote fetch success: true
Remote body present: true
Remote body length: 22
Remote title:
Remote body:

— Testing expanded_for —
Expanded content present: true
Expanded content length: 309

— Site Settings —
embed_truncate: true
allowed_embed_selectors:
blocked_embed_selectors:
=> nil

Il tuo bypass di Cloudflare ha funzionato? Sembra che il corpo per https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento sia di sole 22 caratteri, senza tag di titolo.

Sì! Tutte le richieste dal server discourse vengono bypassate:

Screenshot 2025-12-12 at 14.44.21

Quello che ho notato è che l’URL di incorporamento non ha una barra finale alla fine. Tutti gli URL dovrebbero avere la barra finale.

Screenshot 2025-12-12 at 14.45.51

Quindi forse discourse non sta seguendo il reindirizzamento?

Ma anche, perché sta salvando l’URL senza la barra finale?

1 Mi Piace

Questo è facile da testare, prova

url = "https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento/"
response = TopicEmbed.find_remote(url)
puts "Recupero remoto riuscito: #{response.present?}"
puts "Corpo remoto presente: #{response&.body.present?}"
puts "Lunghezza corpo remoto: #{response&.body&.length || 0}"
puts "Titolo remoto: #{response&.title}"
puts "Corpo remoto: #{response&.body&.truncate(500)}"

Penso che funzioni:

discourse(prod)> url = “https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento/”
discourse(prod)> response = TopicEmbed.find_remote(url)
discourse(prod)> puts “Remote fetch success: #{response.present?}”
discourse(prod)> puts “Remote body present: #{response&.body.present?}”
discourse(prod)> puts “Remote body length: #{response&.body&.length || 0}”
discourse(prod)> puts “Remote title: #{response&.title}”
discourse(prod)> puts “Remote body: #{response&.body&.truncate(500)}”
Remote fetch success: true
Remote body present: true
Remote body length: 3776
Remote title: Governo renova app da CNH para baratear obtenção do documento • Tecnoblog
Remote body: 

<figure><img src="https://files.tecnoblog.net/wp-content/uploads/2025/12/cnh-brasil-app-1060x596.jpg">

	<figcaption>Aplicativo CNH do Brasil (imagem: Emerson Alecrim/Tecnoblog)</figcaption></figure>

</div>

<details>
    Resumo
    <div><ul>
<li>App CNH do Brasil substitui CDT e passa a oferecer recursos para obtenção da CNH, em especial, aulas teóricas gratuitas;</li>
<li>Aulas práticas continuam obrigatórias, mas a carga horária mínima foi reduzida de ...
=> nil


Qui senza la barra finale:

discourse(prod)> url = “https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento”
discourse(prod)> response = TopicEmbed.find_remote(url)
discourse(prod)> puts “Remote fetch success: #{response.present?}”
discourse(prod)> puts “Remote body present: #{response&.body.present?}”
discourse(prod)> puts “Remote body length: #{response&.body&.length || 0}”
discourse(prod)> puts “Remote title: #{response&.title}”
discourse(prod)> puts “Remote body: #{response&.body&.truncate(500)}”
Remote fetch success: true
Remote body present: true
Remote body length: 22
Remote title:
Remote body: 
=> nil

Lo stesso errore si verifica nei vecchi post, dove lo slug del post è cambiato.

Ad esempio, in questo post, l’URL era:

https://tecnoblog.net/486925/o-que-e-pirataria-digital/

Ora, è cambiato in:

https://tecnoblog.net/responde/o-que-e-pirataria-digital/

1 Mi Piace

Questo è il problema principale, a quanto pare. Quando si utilizza Embed Discourse comments on another website via Javascript si controlla tramite un parametro, è super facile da risolvere.

Non ho familiarità con il modo in cui WP-Discourse lo determina, dovrebbe usare il canonico del post, ma non ne sono sicuro. Qualche idea @angus?

C’è un modo per forzare discourse ad aggiornare tutti gli URL di incorporamento da una categoria, seguendoli fino alla destinazione finale?

Intendo migrare all’incorporamento di Discourse (quell’incorporamento completo che hai provato) quando sarà pronto per la produzione. Ma se gli URL di incorporamento non corrispondono, probabilmente creerebbe nuovi argomenti per ogni post e si perderebbero i commenti…

1 Mi Piace

Esegui

te = TopicEmbed.find_by(topic_id: 157462)
te.embed_url = te.embed_url + "/"
te.save

Questo risolve https://tecnoblog.net/comunidade/t/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento/157462 ?

Funziona!

Ma c’è una soluzione per casi come questo?

Gemini ha suggerito questo codice:

# Configurazione
CATEGORY_SLUG = 'tb' 
category = Category.find_by(slug: CATEGORY_SLUG)

unless category
  puts "ERRORE: Categoria '#{CATEGORY_SLUG}' non trovata."
  exit
end

puts "Avvio scansione completa degli URL nella categoria '#{category.name}'..."
puts "Questo potrebbe richiedere tempo a seconda del numero di argomenti e della risposta del tuo sito..."

count_updated = 0
count_errors = 0
count_ok = 0

Topic.where(category_id: category.id).find_each do |topic|
  current_url = topic.custom_fields["embed_url"]
  
  # Salta se non c'è embed_url
  next unless current_url.present?

  begin
    # Esegue la richiesta GET seguendo i redirect
    response = Faraday.get(current_url)
    final_url = response.env.url.to_s

    # Se la richiesta ha avuto successo (200 OK)
    if response.status == 200
      # Verifica se l'URL finale è diverso dall'URL salvato nel database
      # Il confronto ignora differenze sottili se necessario, ma qui confrontiamo stringa esatta
      if final_url != current_url
        puts "\n[AGGIORNARE] Argomento ##{topic.id}:"
        puts "   Da:   #{current_url}"
        puts "   A: #{final_url}"
        
        topic.custom_fields["embed_url"] = final_url
        topic.save_custom_fields(true)
        count_updated += 1
      else
        # print "." # Decommenta per vedere il progresso visivo (punti)
        count_ok += 1
      end
    else
      puts "\n[ERRORE HTTP #{response.status}] Argomento ##{topic.id} - URL: #{current_url}"
      count_errors += 1
    end

  rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
    puts "\n[FALLIMENTO CONNESSIONE] Argomento ##{topic.id} - URL: #{current_url} - #{e.message}"
    count_errors += 1
  rescue StandardError => e
    puts "\n[ERRORE GENERALE] Argomento ##{topic.id} - #{e.message}"
    count_errors += 1
  end
  
  # Opzionale: Breve pausa per non sovraccaricare il tuo server WordPress
  # sleep 0.1 
end

puts "\n\nRiepilogo Finale:"
puts "------------------------------------------------"
puts "Argomenti Verificati (OK): #{count_ok}"
puts "Argomenti Aggiornati:      #{count_updated}"
puts "Errori Trovati:            #{count_errors}"
puts "------------------------------------------------"

Finalmente qualche progresso :sweat_smile:

Uno script del genere è un’ottima idea, ma fai un backup prima di eseguirlo.

Anche un backup di questa piccola tabella sarebbe fantastico.

1 Mi Piace

Ok! Proverò a eseguirlo più tardi, quando il team avrà finito il suo turno.

1 Mi Piace

Ehi ragazzi, vedo che la barra finale ha colpito ancora una volta :slight_smile:

[le barre finali sono] il problema principale a quanto pare. Quando si utilizza Incorpora commenti di Discourse su un altro sito web tramite Javascript si controlla tramite un parametro, è super facile da risolvere.

Solo per segnalare che tutti gli incorporamenti di argomenti in Discourse rimuovono le barre finali da embed_url; vedi TopicEmbed.normalize_url. Come risultato di un caso separato che coinvolge l’intersezione tra incorporamenti javascript e incorporamenti WP Discourse, abbiamo standardizzato questa gestione su entrambi i metodi di incorporamento. Vedi Apply TopicEmbed url normalisation to embed urls inserted in the PostCreator by angusmcleod · Pull Request #30641 · discourse/discourse · GitHub

@Thiago_Mobilon Nel corso di questa migrazione hai aggiornato anche il tuo Discourse? È possibile che stiamo vedendo l’applicazione della standardizzazione della normalizzazione di embed_url agli incorporamenti WP Discourse come risultato di un aggiornamento del tuo Discourse, avvenuto contemporaneamente alla migrazione all’installazione nella sottocartella. Quale versione di Discourse stai attualmente utilizzando? (e quale versione stavi utilizzando prima della migrazione, se lo sai?)

Solo una nota a margine, quando eseguo questi due comandi in locale sull’ultima versione di Discourse, ottengo lo stesso risultato, ovvero il corpo HTML dell’articolo

# con barra finale
TopicEmbed.find_remote("https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento/")

# senza barra finale
TopicEmbed.find_remote("https://tecnoblog.net/noticias/governo-renova-app-da-cnh-para-baratear-obtencao-do-documento")

# produce lo stesso risultato

Hai forse apportato una modifica sul lato Wordpress?

2 Mi Piace

Ciao Angus!

No, questi sono problemi diversi. Lo slash finale è iniziato quando siamo passati alla sottocartella, ma ci sono anche vecchi URL di anni fa che ora hanno uno slug diverso.

Ho dovuto ricostruire l’installazione, quindi sì, penso che questo nuovo standard possa essere la causa.

Il mio suggerimento per risolvere questo problema: Discourse non può seguire almeno uno o due reindirizzamenti per recuperare i dati? Questo risolverebbe il problema dello slash finale e renderebbe anche il sito web a prova di bomba in caso di possibili modifiche agli URL in futuro.

Inoltre, è più sicuro, poiché non ci sarebbe bisogno di eseguire script per aggiornare i vecchi argomenti, il che potrebbe anche causare danni al database.