WP-discourse: how to deal with shortcodes in post

I noticed that what WP-discourse is publishing to Discourse are the raw texts from the WordPress posts, not the rendered html. And I guess that makes some sense, given how complex wordpress pages can be. But it’s also a problem since it means you can’t use any shortcodes (or you can’t use discourse with the posts where you do)…

Is there any workaround for this?

Are there any plans of maybe providing an option to use the rendered html as the basis for the discourse post?

Take a look at the ‘Dealing with WordPress shortcodes’ section of this topic: WP Discourse plugin tips and tricks
The do_shortcode option that’s given in that topic generally doesn’t work, but I think some changes could be made to the plugin to get it working.

I solved this by circumventing the content of the post and merely exporting the post url via the plugin while making sure that it will be oneboxed, like this:

For posts where you need the shortcode content to be published to Discourse, it’s possible to publish the post in an iframe. This works best if the WordPress posts uses a custom post-type. That way you can decide which posts are to be published in an iframe. It takes a bit of work on the WordPress end so that posts are published in a format that’s suitable for putting in an iframe. You also need to be able to whitelist the iframe on Discourse for this to work.

I’ve been testing this with both an image gallery shortcode, and a groups sign-up form. It seems to be working quite well.

function your_namespace_publish_format_html( $output ) {
    global $post;

    if ( 'my_iframe_post_type' === $post->post_type) {
	ob_start();

	?>
    <iframe width="690" height="600" src="<?php echo esc_url( the_permalink() ); ?>" frameborder="0"></iframe>
	<?php
	$output = ob_get_clean();

	// Return an iframe for this post type.
	return $output;
    }

    // Return the default output, or do something else with it here.
    return $output;
}
add_filter( 'discourse_publish_format_html', 'your_namespace_publish_format_html' );

Olá @simon

Usei seu template para personalizar o discourse_publish_format_html para exibir todas as postagens em um iframe. No entanto, o parâmetro src da saída do iframe está vazio. Veja aqui:

https://forum.cannabisanbauen.net/t/ist-meine-pflanze-maennlich-was-tun/7196

Alguma ideia do porquê? Abaixo está meu código:

// exibe a postagem em um iframe 
function your_namespace_publish_format_html( $output ) {
    global $post;
	?>
    
    <iframe width="690" height="2000" src="<?php echo esc_url( the_permalink() ); ?>" frameborder="0"></iframe>
	<?php
	$output = ob_get_clean();

    // Retorna a saída padrão ou faça algo diferente com ela aqui.
    return $output;
}
add_filter( 'discourse_publish_format_html', 'your_namespace_publish_format_html' );

Você pode precisar usar o post_id para obter o permalink. Você pode verificar se algo como isso funciona?

add_filter( 'discourse_publish_format_html', 'wpdc_custom_discourse_publish_format_html', 10, 2 );
function wpdc_custom_discourse_publish_format_html( $output, $post_id ) {
    $permalink = get_the_permalink( $post_id ) . '?embed=true';
    ob_start();
    ?>
    <iframe width="690" height="600" src="<?php echo esc_url( $permalink ); ?>" frameborder="0"></iframe>
    <?php

    return ob_get_clean();
}

Funcionou bem! Obrigado novamente pelo apoio.

@simon

Agora quero adicionar o texto do post oculto no tópico, para que ele seja encontrado pela função de busca e indexado corretamente pelos rastreadores de mecanismos de busca.

Quais alterações preciso fazer no meu código atual abaixo para inserir um <div style="display:none;">...</div> com o conteúdo do post?

// Remove qualquer coisa que pareça um shortcode. Isso removerá tudo no post que
// esteja dentro de colchetes `[...]`.
add_filter( 'wp_discourse_excerpt', 'testeleven_remove_shortcodes' );
function testeleven_remove_shortcodes( $excerpt ) {
    $excerpt = preg_replace( '/\[.*\]/', '', $excerpt );

    return $excerpt;
}
// Exibe posts do WordPress incorporados no Discourse via iframe
// https://meta.discourse.org/t/wp-discourse-how-to-deal-with-shortcodes-in-post/58838/5
add_filter( 'discourse_publish_format_html', 'wpdc_custom_discourse_publish_format_html', 10, 2 );
function wpdc_custom_discourse_publish_format_html( $output, $post_id ) {
    $permalink = get_the_permalink( $post_id );
    ob_start();
	?>
    
    <div style="display:none;"><?php echo esc_html( $output ); ?></div>
    <iframe width="690" height="2000" src="<?php echo esc_url( $permalink ); ?>" frameborder="0"></iframe>
	<?php

	return ob_get_clean();
}

Você pode ocultar o texto do post com CSS, direcionando um atributo data no tema do seu site Discourse. No WordPress, envolva o resumo do post em uma div com um atributo data definido para algo como data-hide="true":

add_filter( 'discourse_publish_format_html', 'wpdc_custom_discourse_publish_format_html', 10, 2 );
function wpdc_custom_discourse_publish_format_html( $output, $post_id ) {
	$permalink = get_the_permalink( $post_id ) . '?embed=true';
	ob_start();
	?>
    <div data-hide="true">{excerpt}</div>
    <iframe width="690" height="600" src="<?php echo esc_url( $permalink ); ?>" frameborder="0"></iframe>
	<?php

	return ob_get_clean();
}

No Discourse, adicione algo assim ao seu tema:

[data-hide="true"] {
    display: none;
}

Não tenho certeza de quão bem isso funcionará para SEO, mas usar um atributo data é uma boa maneira de adicionar estilos a posts publicados a partir do WordPress.

Esse modelo não apenas adiciona o resumo? Ou a configuração “exibir post completo” do WP Discourse exibe o post completo para o placeholder {excerpt}?

O marcador de posição excerpt é sempre utilizado. Se você selecionar a configuração ‘exibir post completo’, o post completo será substituído no lugar do marcador.