WP Discourse - テンプレートのカスタマイズ

ユースケース: WordPress の投稿に YouTube リンクが含まれています。WordPress 投稿を公開した後、対応する Discourse 投稿に YouTube 動画が自動的に表示されるようにしたいです。

問題: 同期後、Discourse 投稿の HTML は以下のようになっているため、動作していないようです。

<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

<p></p> を削除しない限り、YouTube 動画は正しく表示されません。

では、<p></p> をどうやって削除すればよいでしょうか? 数千件の投稿がある可能性があるため、<p></p> タグを手動で削除したくありません。

<p></p> タグを functions.php ファイルで直接削除できるかどうかはわかりません。

カスタマイズチュートリアルに従いました。functions.php に含まれるコードは以下の通りです。

// Discourse に公開される投稿にアイキャッチ画像を追加します。
function my_namespace_publish_format( $input ) {
    ob_start();
    ?>
    {excerpt} **<-----ここで p タグを削除できますか?**
    <?php
    $output = ob_get_clean();
    
    // 注: 元の関数にあった apply_filters() の呼び出しは削除されています。
    return $output; 
}

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format' );
「いいね!」 1

動画の公開方法によっては、以下のようなコードを使用できるかもしれません。

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format', 10, 2 );
function my_namespace_publish_format( $input, $post_id ) {
	$post_content = apply_filters( 'the_content', get_post( $post_id )->post_content );
	$videos = get_media_embedded_in_content( $post_content );
	$video_string = '';
	foreach( $videos as $video ) {
	    $video_string .= $video . '<br>';
    }
    ob_start();

    echo '<small>Originally published at {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;
}

これは、動画が WordPress サイトに埋め込まれている場合に機能するはずです。フォーマットを正しくするには、試行錯誤が必要な場合があります。私が直面した主な問題は、Youtube の iframe タグの前に先頭のスペースがある場合、Discourse がそれをコードとして解釈してしまうことです。

このアプローチがあなたのサイトで機能しない場合は、お知らせください。

実現したいのは、Discourse の WordPress 投稿を拡張する「投稿全文を表示」ボタンをクリックした際に Youtube 動画が表示されるようにすることです。ただし、それが可能かどうかは確信が持てません。

「いいね!」 1

こんにちは、Simon

返信ありがとうございます。大変助かりました。

しかし、どうやらうまくいかないようです。

出力は以下の通りでした。

<small>Originally published at http://staging.a1.sg/matrix/</small><br><br><iframe title="GCE O-Level 
A-Maths: Matrix &amp; its Inverse" width="525" height="394" 
src="https://www.youtube.com/embed/alJEZwwtQ3U?feature=oembed" frameborder="0" 
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>. 
</iframe><br><p><iframe title="GCE O-Level A-Maths: Matrix &amp; its Inverse" width="525" 
height="394" src="https://www.youtube.com/embed/alJEZwwtQ3U?feature=oembed" frameborder="0" 
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>. 
</iframe></p>

上記の提案されたソリューションを試した後、YouTube リンクが文字列のままになるように保証するために、functions.php ファイルに追加のコードも追加しました。

remove_shortcode( 'embed' );
remove_filter( 'the_content', [ $GLOBALS['wp_embed'], 'autoembed' ], 8 );
remove_filter( 'the_content', [ $GLOBALS['wp_embed'], 'run_shortcode' ], 8 );
remove_action( 'edit_form_advanced', [ $GLOBALS['wp_embed'], 'maybe_run_ajax_cache' ] );

しかし、出力(以下に示す通り)には

タグも含まれています。前述の通り、Discourse の投稿内の

タグが問題の原因となっています。

<small>Originally published at http://staging.a1.sg/matrix/</small><br><br>. 
<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

つまり、

タグを削除すれば、リンクは Discourse 上で自動的に埋め込まれますが、それでもまだ手動のプロセスです。

Discourseで大量に投稿を作成する方法はありますか?Google スプレッドシートのデータを使用したいです。

これで、WordPressが不要になります。

WordPressにおける同等のツールは wpallimport.com です。

最初のコード例からの出力は、私が期待していたものに近いです。問題はおそらく、Discourse の「許可された iframe」サイト設定に https://www.youtube.com/embed を追加する必要があることです。これにより、投稿のマークアップにある iframe が Discourse 上でビデオプレーヤーとして表示されるようになります。

「いいね!」 3

美しく動作します!!!ありがとうございます!!!

ただし、1 つではなく 2 つの埋め込みが表示されています。

出力は以下の通りです。私が以前提案したコードに問題がありますか?

<small>Originally published at http://staging.a1.sg/beautiful/</small><br><br><iframe src="https://www.youtube.com/embed/alJEZwwtQ3U" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe><br><p><iframe src="https://www.youtube.com/embed/alJEZwwtQ3U" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format', 10, 2 );
function my_namespace_publish_format( $input, $post_id ) {
	$post_content = apply_filters( 'the_content', get_post( $post_id )->post_content );
	$videos = get_media_embedded_in_content( $post_content );
	$video_string = '';
	foreach( $videos as $video ) {
	    $video_string .= $video . '<br>';
    }
    ob_start();

    echo '<small>Originally published at {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;

カスタムテンプレートを使用せずに投稿を公開してみてください。おそらく、Discourse のサイト設定「許可されている iframe」に https://www.youtube.com/embed を追加するだけで解決した可能性があります。

WordPress サイトでどのエディターを使用していますか?従来のクラシックエディターですか、それとも新しいブロックエディターですか?また、Discourse に投稿しているのは完全な投稿ですか、それとも抜粋のみですか?

CSV ファイルから投稿を公開する小さなスクリプトを作成することで実現できます。

「いいね!」 1
  1. 動作しました。ありがとうございます、Simon。WordPress へのリンクを削除する方法はありますか?下のスクリーンショットの通りです。

  1. どのようなスクリプトを書くべきか、方向性やチュートリアルをご教示いただけますでしょうか?
「いいね!」 1

おそらく、CSSで非表示にするのが最速の方法でしょう。

トピックタイトルの下に WordPress ドメインへのリンクが表示されないようにするには、WP Discourse Publishing 設定ページで「Add Featured Links」オプションの選択を解除してください。既に公開された投稿からこのリンクを削除するには、CSS で非表示にするか、Discourse サイトのデータベースから直接削除する必要があります。私は今後数日間仕事から離れていますが、水曜日に仕事に戻った際にサポートいたします。

水曜日までお待ちいただけるようであれば、お手伝いいたします。それより早く対応が必要な場合は、Support カテゴリに新しいトピックを作成し、CSV ファイルから API を通じてトピックを作成する方法について質問してみてください。

「いいね!」 2