Use WP Discourse para publicar posts do Wordpress no Discourse

Você pode usar o plugin WP Discourse para publicar posts do WordPress no seu Discourse, permitindo que sua comunidade discuta seu conteúdo do WordPress. Antes de configurar a publicação, você primeiro precisa instalar o plugin WP Discourse no WordPress e conectá-lo ao seu Discourse. Se você está pronto para começar, assista a este vídeo curto ou siga as instruções abaixo.

Próximo passo

Depois de configurar a publicação, você pode querer conferir os seguintes tópicos:


Instruções

Configurações de Publicação

:warning: Certifique-se de sempre salvar suas configurações após alterá-las. Clique no botão „Salvar Opções” na parte inferior da página.

As configurações devem ser relativamente autoexplicativas. Se tiver dificuldade em entender alguma delas, responda a este tópico para obter mais esclarecimentos.

Categoria Padrão do Discourse

Define a categoria padrão na qual seus posts serão publicados no Discourse. Essa configuração pode ser substituída para posts individuais na tela de criação de novos posts do WordPress.

Exibir Subcategorias

Indica se deseja ou não que as subcategorias do seu fórum estejam disponíveis como categorias para as quais você possa publicar a partir do WordPress. Você precisará salvar essa configuração antes que as subcategorias fiquem disponíveis no campo de entrada da opção Categoria Padrão do Discourse.

Forçar Atualização de Categoria

Use quando tiver adicionado novas categorias ao seu fórum e quiser que elas estejam disponíveis no seu site WordPress. Ativar essa configuração e salvar a página de opções fará uma única chamada à API do Discourse para recuperar as categorias do Discourse. Após ativá-la, na próxima vez que você navegar para a guia „Comentários”, encontrará a configuração desativada.

Permitir Tags

Ative esta opção se desejar adicionar tags aos tópicos do Discourse criados via WordPress.

Publicar como Tópicos Não Listados

Fará com que os posts publicados a partir do WordPress sejam não listados no Discourse. Se você ativar a configuração do webhook „Sincronizar Dados de Comentários”, os posts não listados ficarão visíveis quando receberem sua primeira resposta no Discourse.

Usar Conteúdo Completo do Post

Permite publicar posts completos do WordPress, em vez de trechos, no seu fórum Discourse. Para evitar que o botão „Mostrar Post Completo” apareça abaixo do seu post no Discourse, você deve desmarcar a configuração de site „embed truncate” no Discourse (encontrada em seuforum.com/admin/site_settings/category/posting).

Comprimento Personalizado do Trecho

Se você não selecionou a configuração „Usar Conteúdo Completo do Post”, essa configuração criará trechos desse comprimento para serem publicados no Discourse. Você também pode criar trechos manualmente ao criar um post no WordPress, adicionando o trecho à caixa de metadados „Trecho”.

Publicação Automática

Esta opção marca automaticamente a caixa de seleção „Publicar no Discourse” que aparece na tela de criação de novos posts para tipos de post que devem ser publicados no Discourse. A caixa de seleção ainda pode ser desmarcada ao criar o post.

Rastreamento Automático de Tópicos Publicados

Essa configuração está ativada por padrão. Quando ativada, o autor de um post publicado no Discourse a partir do WordPress será automaticamente „observador” do tópico (ele receberá notificações do Discourse sobre cada nova resposta).

Tipos de Post para Publicar

Essa configuração deve ser definida. O padrão é „post”, mas páginas e tipos de post personalizados também podem ser selecionados.

Excluir Posts por Tag

Se você adicionar tags do WordPress a essa configuração, qualquer post do WordPress com uma dessas tags não será publicado no Discourse.

Não Exibir Campo de Nome do Discourse

Isso ocultará o campo „Nome de Usuário do Discourse” nos perfis dos usuários. O Nome de Usuário do Discourse é usado para definir o autor do tópico ao publicar posts no Discourse.

Nome de Usuário do Discourse Editável

Isso determina se usuários não administradores podem editar seu próprio Nome de Usuário do Discourse no perfil. O Nome de Usuário do Discourse é usado para definir o autor do tópico ao publicar posts no Discourse.

Flags de Publicação Direta no Banco de Dados

Essa configuração é usada em certas configurações com ambientes WordPress especializados. Não use essa configuração a menos que saiba o que ela faz.

Logs de Publicação Verbosos

Ativar essa configuração fará com que todos os posts publicados no Discourse sejam registrados nos logs do WP Discourse, mesmo que tenham sido bem-sucedidos. Normalmente, apenas erros são registrados.

Habilitar postagem via XML-RPC

XML-RPC é uma chamada de procedimento remoto frequentemente usada por softwares de blog para enviar posts ao WordPress. Aplicativos que usam esse procedimento incluem o aplicativo de blog do wordpress.com blogging app.

