discourse_publish_format_html における ACF Relationship フィールド

WP の投稿に ACF のリレーションシップフィールドを含めて公開する方法について、ご存知のことはありますか?

iFrame が最善策でしょうか?

こんにちはリチャードさん、

ほぼありえません :wink: 特にこのケースでは。

もう少し具体的なニーズについて詳しく教えていただけますか?また、これまで試したことも教えていただければ幸いです。

トピックのタイトルにもある通り、discourse_publish_format_html フィルターを使用して、Discourse に送信される前の投稿の HTML を変更できます。また、ACF のドキュメントには、ACF のリレーションシップフィールドの使い方の良い例がいくつか掲載されています。これらを discourse_publish_format_html フィルターと組み合わせて適用することができます。

2 つのカスタム投稿タイプ(CPT)「Memem」と「People」を持っています。それぞれに「meme_person」という ACF リレーションシップフィールドがあります。1 つのミームには複数の関連人物を関連付けることができ、ミームにはコメントテキストフィールドもあります。各人物の名前は、People 投稿のタイトルです。

Discourse には、ミーム画像の後にコメントと関連人物のリストを表示したいと考えています。

以下は、現在の試みですが、foreach 行が完全な推測なので未テストです。

この形式は正しいでしょうか?

// Discourse に投稿を公開する際

function rs_custom_publish_format_html( $output, $post_id ) {

	$post = get_post( $post_id );
	$type = get_post_type($post_id);
	
	// 代表画像がある場合はそれを使用
	if ( has_post_thumbnail( $post_id ) ) {
		$image = "{thumbnail}<br><br>";
	} else {
		$image = "";
	}

    // 投稿がミームの場合、カスタムフィールド情報を取得
    if ( 'memes' === $type) {
    	
		$comment = get_post_meta($post->ID, '_comment', true);
		$people = '';
		$meme_person = get_field('meme_person');
		if( $meme_person ):
			foreach( $meme_person as $people ):
				$title = get_the_title( $people->ID );
				$people .= $title ? ', ' : '';
			endforeach;
		endif;

        ob_start();
  
        <small>Originally published at: {blogurl}</small><br><br>
        <?php echo $image ?>
        <?php echo $comment ?><br>
        <?php echo $people ?>
        {excerpt}
	  
        <?php 
        $output = ob_get_clean();
        
        return $output;
    }
      
    // それ以外は返す
    ob_start();
    the_permalink( $post_id );
    $output = ob_get_clean();
    return $output;
    
}
add_filter( 'discourse_publish_format_html', 'rs_custom_publish_format_html', 10, 2  );

お恥ずかしい限りですが、すべてのコードのレビューを求めているのか、それとも Discourse フィルターの使用についてのみ確認したいのか、よくわかりません。フィルターが $output を変更し、テンプレートタグを使用して値を埋め込むことを期待しているという点では、この形式は正しいです。詳しくは、以下のトピックをご覧ください。

ありがとうございます。そのトピックには以下のように記載されています:「テンプレートでは、次のテンプレートタグが利用可能です:{excerpt}{blogurl}{author}{thumbnail}{featuredimage}

最初の読み取りでは、それらが渡せる唯一の要素だと思い込み、それが理由で当初は iFrame について質問しました。他のスレッドでは、投稿 ID による他のメタフィールドの検索機能も利用可能になったという情報が示されていました(おそらくテンプレートのカスタマイズに関するスレッドで言及されるべきかもしれません)。

このスレッドへのあなたの最初の回答では、リレーションシップフィールド全体を検索できることが確認され、これまで何を試したか尋ねられました。

私がアップロードしたコードは現在のところのものです。リレーションシップフィールドの検索において私が行き詰まっているのは foreach の行だけなので、何かご教示いただけないでしょうか。もしご存じない場合は、他で探してまたこちらに報告します。

ありがとうございました。

ACF のリレーションシップフィールドを拡張したい方のために、私が送信している CPT が memes で、そこには people という別の CPT へリンクする(オブジェクト形式の)リレーションシップフィールド meme_person が含まれている場合に、最終的に機能した方法を共有します。

function rs_custom_publish_format_html( $output, $post_id ) {

	$post = get_post( $post_id );
	$type = get_post_type($post_id);
	
	// 投稿画像がある場合はそれを使用
	if ( has_post_thumbnail( $post_id ) ) {
		$image = "{thumbnail}<br><br>";
	} else {
		$image = "";
	}

    // 投稿が meme の場合、カスタムフィールド情報を取得
    if ( 'memes' === $post->post_type) {
    	$comment = get_post_meta($post->ID, 'comment', true);
		$peopleout = ' ';

		$persons = get_post_meta($post->ID, 'meme_person', true);
		if( $persons ):
			foreach( $persons as $person ):
		        $title = get_the_title($person);
				$peopleout .= $title . ' ' ;
			endforeach;
		endif; ?>

        <?php ob_start(); ?>
  
        <small>Originally published at: {blogurl}</small><br><br>
        <?php echo $image ?>
        <?php echo $comment ?><br>
        <?php echo $peopleout ?>

        {excerpt}
	  
        <?php 
        $output = ob_get_clean();
        
        return $output;
    }
  
      
    // それ以外は返す
    ob_start();
    the_permalink( $post_id );
	$output = ob_get_clean();
	return $output;
    
}
add_filter( 'discourse_publish_format_html', 'rs_custom_publish_format_html', 10, 2  );