Используйте WP Discourse для публикации постов из WordPress в Discourse

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

Следующий шаг

После настройки публикации вы можете ознакомиться со следующими темами:


Инструкции

Настройки публикации

:warning: Убедитесь, что вы всегда сохраняете настройки после их изменения. Нажмите кнопку «Сохранить опции» в нижней части страницы.

Настройки должны быть относительно понятными. Если у вас возникли трудности с пониманием какой-либо из них, пожалуйста, ответьте на эту тему для получения дополнительных разъяснений.

Категория 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.

10 лайков

Можно ли импортировать ранее опубликованные записи блога? Например, записи за последние 30 дней? Просто чтобы немного наполнить эту категорию. Спасибо.

2 лайка

На данный момент опция массового импорта отсутствует. Вы всё равно можете это сделать, отредактировав каждый из старых постов и опубликовав их на Discourse.

2 лайка

Я настроил свои сайты так, чтобы в WordPress входило лишь несколько пользователей (авторы), тогда как Discourse открыт практически для всех. Для аутентификации используется Discourse.

Мне бы хотелось, чтобы темы, создаваемые из статей, отображали имя пользователя Discourse вместо «System» (или того, что установлено в поле Publishing Username).

Другими словами, Publishing Username установлено как «System». Джо Блоу публикует новую статью в WordPress. Джо Блоу существует в Discourse (поскольку аутентификация контролируется Discourse, все пользователи WordPress также являются пользователями Discourse). Я хочу, чтобы тема отображалась как опубликованная Джо Блоу, а не как System. Позже, на тех же сайтах, Джейн Доу публикует статью, и я хочу, чтобы тема в Discourse отображалась как опубликованная Джейн Доу, а не как System.

Возможно ли это реализовать?

Я не знаю. Но если вы зайдёте на вкладку Publish и там выберете последний пункт Single User API Key Publication, то это то, что я бы попробовал в первую очередь.

Если вы используете DiscourseSSO (или как там это называется сейчас или было раньше…), то никто не может зарегистрироваться на вашем форуме, не пройдя через WordPress. Так что, если WordPress управляет учётными записями редакторов на Discourse, как вы можете это сделать, не требуя сначала регистрации на WordPress для всех? Мне это интересно, потому что я мог бы использовать что-то подобное.

(И… я снова ушёл не по теме :man_facepalming:)

Я использовал настройку клиента DiscourseConnect. Она использует Discourse в качестве системы аутентификации и создаёт пользователя в WordPress, если его там ещё нет. Согласно инструкции к плагину:

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

Пользователи изначально будут назначаться в WordPress в роли «Подписчик», а я буду вручную менять их роль на «Автор» (по мере необходимости). Я планирую настроить сайт так, чтобы незарегистрированные пользователи могли просматривать весь контент, и регистрация в WordPress им понадобится только в том случае, если они захотят публиковать статьи.

Все пользователи в WordPress сначала должны зарегистрироваться в Discourse; затем коннектор автоматически либо выполнит вход в WP, либо создаст учётную запись и сразу выполнит вход.

Да, это так, но это полностью перекрывает все другие способы аутентификации, и обычный пользователь форума должен зарегистрироваться в WordPress, прежде чем получить доступ к Discourse.

Или я что-то неправильно понимаю?

Судя по тому, что я видел, обычный пользователь Discourse никогда не должен переходить на сайт WordPress. Если они решат перейти по ссылке с сайта Discourse, они автоматически регистрируются на сайте WordPress.

Вы можете посмотреть оба сайта, чтобы убедиться в этом. Имейте в виду, что они ещё не полностью готовы, но эта часть уже работает.
Https://forum.oursail.boats — это Discourse.
Https://www.oursail.boats — это сайт WordPress.

Создайте учётную запись на сайте WordPress. Вы сможете просматривать и отвечать на сообщения там.

Затем перейдите на сайт WordPress и выберите пункт меню «Войти». Это обойдёт вход в WordPress и вместо этого подключит вас к входу в Discourse (в зависимости от ваших настроек). Если вы выбрали опцию «Оставаться в системе», система даже не запросит данные. После входа вас сразу же вернёт на сайт WordPress.

Вам просто нужно убедиться, что у пользователей, публикующих статьи на WordPress, в профиле заполнено имя пользователя Discourse. Если у пользователя указано имя пользователя Discourse, его публикации в WordPress будут опубликованы в Discourse от его имени.

Вы можете обновить это вручную или автоматически с помощью вебхука Update Userdata (см. настройки «Webhooks» в плагине WP Discourse).

3 лайка

