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

こんにちは @simon さん

あなたのテンプレートを使って discourse_publish_format_html をカスタマイズし、すべての投稿を iframe で表示するようにしました。しかし、出力される iframe の src パラメータが空になっています。こちらをご覧ください:

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

なぜでしょうか? 以下が私のコードです:

// 投稿を 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 $output;
}
add_filter( 'discourse_publish_format_html', 'your_namespace_publish_format_html' );

post_id を使用してパーマリンクを取得する必要があるかもしれません。このような方法で動作するか確認できますか?

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

うまくいきました!サポートを再度ありがとうございます

@simon

さて、検索機能で見つかり、検索エンジンクローラーによって適切にスクレイピングされるように、トピック内の投稿テキストを非表示に追加したいと考えています。

現在のコード(以下)にどのような変更を加えれば、投稿コンテンツを含む <div style="display:none;">...</div> を追加できますか?

// ショートコードに見えるものをすべて削除します。これにより、投稿内の
// 角括弧 `[...]` で囲まれた部分がすべて削除されます。
add_filter( 'wp_discourse_excerpt', 'testeleven_remove_shortcodes' );
function testeleven_remove_shortcodes( $excerpt ) {
    $excerpt = preg_replace( '/\[.*\]/', '', $excerpt );

    return $excerpt;
}
// iframe を介して Discourse に埋め込まれた WordPress 投稿を表示する
// 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();
}

Discourse サイトのテーマで data 属性をターゲットにすることで、CSS を用いて投稿本文を非表示にできます。WordPress では、投稿の抜粋を data-hide="true" のような data 属性が設定された div で囲みます:

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

Discourse 側では、テーマに以下のようなコードを追加します:

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

これが SEO にどの程度効果があるかはわかりませんが、data 属性を使用するのは、WordPress から公開された投稿にスタイルを追加する良い方法です。

このテンプレートは単に抜粋を追加するだけではありませんか?それとも、WP Discourse の「完全な投稿を表示」設定が {excerpt} プレースホルダーに対して完全な投稿を表示するのでしょうか?

「excerpt」プレースホルダーは常に使用されます。「完全な投稿を表示」設定を選択した場合、プレースホルダーには完全な投稿が置き換えられます。