Вы можете использовать плагин WP Discourse для публикации постов WordPress на ваш форум Discourse, чтобы ваше сообщество могло обсуждать ваш контент WordPress. Прежде чем настроить публикацию, вам сначала нужно установить плагин WP Discourse на WordPress и подключить его к вашему Discourse. Если вы готовы начать, посмотрите это короткое видео или следуйте инструкциям ниже.
Следующий шаг
После настройки публикации вы можете ознакомиться со следующими темами:
- Использование Discourse для комментариев WordPress
- Вход в Discourse через WordPress (DiscourseConnect)
Инструкции
Настройки публикации
Убедитесь, что вы всегда сохраняете настройки после их изменения. Нажмите кнопку «Сохранить опции» в нижней части страницы.
Настройки должны быть относительно понятными. Если у вас возникли трудности с пониманием какой-либо из них, пожалуйста, ответьте на эту тему для получения дополнительных разъяснений.
Категория Discourse по умолчанию
Устанавливает категорию по умолчанию, в которой ваши посты будут публиковаться на Discourse. Это настройку можно переопределить для отдельных постов на экране создания нового поста WordPress.
Отображение подкатегорий
Указывает, хотите ли вы, чтобы подкатегории вашего форума были доступны как категории, в которые можно публиковать из WordPress. Вам нужно сохранить эту настройку, прежде чем подкатегории станут доступны в поле выбора «Категория Discourse по умолчанию».
Принудительное обновление категории
Используется, когда вы добавили новые категории на свой форум и хотите, чтобы они были доступны на вашем сайте WordPress. Включение этой настройки и сохранение страницы опций выполняет один вызов API к Discourse для получения категорий Discourse. После включения при следующем переходе на вкладку «Комментирование» вы обнаружите, что настройка отключена.
Разрешить теги
Включите эту опцию, если хотите добавлять теги к темам Discourse, созданным через WordPress.
Публикация как невидимые темы
Позволяет публикациям из WordPress становиться невидимыми на Discourse. Если вы включите настройку веб-хука «Синхронизировать данные комментариев», невидимые посты станут видимыми, когда они получат первый ответ на Discourse.
Использовать полный контент поста
Позволяет публиковать полные посты WordPress, а не отрывки, на ваш форум Discourse. Чтобы кнопка «Показать полный пост» не отображалась под вашим постом на Discourse, вам нужно отключить настройку сайта «Обрезать встраиваемый контент» на Discourse (находится по адресу yourforum.com/admin/site_settings/category/posting).
Длина отрывка по умолчанию
Если вы не выбрали настройку «Использовать полный контент поста», эта настройка создаст отрывки указанной длины для публикации на Discourse. Вы также можете вручную создавать отрывки при создании поста WordPress, добавляя их в мета-блок «Отрывок».
Автоматическая публикация
Эта опция предварительно отмечает чекбокс «Опубликовать на Discourse», который появляется на экране создания нового поста для типов постов, которые должны публиковаться на Discourse. Чекбокс всё ещё можно снять при создании поста.
Автоматическое отслеживание опубликованных тем
Эта настройка включена по умолчанию. При включении автор поста, опубликованного на Discourse из WordPress, автоматически становится «наблюдающим» за темой (он будет получать уведомления Discourse о каждом новом ответе).
Типы постов для публикации
Эта настройка обязательна. По умолчанию установлено значение post, но также могут быть выбраны страницы и пользовательские типы постов.
Исключить посты по тегу
Если вы добавите теги WordPress в эту настройку, любые посты WordPress с одним из этих тегов не будут опубликованы на Discourse.
Не отображать поле имени пользователя Discourse
Это скроет поле «Имя пользователя Discourse» в профилях пользователей. Имя пользователя Discourse используется для установки автора темы при публикации постов на Discourse.
Редактируемое имя пользователя Discourse
Определяет, могут ли пользователи без прав администратора редактировать своё имя пользователя Discourse в своём профиле. Имя пользователя Discourse используется для установки автора темы при публикации постов на Discourse.
Флаги прямой публикации через базу данных
Эта настройка используется в определённых конфигурациях со специализированными средами WordPress. Не используйте эту настройку, если не знаете, что она делает.
Подробные журналы публикации
Включение этой настройки означает, что все посты, опубликованные на Discourse, будут записываться в журналы WP Discourse, даже если они успешны. Обычно логируются только ошибки.
Включение публикации через XML-RPC
XML-RPC — это вызов удалённой процедуры, который часто используется программным обеспечением для блогов для отправки постов в WordPress. Приложения, использующие эту процедуру, включают приложение для блогов wordpress.com.
По умолчанию WP Discourse не будет публиковать на Discourse посты, созданные через XML-RPC. Причина этого в том, что нет хорошего способа указать, предназначен ли пост, опубликованный через программное обеспечение для блогов, для публикации на Discourse.
Если вы хотите использовать программное обеспечение для блогов для создания постов, которые напрямую публикуются на Discourse, вам нужно добавить код в файл functions.php вашей темы, который подключается к фильтру wp_discourse_before_xmlrpc_publish. Фильтр wp_discourse_before_xmlrpc_publish передаёт функциям, подключающимся к нему, два аргумента. Первый аргумент, $publish_to_discourse, — это булево значение, установленное в false, чтобы отключить публикацию через XML-RPC. Второй аргумент — объект post.
Чтобы все посты XML-RPC автоматически публиковались через Discourse, вам нужно написать функцию, которая всегда возвращает true. Используйте что-то вроде следующего кода:
Предупреждение: это приведёт к тому, что все посты, опубликованные через XML-RPC, будут опубликованы на Discourse, включая старые посты, отредактированные в программном обеспечении для блогов.
add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish', 10, 2 );
function my_namespace_xmlrpc_publish( $publish_to_discourse, $post ) {
return true;
}
Фильтрация постов XML-RPC по тегу поста
Приложение для блогов wordpress.com позволяет добавлять теги к постам. Теги можно использовать для контроля того, будет ли пост опубликован на Discourse. Чтобы публиковать только посты с тегом «discourse», используйте что-то вроде этого:
add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish_by_tag', 10, 2 );
function my_namespace_xmlrpc_publish_by_tag( $publish_to_discourse, $post ) {
if ( has_tag( 'discourse', $post ) ) {
return true;
}
return false;
}
Если вы хотите использовать этот метод, но не хотите, чтобы тег discourse отображался в ваших опубликованных постах, вы можете удалить его с помощью кода, подобного этому:
add_filter( 'term_links-post_tag', 'my_prefix_remove_discourse_tag' );
function my_prefix_remove_discourse_tag( $tags ) {
foreach( $tags as $key => $value ) {
if ( strpos( $value, 'discourse' ) ) {
unset( $tags[ $key ] );
}
}
return $tags;
}
Фильтрация постов XML-RPC по дате поста
Чтобы разрешить публикацию на Discourse через XML-RPC только постов, опубликованных после определённой даты, добавьте в файл functions.php код, подобный этому. Этот код позволит публиковать на Discourse все посты, опубликованные после 1 января 2016 года.
add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish_by_date', 10, 2 );
function my_namespace_xmlrpc_publish_by_date( $publish_to_discourse, $post ) {
if ( strtotime( $post->post_date ) > strtotime( '2016-01-01') ) {
return true;
}
return false;
}
Задача: добавить фильтр в плагин wp-discourse, чтобы разрешить публикацию только новых постов (а не отредактированных) через XML-RPC.
Фильтрация доступных категорий для пользовательского типа поста
Прежде чем категории Discourse будут отображены в мета-блоке «Опубликовать на Discourse» на странице admin/post-new WordPress, к ним применяется фильтр WordPress 'wp_discourse_publish_categories'. Ему передаются массив категорий Discourse и текущий пост в качестве аргументов. Это можно использовать в файле functions.php вашей темы, чтобы ограничить доступные категории для данного типа поста.
Вот пример, который создаёт тип поста 'acme_product', а затем возвращает категории Discourse «fun» и «scratch» для отображения в мета-блоке «Опубликовать на Discourse» для постов этого типа.
// Создание типа поста.
add_action( 'init', 'my_namespace_create_post_type' );
function my_namespace_create_post_type() {
register_post_type( 'acme_product',
array(
'labels' => array(
'name' => __( 'Products' ),
'singular_name' => __( 'Product' )
),
'public' => true,
'supports' => array( 'title', 'editor', 'comments', 'custom-fields' ),
'has_archive' => true,
'show_in_rest' => true,
)
);
}
// Фильтрация доступных категорий для типа поста 'acme_product'.
add_filter( 'wp_discourse_publish_categories', 'my_namespace_filter_categories', 10, 2 );
function my_namespace_filter_categories( $categories, $post ) {
if ( 'acme_product' === get_post_type( $post ) ) {
$output = [];
foreach ( $categories as $category ) {
if ( 'fun' === $category['name'] || 'scratch' === $category['name'] ) {
$output[] = $category;
}
}
return $output;
}
return $categories;
}
Если вы хотите строго применять конкретную категорию к определённым типам постов (то есть 1:1), используйте вместо этого wpdc_publish_post_category.
function wpdc_change_post_category( $category, $post_id ) {
if ( 'acme_product' === get_post_type( $post ) ) {
$categories = WPDiscourse\Utilities\Utilities::get_discourse_categories();
$fun_category = array_search( 'fun' , array_column( $categories, 'name' ));
return $fun_category;
} else {
return $category;
}
}
add_filter( 'wpdc_publish_post_category', 'wpdc_change_post_category' );
Отображение метаданных связанной темы Discourse
Когда публикация настроена, вы можете отображать метаданные о теме Discourse, используя кастомизацию шаблонов.
Сначала нужно решить, какой шаблон вы хотите изменить. Если, например, вы хотите показывать только метаданные темы, но не ответы в качестве комментариев, вам нужно изменить шаблон no_replies.
После выбора шаблона вы можете изменить его, добавив метаданные темы Discourse. Вот фрагмент кода, который это делает, с комментариями, объясняющими, что делает код:
// Убедитесь, что wp-discourse присутствует, используя предпочитаемый вами метод,
// например, https://wordpress.stackexchange.com/questions/127818/how-to-make-a-plugin-require-another-plugin
// Подключите утилиты плагина из плагина wp-discourse
require_once ABSPATH . 'wp-content/plugins/wp-discourse/lib/plugin-utilities.php';
use WPDiscourse\Shared\PluginUtilities;
// Инкапсулируйте шаблон метаданных темы в класс, чтобы легко включить утилиты плагина
class DiscourseTopicMetadata {
// Включите утилиты плагина WordPress в ваш класс
use PluginUtilities;
public function __construct() {
// Добавьте фильтр шаблона при инициализации класса
add_filter( 'discourse_no_replies_html', array( $this, 'topic_metadata_html' ) );
}
function topic_metadata_html( $input ) {
// Получите постоянную ссылку на Discourse из метаданных поста
$discourse_permalink = get_post_meta( get_the_ID(), 'discourse_permalink', true );
// Используйте постоянную ссылку на Discourse для получения JSON темы из Discourse, используя вспомогательный метод из утилит плагина, который обрабатывает авторизацию за вас
$topic = $this->get_discourse_topic($discourse_permalink);
// Выведите вашу разметку, включая метаданные темы, которые вы хотите отобразить
ob_start();
?>
<div id="discourse-topic-meta">
<div class="views">
Просмотры
<?php echo $topic->views; ?>
</div>
<div class="replies">
Ответы
<?php echo $topic->reply_count; ?>
</div>
</div>
<?php
return ob_get_clean();
}
}
// Создайте экземпляр класса, чтобы добавить фильтр
new DiscourseTopicMetadata();
Для получения дополнительных сведений о доступных метаданных темы в ответе от get_discourse_topic см. Discourse API Docs.

