WP Discourse - Personalizzazione del template

Caso d’uso: Nei miei post di WordPress sono presenti link a YouTube. Desidero che il video di YouTube appaia automaticamente nel rispettivo post di Discourse dopo la pubblicazione del post su WordPress.

Problema: Sembra non funzionare perché, dopo la sincronizzazione, l’HTML del post di Discourse è:

<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

Il video di YouTube verrà visualizzato correttamente solo se rimuovo i tag <p></p>.

Quindi, come posso rimuovere i tag <p></p>? Spero di non dover rimuovere manualmente i tag <p></p> poiché potrei avere migliaia di post.

Non sono sicuro se sia possibile rimuovere i tag <p></p> direttamente nel file functions.php.

Ho seguito il tuo tutorial di personalizzazione. Ecco il codice presente nel file functions.php:

// Aggiunge l'immagine in evidenza al post pubblicato su Discourse.
function my_namespace_publish_format( $input ) {
    ob_start();
    ?>
    {excerpt} **<-----posso rimuovere i tag p qui?**
    <?php
    $output = ob_get_clean();
    
    // Nota: la chiamata a apply_filters() presente nella funzione originale è stata rimossa.
    return $output; 
}

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format' );

A seconda di come sono stati pubblicati i tuoi video, potresti essere in grado di utilizzare qualcosa di simile:

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format', 10, 2 );
function my_namespace_publish_format( $input, $post_id ) {
	$post_content = apply_filters( 'the_content', get_post( $post_id )->post_content );
	$videos = get_media_embedded_in_content( $post_content );
	$video_string = '';
	foreach( $videos as $video ) {
	    $video_string .= $video . '<br>';
    }
    ob_start();

    echo '<small>Pubblicato originariamente su {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;
}

Questo dovrebbe funzionare se i video sono incorporati nel tuo sito WordPress. Potrebbe richiedere qualche prova ed errore per ottenere il formato corretto. Il problema principale che ho riscontrato è che se ci sono spazi iniziali prima del tag iframe di YouTube, Discourse lo interpreterà come codice.

Fammi sapere se questo approccio non funziona sul tuo sito.

Ciò che mi piacerebbe far funzionare sarebbe visualizzare i video di YouTube quando gli utenti fanno clic sul pulsante “Mostra post completo” su Discourse per espandere un post di WordPress. Non sono sicuro che sia possibile, però.

Ciao Simon,

grazie per la risposta. Apprezzo moltissimo il tuo aiuto.

Ma sembra che non funzioni.

L’output era:

<small>Originariamente pubblicato su http://staging.a1.sg/matrix/</small><br><br><iframe title="GCE O-Level 
A-Maths: Matrix & its Inverse" width="525" height="394" 
src="https://www.youtube.com/embed/alJEZwwtQ3U?feature=oembed" frameborder="0" 
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>. 
</iframe><br><p><iframe title="GCE O-Level A-Maths: Matrix & its Inverse" width="525" 
height="394" src="https://www.youtube.com/embed/alJEZwwtQ3U?feature=oembed" frameborder="0" 
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>. 
</iframe></p>

Ho anche aggiunto un codice extra nel file functions.php dopo aver provato la soluzione proposta sopra, per assicurarmi che il link di YouTube rimanga una stringa.

remove_shortcode( 'embed' );
remove_filter( 'the_content', [ $GLOBALS['wp_embed'], 'autoembed' ], 8 );
remove_filter( 'the_content', [ $GLOBALS['wp_embed'], 'run_shortcode' ], 8 );
remove_action( 'edit_form_advanced', [ $GLOBALS['wp_embed'], 'maybe_run_ajax_cache' ] );

Ma l’output (come mostrato di seguito) contiene anche i tag

. Come ho già detto, i tag

nei post di Discourse stanno causando il problema.

<small>Originariamente pubblicato su http://staging.a1.sg/matrix/</small><br><br>. 
<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

Cioè, se rimuovo i tag

, il link viene incorporato automaticamente su Discourse. Ma è comunque un processo manuale.

Oppure c’è un modo per creare in massa post su Discourse, utilizzando dati da Google Sheets?

In questo modo, potrei fare a meno di WordPress.

L’equivalente in WordPress è wpallimport.com

L’output del tuo primo esempio di codice sembra vicino a quello che mi aspettavo. Penso che il problema sia che devi aggiungere https://www.youtube.com/embed all’impostazione del sito Discourse allowed iframes. Questo consentirà all’iframe presente nel markup del post di essere visualizzato come un player video su Discourse.

Funziona magnificamente!!! Grazie!!!

ma ci sono due embed invece di uno.

l’output è qui sotto. c’è qualcosa di sbagliato nel codice che mi hai suggerito?

<small>Originariamente pubblicato su http://staging.a1.sg/beautiful/</small><br><br><iframe src="https://www.youtube.com/embed/alJEZwwtQ3U" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe><br><p><iframe src="https://www.youtube.com/embed/alJEZwwtQ3U" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format', 10, 2 );
function my_namespace_publish_format( $input, $post_id ) {
	$post_content = apply_filters( 'the_content', get_post( $post_id )->post_content );
	$videos = get_media_embedded_in_content( $post_content );
	$video_string = '';
	foreach( $videos as $video ) {
	    $video_string .= $video . '<br>';
    }
    ob_start();

    echo '<small>Originariamente pubblicato su {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;

Puoi provare a pubblicare un post senza utilizzare il modello personalizzato ora? Potrebbe essere che tutto ciò che serviva fosse aggiungere https://www.youtube.com/embed all’impostazione del sito Discourse allowed iframes.

Quale editor stai usando sul tuo sito WordPress, il vecchio Classic Editor o il nuovo Block Editor? Inoltre, stai pubblicando l’intero post su Discourse o solo un estratto?

Questo potrebbe essere fatto scrivendo uno script semplice per pubblicare post da un file CSV.

  1. Funziona. Grazie, Simon. C’è un modo per rimuovere il link di ritorno a WordPress? Come mostrato nello screenshot qui sotto.

  1. Potresti gentilmente indicarmi una direzione o un tutorial su quale tipo di script dovrebbe essere scritto?

Immagino che il modo più veloce sia nasconderlo con il CSS.

Per evitare che il link al tuo dominio WordPress appaia sotto il titolo dell’argomento, deseleziona l’opzione “Add Featured Links” nella pagina delle impostazioni di WP Discourse Publishing. Per rimuovere il link in evidenza dai post già pubblicati, il link può essere nascosto tramite CSS oppure rimosso dal database del tuo sito Discourse. Sarò fuori ufficio per i prossimi giorni, ma mi occuperò di questo per te quando tornerò al lavoro mercoledì.

Se puoi aspettare fino a mercoledì, posso darti una mano con questo. Se hai bisogno di farlo prima, potresti provare a creare un nuovo argomento nella nostra categoria #supporto chiedendo come creare argomenti tramite l’API da un file CSV.