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

Hey @simon

I used your template to customize the discourse_publish_format_html to display all posts in an iframe. Yet the src parameter of the iframe output is empty. See here:

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

Any idea why? Below is my code:

// show post in 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();

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

Sie müssen möglicherweise die post_id verwenden, um den Permalink zu erhalten. Können Sie prüfen, ob etwas wie Folgendes funktioniert?

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

Es hat gut funktioniert! Nochmals danke für die Unterstützung.

@simon

Jetzt möchte ich den Beitragstext im Thema verstecken, damit er von der Suchfunktion gefunden und von Suchmaschinen-Crawlern ordnungsgemäß gescraped wird.

Welche Änderungen muss ich an meinem aktuellen Code unten vornehmen, um ein <div style="display:none;">...</div> mit dem Beitragsinhalt einzufügen?

// Entfernt alles, das wie ein Shortcode aussieht. Dies entfernt alles im Beitrag, das
// innerhalb von Klammern `[...]` vorkommt.
add_filter( 'wp_discourse_excerpt', 'testeleven_remove_shortcodes' );
function testeleven_remove_shortcodes( $excerpt ) {
    $excerpt = preg_replace( '/\[.*\]/', '', $excerpt );

    return $excerpt;
}
// Zeigt in Discourse eingebettete WP-Beiträge über ein iframe an
// 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();
	?>
    
    <iframe width="690" height="2000" src="<?php echo esc_url( $permalink ); ?>" frameborder="0"></iframe>
	<?php

	return ob_get_clean();
}

Sie können den Text des Beitrags mit CSS ausblenden, indem Sie ein data-Attribut im Theme Ihrer Discourse-Seite ansprechen. Bei WordPress kapseln Sie die Beitragsvorschau in ein div mit einem data-Attribut ein, das auf einen Wert wie data-hide="true" gesetzt ist:

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

Fügen Sie in Discourse etwas wie Folgendes zu Ihrem Theme hinzu:

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

Ich bin mir nicht sicher, wie gut dies für SEO funktioniert, aber die Verwendung eines data-Attributs ist eine gute Möglichkeit, Stile für Beiträge hinzuzufügen, die von WordPress veröffentlicht wurden.

Fügt diese Vorlage nicht einfach nur den Auszug hinzu? Oder zeigt die WP Discourse-Einstellung ‘ganzen Beitrag anzeigen’ den vollständigen Beitrag für den Platzhalter {excerpt} an?

Der Platzhalter excerpt wird immer verwendet. Wenn Sie die Einstellung ‘ganzen Beitrag anzeigen’ auswählen, wird der Platzhalter durch den vollständigen Beitrag ersetzt.