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. ومع ذلك، فإن معلمة src في إخراج الـ iframe فارغة. انظر هنا:

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

يمكنك إخفاء نص المنشور باستخدام CSS من خلال استهداف سمة data في موضوع موقع Discourse. في WordPress، قم بتغليف مقتطف المنشور داخل div بسمة data مضبوطة على شيء مثل 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();
}

في Discourse، أضف شيئًا مثل هذا إلى موضوعك:

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

لست متأكدًا من مدى فعالية هذا في تحسين محركات البحث (SEO)، لكن استخدام سمة data هو طريقة جيدة لإضافة أنماط إلى المنشورات المنشورة من WordPress.

ألا تقوم هذه القالب بإضافة مقتطف النص فقط؟ أم أن إعداد “عرض المنشور الكامل” في WP Discourse يعرض المنشور الكامل عند استخدام عنصر النائب {excerpt}؟

يُستخدم عنصر excerpt占位符 دائمًا. إذا اخترت إعداد ‘عرض المنشور الكامل’، فسيتم استبدال عنصر excerpt بالمنشور الكامل.