Por padrão, o WP Discourse não publicará no Discourse posts criados via XML-RPC. O motivo é que não há uma boa maneira de indicar se um post publicado por meio de software de blog deve ser publicado no Discourse.

Se você deseja usar software de blog para criar posts que sejam publicados diretamente no Discourse, precisa adicionar algum código ao arquivo functions.php do seu tema que se conecte ao filtro wp_discourse_before_xmlrpc_publish. O filtro wp_discourse_before_xmlrpc_publish passa dois argumentos para as funções que se conectam a ele. O primeiro argumento, $publish_to_discourse, é um valor booleano definido como false para desativar a publicação via XML-RPC. O segundo argumento é o objeto post.

Para que todos os posts via XML-RPC sejam publicados automaticamente no Discourse, você precisa escrever uma função que sempre retorne true. Use algo como o código a seguir:

Aviso: isso fará com que todos os posts publicados via XML-RPC sejam publicados no Discourse, incluindo posts antigos que são editados no software de blog.

add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish', 10, 2 );
function my_namespace_xmlrpc_publish( $publish_to_discourse, $post ) {
  return true;
}

Filtrar posts via XML-RPC por tag do post

O aplicativo de blog do wordpress.com permite adicionar tags aos posts. As tags podem ser usadas para controlar se um post deve ou não ser publicado no Discourse. Para publicar apenas posts que tenham a tag „discourse”, use algo como isso:

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;
}

Se você deseja usar esse método, mas não quiser que a tag „discourse” apareça nos seus posts publicados, pode removê-la com um código como este:

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;
}

Filtrar posts via XML-RPC por data do post

Para permitir apenas que posts publicados após uma determinada data sejam publicados no Discourse via XML-RPC, adicione algum código como este ao seu arquivo functions.php. Este código permitirá que todos os posts publicados após 1º de janeiro de 2016 sejam publicados no Discourse.

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;
}

A fazer: adicionar um filtro ao plugin wp-discourse para permitir a publicação apenas de novos posts (em vez de posts editados) via XML-RPC.

Filtrar as categorias disponíveis para um tipo de post personalizado

Antes de as categorias do Discourse serem exibidas na caixa de metadados „Publicar no Discourse” na página admin/post-new do WordPress, o filtro do WordPress 'wp_discourse_publish_categories' é aplicado a elas. Ele recebe o array de categorias do Discourse e o post atual como argumentos. Isso pode ser usado no arquivo functions.php do seu tema para limitar quais categorias estão disponíveis para um determinado tipo de post.

Aqui está um exemplo que cria um tipo de post 'acme_product' e depois retorna as categorias do Discourse „fun” e „scratch” para serem exibidas na caixa de metadados „Publicar no Discourse” para posts desse tipo.

// Criar o tipo de post.
add_action(  'init', 'my_namespace_create_post_type' );
function my_namespace_create_post_type() {
  register_post_type( 'acme_product',
    array(
      'labels' => array(
      'name' => __( 'Produtos' ),
      'singular_name' => __( 'Produto' )
    ),
    'public' => true,
    'supports' => array( 'title', 'editor', 'comments', 'custom-fields' ),
    'has_archive' => true,
    'show_in_rest' => true,
    )
  );
}

// Filtrar as categorias disponíveis para o tipo de post '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;
}

Se você deseja aplicar estritamente uma categoria específica a tipos de post específicos (ou seja, 1:1), deve usar wpdc_publish_post_category em vez disso.

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' );

Exibir metadados de um tópico do Discourse conectado

Quando você tiver a publicação configurada, poderá exibir metadados sobre o tópico do Discourse usando Personalização de Modelos.

Primeiro, você precisa decidir qual modelo deseja modificar. Se, por exemplo, você quiser mostrar apenas metadados do tópico e nenhuma resposta como comentários, deverá modificar o modelo no_replies.

Depois de escolher um modelo, você pode modificá-lo para adicionar metadados do tópico do Discourse. Aqui está um trecho que faz isso, com alguns comentários explicando o que o código está fazendo:

// Certifique-se de que o wp-discourse está presente usando seu método preferido,
// ex. https://wordpress.stackexchange.com/questions/127818/how-to-make-a-plugin-require-another-plugin

// Requer as utilidades do plugin do plugin wp-discourse
require_once ABSPATH . 'wp-content/plugins/wp-discourse/lib/plugin-utilities.php';
use WPDiscourse\Shared\PluginUtilities;

// Encapsule seu modelo de metadados do tópico em uma classe para incluir facilmente as utilidades do plugin
class DiscourseTopicMetadata {
  
  // Inclua as utilidades do plugin WordPress em sua classe
  use PluginUtilities;
  
