WP Discourse - Personalização de modelo

Caso de uso: Existem links do YouTube em minhas postagens no WordPress. Quero que o vídeo do YouTube apareça automaticamente na postagem correspondente no Discourse após publicar a postagem no WordPress.

Problema: Parece que não funciona porque, após a sincronização, o HTML da postagem no Discourse é:

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

O vídeo do YouTube só aparece com sucesso se eu remover as tags <p></p>.

Então, como remover as tags <p></p>? Espero não precisar remover as tags <p></p> manualmente, pois posso ter milhares de postagens.

Não tenho certeza se posso remover as tags <p></p> diretamente no arquivo functions.php.

Segui seu tutorial de personalização. Este é o código no functions.php:

// Adiciona a imagem destacada à postagem publicada no Discourse.
function my_namespace_publish_format( $input ) {
    ob_start();
    ?>
    {excerpt} **<-----posso remover as tags p aqui?**
    <?php
    $output = ob_get_clean();
    
    // Observação: a chamada a apply_filters() que estava na função original foi removida.
    return $output; 
}

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format' );

Dependendo de como seus vídeos foram publicados, você pode ser capaz de usar algo como isto:

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>Originalmente publicado em {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;
}

Isso deve funcionar se os vídeos estiverem incorporados no seu site WordPress. Pode ser necessário algum teste e erro para obter a formatação correta. O principal problema que encontrei foi que, se houver espaços antes da tag iframe do YouTube, o Discourse irá interpretá-la como código.

Avise-me se essa abordagem não funcionar no seu site.

O que eu gostaria de fazer funcionar seria ter vídeos do YouTube exibidos quando os usuários clicarem no botão “Mostrar Postagem Completa” no Discourse para expandir uma postagem do WordPress. Não tenho certeza se isso será possível, no entanto.

Oi Simon,

Obrigado por responder. Agradeço imensamente a ajuda.

Mas parece que não está funcionando.

A saída foi:

<small>Originalmente publicado em http://staging.a1.sg/matrix/</small><br><br><iframe title="GCE O-Level 
A-Maths: Matrix &amp; 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 &amp; 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>

Também adicionei um código extra no arquivo functions.php após testar a solução proposta acima, para garantir que o link do YouTube permaneça como uma string.

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' ] );

Mas a saída (como mostrado abaixo) também tem tags

. Como mencionado anteriormente, as tags

em posts do Discourse estão causando o problema.

<small>Originalmente publicado em http://staging.a1.sg/matrix/</small><br><br>. 
<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

Ou seja, se eu remover as tags

, o link será incorporado automaticamente no Discourse. Mas ainda é um processo manual.

ou existe uma maneira de criar posts em massa no Discourse, usando dados do Google Sheets?

Dessa forma, posso me livrar do WordPress.

O equivalente no WordPress é o wpallimport.com.

A saída do seu primeiro exemplo de código parece próxima do que eu esperava. Acredito que o problema é que você precisa adicionar https://www.youtube.com/embed à configuração do site do Discourse iframes permitidos. Isso permitirá que o iframe presente na marcação da postagem seja exibido como um player de vídeo no Discourse.

funciona perfeitamente!!! Obrigado!!!

mas há 2 embeds em vez de um.

a saída está abaixo. há algo errado com o código que você sugeriu para mim?

<small>Originalmente publicado em 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>Originalmente publicado em {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;

Você pode tentar publicar uma postagem sem usar o modelo personalizado agora? Pode ser que tudo o que precisava ser feito fosse adicionar https://www.youtube.com/embed à configuração do site do Discourse iframes permitidos.

Qual editor você está usando no seu site WordPress, o antigo Editor Clássico ou o novo Editor de Blocos? Além disso, você está publicando a postagem completa no Discourse ou apenas um trecho?

Isso pode ser feito escrevendo um pequeno script para publicar postagens a partir de um arquivo CSV.

  1. Funciona. Obrigado, Simon. Há uma maneira de remover o link de volta para o WordPress? Conforme mostrado na captura de tela abaixo.

  1. Você poderia gentilmente me indicar um caminho ou um tutorial sobre que tipo de script deve ser escrito?

Acho que a maneira mais rápida seria escondê-lo com CSS.

Para evitar que o link para seu domínio do WordPress apareça abaixo do título do tópico, desmarque a opção “Add Featured Links” na página de configurações do WP Discourse Publishing. Para remover o link destacado de postagens já publicadas, o link pode ser ocultado com CSS ou removido do banco de dados do seu site Discourse. Estou fora do trabalho nos próximos dias, mas posso cuidar disso para você quando retornar na quarta-feira.

Se você puder esperar até quarta-feira, posso ajudar com isso. Se precisar fazer isso antes disso, você pode tentar criar um novo tópico na nossa categoria Support perguntando como criar tópicos via API a partir de um arquivo CSV.