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

Salut @simon

J’ai utilisé ton modèle pour personnaliser discourse_publish_format_html afin d’afficher tous les messages dans une iframe. Cependant, le paramètre src de la sortie de l’iframe est vide. Voici un exemple :

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

As-tu une idée de la raison ? Voici mon code ci-dessous :

// Afficher le message dans une 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();

    // Retourner la sortie par défaut, ou faire autre chose avec ici.
    return $output;
}
add_filter( 'discourse_publish_format_html', 'your_namespace_publish_format_html' );

Il se peut que vous ayez besoin d’utiliser l’identifiant de publication (post_id) pour obtenir le lien permanent. Pouvez-vous vérifier si quelque chose comme ceci fonctionne ?

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();
}

Cela a bien fonctionné ! Merci encore pour le support.

@simon

Maintenant, je souhaite ajouter le texte du post, masqué dans le sujet, afin qu’il soit trouvé par la fonction de recherche et correctement analysé par les robots des moteurs de recherche.

Quelles modifications dois-je apporter à mon code actuel ci-dessous pour insérer un <div style="display:none;">...</div> contenant le contenu du post ?

// Supprime tout ce qui ressemble à un shortcode. Cela supprimera tout ce qui se trouve dans le post
// et qui est contenu entre crochets `[...]`.
add_filter( 'wp_discourse_excerpt', 'testeleven_remove_shortcodes' );
function testeleven_remove_shortcodes( $excerpt ) {
    $excerpt = preg_replace( '/\[.*\]/', '', $excerpt );

    return $excerpt;
}
// Affiche les publications WordPress intégrées dans Discourse via une 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();
}

Vous pouvez masquer le texte du post avec CSS en ciblant un attribut data dans le thème de votre site Discourse. Sur WordPress, enveloppez l’extrait du post dans une div avec un attribut data défini sur une valeur comme 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();
}

Sur Discourse, ajoutez quelque chose comme ceci à votre thème :

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

Je ne sais pas trop dans quelle mesure cela fonctionnera pour le référencement, mais l’utilisation d’un attribut data est une bonne façon d’ajouter des styles aux posts publiés depuis WordPress.

Ce modèle n’ajoute-t-il pas simplement l’extrait ? Ou le paramètre « afficher l’article complet » de WP Discourse affiche-t-il l’article complet pour le placeholder {excerpt} ?

L’élément réservé excerpt est toujours utilisé. Si vous sélectionnez le paramètre « afficher l’article complet », l’article complet remplacera l’élément réservé.