WP Discourse - Настройка шаблонов

Пример использования: В моих записях WordPress есть ссылки на YouTube. Я хочу, чтобы после публикации записи в WordPress видео с YouTube автоматически появлялось в соответствующей записи на Discourse.

Проблема: Похоже, это не работает, потому что после синхронизации HTML-код записи на Discourse выглядит так:

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

Видео с YouTube появится успешно, только если я удалю теги <p></p>.

Итак, как мне удалить теги <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' );

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

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>Оригинальная публикация на {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;
}

Это должно сработать, если видео встроены на вашем сайте WordPress. Возможно, потребуется несколько попыток, чтобы правильно настроить форматирование. Основная проблема, с которой я столкнулся, заключалась в том, что если перед тегом iframe YouTube есть пробелы, Discourse интерпретирует это как код.

Дайте знать, если этот подход не сработает на вашем сайте.

Мне бы хотелось, чтобы при нажатии пользователями кнопки «Показать полный пост» в Discourse для раскрытия поста из WordPress отображались видео с YouTube. Однако я не уверен, что это вообще возможно.

Привет, Саймон.

Спасибо за ответ. Очень ценю вашу помощь.

Но, похоже, это не работает.

Вывод был таким:

<small>Оригинальная публикация на http://staging.a1.sg/matrix/</small><br><br><iframe title="GCE O-Level 
A-Maths: Matrix & 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 & 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>

Я также добавил дополнительный код в файл functions.php после попытки вышеуказанного решения, чтобы убедиться, что ссылка на YouTube остается строкой.

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>Оригинальная публикация на http://staging.a1.sg/matrix/</small><br><br>. 
<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

Т.е. если я удалю теги p, ссылка автоматически встроится в Discourse. Но это всё ещё ручной процесс.

Или есть способ массово создавать посты в Discourse, используя данные из Google Таблиц?

Так я смогу отказаться от WordPress.

Аналог в WordPress — wpallimport.com

Вывод из вашего первого примера кода выглядит близко к тому, что я ожидал. Думаю, проблема в том, что вам нужно добавить https://www.youtube.com/embed в настройку сайта Discourse «Разрешённые iframe». Это позволит iframe, находящемуся в разметке поста, отображаться как видеоплеер на Discourse.

Работает прекрасно!!! Спасибо!!!

Но у меня два встраиваемых элемента вместо одного.

Вывод ниже. Что-то не так с кодом, который вы мне предложили?

<small>Опубликовано изначально на 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>Опубликовано изначально на {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;

Попробуйте сейчас опубликовать пост без использования пользовательского шаблона. Возможно, всё, что требовалось сделать, — это добавить https://www.youtube.com/embed в настройку сайта Discourse разрешённые iframe.

Какой редактор вы используете на своём сайте WordPress: старый Classic Editor или новый Block Editor? Также публикуете ли вы в Discourse полный пост или только его отрывок?

Это можно сделать, написав небольшой скрипт для публикации постов из CSV-файла.

  1. Всё работает. Спасибо, Саймон. Есть ли способ убрать ссылку обратно на WordPress? Как показано на скриншоте ниже.

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

Думаю, самый быстрый способ — скрыть это с помощью CSS.

Чтобы предотвратить появление ссылки на ваш домен WordPress под заголовком темы, снимите флажок «Добавить рекомендуемые ссылки» на странице настроек публикации WP Discourse. Чтобы удалить рекомендуемую ссылку из уже опубликованных постов, её можно либо скрыть с помощью CSS, либо удалить из базы данных вашего сайта Discourse. В ближайшие пару дней я буду отсутствовать на работе, но смогу помочь вам с этим, когда вернусь в среду.

Если вы можете подождать до среды, я смогу помочь вам с этим. Если вам нужно сделать это раньше, вы можете создать новую тему в нашей категории Support с вопросом о том, как создавать темы через API из CSV-файла.