Прежде чем я начну вручную редактировать все 393 опубликованных поста на моём WP, я хотел бы ещё раз убедиться, что это всё ещё так? То есть, что опции массового импорта всё ещё нет? Спасибо!

Варианта массового импорта нет. Имейте в виду, что если вы опубликуете 393 поста в Discourse, у вас будет 393 черновика тем. Я бы посоветовал вам рассмотреть более целенаправленную стратегию. О чём именно будет обсуждать ваше сообщество сейчас?

2 лайка

Мне кажется, что они не будут. Discourse используется просто для замены комментариев, и больше ни для чего. Так что это не для Discourse, а для WordPress.

Я был в похожей ситуации. Поскольку большинство постов в WordPress по всему миру не получают никаких комментариев, а те, что есть, — это в основном шум, мой блог не был исключением. Но вместо того чтобы работать со всем контентом сразу, я использовал свой старый контент из WordPress, чтобы разбудить активность в Discourse. Я не подключал все посты сразу, а делал это постепенно. Например, сейчас у нас есть активные темы о тепловом ударе у собак и о том, сколько калорий нужно потреблять во время похода — это старые посты, которые обрели новую жизнь в Discourse.

Если бы была возможность подключить всё сразу, массово, я бы это сделал — не понимая, какой потенциал был упущен. Я даже могу сказать, что функция массовой загрузки была бы похоронена на шесть футов под землей, даже если бы вы могли её написать :wink:

2 лайка

Я просто пытаюсь перенести все комментарии в Discourse перед миграцией сайта с WordPress на Ghost, так как Ghost не поддерживает комментарии (хотя его можно подключить к Discourse для комментариев).

Но только что я подумал, что если сначала подключить мой новый Ghost к Discourse, а затем импортировать все мои сообщения из WordPress, это может сработать… возможно (/me уходит попробовать это сделать…)

Это не переносит комментарии из WordPress в Discourse. Оно просто отображает посты Discourse в WordPress.

Если я правильно понял…

1 лайк

Да, нет смысла связывать посты WordPress и темы Discourse, если вы собираетесь мигрировать на Ghost.

Всем привет!

Я только что завершил настройку своего сообщества на Discourse! Сейчас тестирую плагин WP Discourse на тестовом сайте.

У меня есть опасения по поводу возможных проблем с SEO. В частности, публикуя один и тот же контент из WordPress на Discourse, я беспокоюсь о дублировании контента, что может негативно сказаться на SEO. Помечает ли Discourse контент на форуме как копию с точки зрения SEO?

Привет, Виктор :slight_smile:

С точки зрения SEO с настройками по умолчанию у вас всё будет в порядке (так как это разные домены), но вы также можете установить канонический URL темы Discourse равным URL записи в WordPress.

Включите настройку сайта Discourse embed set canonical url, и постоянная ссылка записи WP станет каноническим URL темы Discourse (то есть она появится в разделе head HTML темы Discourse как каноническая ссылка).

Для получения дополнительной информации об этом см.

1 лайк

Спасибо @angus. Я очень это ценю. Для меня безопаснее взять под контроль SEO, чем оставлять всё на волю случая!

1 лайк

Я пытаюсь настроить разные категории для различных пользовательских типов записей (custom_post_types). Код ниже корректно выбирает категорию в админ-панели WordPress. Однако при публикации в Discourse категория там не устанавливается (и по умолчанию становится «без категории»)…

Возможно, я упускаю что-то очевидное?

// Установка категорий форума для пользовательских типов записей (CPT) в WP Discourse
 
add_filter( 'wp_discourse_publish_categories', 'radhr_filter_categories_policies', 10, 2 );
function radhr_filter_categories( $categories, $post ) {
	if ( 'policy' === get_post_type( $post ) ) {
		$output = [];
		foreach ( $categories as $category ) {
			if ( 'Policies' === $category['name']) {
				$output[] = $category;
			}
		}
		return $output;
	} 
	
	elseif ( 'guide' === get_post_type( $post ) ) {
		$output = [];
		foreach ( $categories as $category ) {
			if ( 'Guides' === $category['name']) {
				$output[] = $category;
			}
		}
		return $output;
	}
	
	elseif ( 'post' === get_post_type( $post ) ) {
		$output = [];
		foreach ( $categories as $category ) {
			if ( 'Blogs' === $category['name']) {
				$output[] = $category;
			}
		}
		return $output;
	}

	return $categories;
}

Вы сделали разумное предположение о том, как достичь своей цели, но wp_discourse_publish_categories будет работать ненадёжно, если вы фильтруете только одну категорию с помощью редактора Gutenberg.

Вместо этого используйте wpdc_publish_post_category:

Я обновлю исходный пост, чтобы отметить это.

1 лайк