  public function __construct() {

    // Adicione o filtro de modelo na inicialização da classe
    add_filter( 'discourse_no_replies_html', array( $this, 'topic_metadata_html' ) );
  }

  function topic_metadata_html( $input ) {
    // Obtenha o permalink do Discourse dos metadados do post
    $discourse_permalink = get_post_meta( get_the_ID(), 'discourse_permalink', true );

    // Use o permalink do Discourse para obter o JSON do tópico do Discourse, usando o método auxiliar das utilidades do plugin, que lida com a autorização para você
    $topic = $this->get_discourse_topic($discourse_permalink);
   
    // Saída do seu markup, incluindo quais metadados do tópico você deseja exibir
    ob_start();
    ?>
    
    <div id="discourse-topic-meta">
        <div class="views">
          Visualizações
          <?php echo $topic->views; ?>
        </div>
        <div class="replies">
          Respostas
          <?php echo $topic->reply_count; ?>
        </div>
    </div>
    <?php
    
    return ob_get_clean();
  }
}

// Instancie a classe para adicionar o filtro
new DiscourseTopicMetadata();

Para mais detalhes sobre quais metadados do tópico estão disponíveis na resposta de get_discourse_topic, consulte Discourse API Docs.

10 curtidas

É possível importar posts de blog publicados anteriormente? Por exemplo, posts de blog dos últimos 30 dias? Apenas para popular um pouco essa categoria. Obrigado.

2 curtidas

No momento, não há uma opção de importação em massa. Você ainda pode conseguir isso editando cada uma das postagens mais antigas e publicando-as no Discourse.

2 curtidas

Estou configurando meus sites para que apenas algumas pessoas façam login no WordPress (autores), mas o Discourse está praticamente aberto a qualquer pessoa. O Discourse é usado para autenticação.

Gostaria que os tópicos criados a partir de artigos mostrassem o nome do usuário do Discourse em vez de “System” (ou o que quer que eu tenha definido como Publishing Username).

Em outras palavras, Publishing Username está definido como “System”. Joe Blow publica um novo artigo no WordPress. Joe Blow existe no Discourse (já que o Discourse controla a autenticação, todos os usuários do WordPress também são usuários do Discourse). Eu gostaria que o tópico fosse mostrado como postado por Joe Blow em vez de System. Mais tarde, nos mesmos sites, Jane Doe publica um artigo, eu gostaria que o tópico no Discourse fosse mostrado como postado por Jane Doe em vez de System.

Isso é possível?

Não sei. Mas se você verificar a aba Publish e lá a última opção Single User API Key Publication — isso é algo que eu tentaria primeiro.

Se você estiver usando DiscourseSSO (ou qualquer que seja o conector que ele é ou foi…) então ninguém pode se registrar no seu fórum sem passar pelo WordPress. Então, se o WordPress controla a conta dos editores no Discourse, como você faria isso sem exigir primeiro o registro no WordPress para todos? Estou curioso porque eu poderia usar algo assim.

(E… estou fora do tópico de novo :man_facepalming:)

Usei a configuração do cliente DiscourseConnect. Isso usa o Discourse como sistema de autenticação e cria o usuário no WordPress se ele não existir. Das instruções do plugin.

Habilitar seu site para funcionar como um cliente DiscourseConnect permite que a autenticação de usuários do WordPress seja tratada através do seu fórum Discourse ou do seu site WordPress. Se um usuário do Discourse fizer login no WordPress através de um link DiscourseConnect, ele será autenticado com base em suas credenciais do Discourse. Se esse usuário ainda não existir no seu site WordPress, um novo usuário será criado.

Os usuários serão inicialmente definidos como assinantes no WordPress, e eu os definirei manualmente como autores (conforme necessário). Planejo configurar o site de forma que usuários não registrados possam ver todo o conteúdo, e realmente só precisarão se registrar no WP se quiserem postar artigos.

Todos os usuários no WordPress terão que se registrar primeiro no Discourse, então o conector automaticamente os fará login no WP, ou criará uma conta e depois os fará login.

Sim, mas substitui todas as outras formas de autenticação, e então um usuário normal do fórum deve se registrar no WordPress antes de obter acesso ao Discourse.

Ou estou a entender mal alguma coisa?

Pelo que vi, um usuário regular do Discourse nunca precisa ir ao site do WP. Se eles decidirem seguir um link do site do Discourse, eles são registrados automaticamente no site do WP.

Sinta-se à vontade para ver os dois sites para ver do que estou falando. Tenha em mente que eles ainda não estão completos, mas essa parte funciona agora.
Https://forum.oursail.boats é o Discourse
Https://www.oursail.boats é o site do WP.

