Поле отношения ACF в discourse_publish_format_html

Есть какие-нибудь идеи, как опубликовать запись в WordPress, содержащую поля отношений ACF?

Является ли iFrame моим лучшим вариантом?

Привет, Ричард,

Почти никогда :wink: И не в данном случае.

Не могли бы вы немного подробнее рассказать о вашей потребности и о том, что вы уже пробовали?

Как указано в заголовке вашей темы, вы можете использовать фильтр discourse_publish_format_html, чтобы изменить HTML записи перед её отправкой в Discourse. В документации ACF также есть хорошие примеры использования полей отношений ACF. Их можно применить вместе с фильтром discourse_publish_format_html.

У меня есть два пользовательских типа записей (CPT): Memes и People. У каждого из них есть поле связи ACF с именем meme_person. У мема может быть несколько связанных людей, а также у мема есть текстовое поле для комментария. Имя каждого человека — это заголовок записи 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 ? $title . ', ' : '';
			endforeach;
		endif;

        ob_start();
  
        <small>Оригинальная публикация на: {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. В некоторых других обсуждениях упоминалось, что теперь доступна возможность поиска по Post ID для других мета-полей. (Возможно, об этом стоит упомянуть в теме «Настройка шаблона»)

Ваш первоначальный ответ в этой теме подтвердил возможность поиска по полям отношений, и вы спросили, что я уже пробовал.

Код, который я загрузил, — это то, что у меня есть на данный момент, и я хотел бы узнать ваше мнение по поводу строки foreach, так как именно этот момент в поиске по полям отношений вызывает у меня затруднения. Если у вас нет идей, я поищу elsewhere и вернусь с ответом сюда.

С уважением.

Для тех, кто хочет расширить поле связи ACF, вот что в итоге сработало, когда тип записи (CPT), который я отправляю в Discourse, называется memes и включает поле связи (в виде объекта) под названием meme_person, которое ссылается на другой тип записи people.

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' === $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>Опубликовано изначально на: {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  );