Crie uma conta no site do WP. Você poderá ver e responder às mensagens lá.

Em seguida, vá ao site do WP e selecione o item de menu Login. Ele contornará o login do WP e, em vez disso, o conectará ao login do Discourse (dependendo de suas configurações). Se você selecionou a opção para permanecer conectado, ele nem mesmo solicitará. Ele voltará imediatamente para o site do WP após o login.

Você só precisa garantir que os usuários que postam os artigos no Wordpress tenham o nome de usuário do Discourse preenchido no perfil do usuário. Se o usuário tiver um nome de usuário do Discourse, as postagens que ele fizer no Wordpress serão publicadas no Discourse usando o nome de usuário dele.

Você pode atualizar isso manualmente ou atualizá-lo automaticamente usando o webhook Update Userdata (consulte as configurações de “Webhooks” do WP Discourse).

3 curtidas

Antes de editar manualmente todas as 393 postagens publicadas no meu WP, eu só queria verificar novamente se isso ainda é o caso? Ou seja, que ainda não há opção de importação em massa? Obrigado!

Não há opção de importação em massa. Tenha em mente que, se você publicar 393 posts no Discourse, terá 393 tópicos rascunho. Eu aconselharia você a considerar uma estratégia mais direcionada. Sobre o que sua comunidade realmente vai discutir agora?

2 curtidas

Minha aposta é que eles não vão. O Discourse é apenas usado para substituir comentários, nada mais. Então, não é para o Discourse, mas para o WordPress.

Eu estava em uma situação semelhante. Como a maioria das postagens do WordPress no mundo não estão recebendo nenhum tipo de comentário, ou são mais ou menos apenas ruído, a minha não foi diferente. Mas em vez de trabalhar com todo o conteúdo, eu estava usando meu antigo WP-content para despertar atividade no Discourse. Eu não conectei todas as postagens de uma vez, mas gradualmente. Como agora existem tópicos ativos sobre insolação em cães e quantas calorias você deve comer em uma trilha — postagens antigas, que ganharam nova vida no Discourse.

Se houvesse uma opção para conectar tudo em massa, eu o faria — sem entender tal potencial perdido. Eu poderia até dizer, que enterre a opção em massa seis pés abaixo, mesmo que você pudesse codificá-la :wink:

2 curtidas

Estou apenas tentando importar todos os comentários para o Discourse antes de migrar o site do WordPress para o Ghost, já que o Ghost não lida com comentários (embora você possa conectá-lo ao Discourse para comentários).

Mas me ocorreu agora que, se eu primeiro conectar meu novo Ghost ao meu Discourse antes de importar todos os meus posts do WordPress, isso pode funcionar… talvez (/eu vou tentar isso…)

Ele não migra comentários do WP para o Discourse. Ele apenas exibe posts do Discourse no WordPress.

Se eu entendi corretamente…

1 curtida

Sim, não adianta vincular posts do Wordpress e tópicos do Discourse se você está prestes a migrar para o Ghost.

Olá a todos!

Acabei de concluir a configuração da minha comunidade com o Discourse! Atualmente estou testando o plugin WP Discourse no meu site de staging.

Tenho uma preocupação sobre potenciais problemas de SEO. Especificamente, ao publicar o mesmo conteúdo do WP no Discourse, preocupo-me com a duplicação de conteúdo em termos de SEO. O Discourse marca o conteúdo no fórum como cópia para fins de SEO?

Olá Victor :slight_smile:

Você deve ficar bem em termos de SEO com as configurações padrão (já que são domínios diferentes), mas você também pode definir a URL canônica do tópico do Discourse para ser a URL da postagem do WordPress.

Ative a configuração do site do Discourse embed set canonical url, então o permalink da postagem do WP será a URL canônica do tópico do Discourse (ou seja, aparecerá no head do HTML do tópico do Discourse como o link canônico).

Para mais contexto sobre isso, veja

1 curtida

Obrigado @angus. Eu realmente aprecio isso. Para mim, é mais seguro assumir o controle com SEO do que deixá-lo ao acaso!

1 curtida

Estou tentando definir categorias diferentes para diferentes custom_post_types. O código abaixo seleciona a categoria correta no administrador do WordPress. No entanto, ao publicar no Discourse, a categoria não é definida lá (e volta para não categorizado)…

Talvez eu esteja perdendo algo óbvio?

// WP Discourse define categorias de fórum CPT para CPTS
 
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;
}

Você fez uma suposição razoável sobre como atingir seu objetivo, mas wp_discourse_publish_categories não funcionará de forma confiável se você estiver filtrando para apenas uma categoria com o editor gutenberg.

Você deve usar wpdc_publish_post_category em vez disso:

Atualizarei o OP para observar isso.

1 curtida