Comprimento do trecho personalizado não está funcionando para mim

Estou tentando reduzir o número de palavras que aparecem em "Discours" quando publico um artigo no WordPress. Mas em vez disso, não vejo uma única palavra :slight_smile:


2 curtidas

Você está usando o editor de Blocos ou o antigo editor Clássico para publicar a postagem?

Você consegue compartilhar um link para a postagem? Isso pode dar algumas pistas sobre o que está dando errado.

O que acontece se você tentar adicionar manualmente um trecho à postagem:

Obrigado pela sua resposta. Ainda estamos usando o editor clássico.
Isso está acontecendo conosco atualmente para todos os artigos, mas aqui estão os links:

Não sei se entendi completamente como adicionar um trecho manualmente.

Não usamos “Resumo” para posts no WordPress há alguns anos, eu não entendi isso de imediato.

Mas parece que quando preencho “manualmente” no WordPress, tudo funciona bem.

Existe alguma solução para que as primeiras X palavras sejam enviadas para o Discourse sem ter que preencher manualmente o “Resumo”?

1 curtida

Isso faz sentido. A lógica que é usada para criar o trecho é diferente quando o trecho é criado manualmente do que quando o plugin WP Discourse analisa o trecho do conteúdo da postagem.

Deve funcionar agora, mas pode haver um conflito em seu site entre o plugin Discourse e outro plugin que você instalou no site. Outra possibilidade é que você esteja usando shortcodes na postagem que não estão sendo analisados corretamente quando o plugin Discourse tenta criar o trecho.

Você está usando shortcodes em suas postagens?

Para minha própria referência, o problema parece estar aqui: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub. Estou assumindo que algo está dando errado em relação à chamada para $excerpt = apply_filters( 'the_content', $raw );

3 curtidas

Sim, usamos shortcodes. Tentarei desativá-los temporariamente e verei o que acontece. Obrigado pelas instruções. Avisarei o que encontrarmos.

1 curtida

Se eu desativar a maioria dos plugins no site, tudo parece funcionar corretamente. Obrigado pelas instruções. Vou procurar o plugin problemático :slight_smile:

2 curtidas

Algumas horas depois :). Já encontrei o culpado, o plugin Lnk.Bio – Plugin WordPressu | WordPress.org Česko faz isso, alguma ideia de como consertar?

1 curtida

O plugin LnkBio tem uma função que se conecta à ação 'wp_insert_post'. Essa função chama unset($post->post_content) no objeto $post do WordPress. Teoricamente, isso não deveria remover o atributo post_content da postagem fora da função LnkBio, mas quando testo isso localmente (simulando as chamadas de API do plugin LnkBio), a chamada para unset($post->post_content) está removendo o conteúdo da postagem para o plugin WP Discourse aqui: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub.

Isso só acontece quando as postagens são publicadas com o Editor Clássico. Se as postagens são publicadas com o Editor de Blocos, o conteúdo da postagem está disponível para o plugin WP Discourse. Presumo que isso ocorra porque as postagens publicadas com o Editor de Blocos são publicadas por meio de uma solicitação REST.

Observe que estou encontrando o problema de nenhum conteúdo ser publicado no Discourse tanto quando defino um comprimento de resumo personalizado quanto quando seleciono a opção “Usar Conteúdo Completo da Postagem” do WP Discourse.

A correção mais fácil seria mudar para o uso do Editor de Blocos.

Outra opção seria entrar em contato com o LnkBio e informá-los sobre o problema. Eles poderiam corrigir isso encontrando uma maneira mais segura de analisar o conteúdo da postagem para sua solicitação de API:

function lnkbio_api_sync($post_id, $post, $update) {
	unset($post->post_content);
	if ($post->post_status === 'publish') {
		if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
			return;
		}
		// url definida como `example.com` para testes sem uma conta lnkbio
		wp_remote_post(
			'http://example.com',
			[
				'blocking' => false,
				'body' => [
					'ACTION' 	=> 'WP_sync',
					'post_id' 	=> $post_id,
					'post'    	=> json_encode($post),
					'id'		=> get_option('lnkbio_id'),
					'secret' 	=> get_option('lnkbio_secret'),
					'permalink' => get_permalink($post),
					'is_pub'	=> true,
					'image'		=> get_the_post_thumbnail_url($post_id, 'full'),
					'group_id' 	=> get_option('lnkbio_group'),
				]
			]
		);
	}
}

Editar: você também poderia simplesmente editar o código do plugin LnkBio para remover a chamada para unset($post->post_content); e, em seguida, encontrar uma maneira de definir os valores apropriados para o objeto $post que é usado aqui:

'post' => json_encode($post)

Geralmente, editar plugins dessa maneira é uma má ideia, mas funcionaria se você for muito cuidadoso. Provavelmente, faça isso apenas se tiver uma maneira de testar suas alterações em um site que não seja de produção.

1 curtida

Olá,

Este é o mantenedor do plugin Lnk.Bio para WordPress.

A função lnkbio_api_sync está apenas usando a função unset na variável local $post e não deve afetar nenhum código fora da função.

A variável $post também não é passada por referência, então é definitivamente local apenas para essa função, caso contrário, afetaria o post/resumo em todo o código do WP.

Qualquer alteração que fizermos em $post é local apenas para essa função, a menos que o código do Discourse use variáveis globais de alguma forma?

Você tem uma instalação sandbox do Discourse para a qual possa compartilhar as credenciais da API para que possamos testar o plugin do Discourse localmente e como ele interage com nosso código?

Agradeço antecipadamente.

2 curtidas

Sim, era o que eu pensava.
O plugin WP Discourse usa global $post em três locais:

Não tenho certeza se isso pode ter algum impacto no que está acontecendo. Também não vejo uma boa maneira de evitar o uso de global $post nesses arquivos.

Isso é interessante: Global Variables « WordPress Codex

Recomenda-se aos desenvolvedores que considerem esta uma Lista de Nomes Reservados e não criem variáveis locais com os mesmos nomes em Plugins ou Temas. Sob algumas circunstâncias, o valor da variável global será substituído pelo valor da variável local, causando erros no WordPress Core que são difíceis de diagnosticar.

Acho que podemos ter encontrado um caso extremo.

Não tenho. Estou apenas fornecendo suporte gratuito aqui. Sei que você pode se inscrever para um teste gratuito em Discourse pricing | Discourse - Civilized Discussion. Escolha o plano Standard ou Business. Leva apenas alguns minutos para colocar um site no ar.

2 curtidas

Obrigado, agradeço o feedback.

Inscrevemo-nos para o teste como você sugeriu e conseguimos reproduzir o problema.

Descobrimos que mesmo renomear $post para $local_post ou similar não resolve o problema. A única solução alternativa que encontramos é json_encode e depois json_decode o conteúdo, para criar um objeto completamente separado. Muito feio.

No entanto, publicamos uma atualização para resolver essa incompatibilidade, mesmo que o design anterior estivesse 100% correto do ponto de vista do código.

Aqui está o patch que já foi publicado

-       unset($post->post_content);
+       $json = json_encode($post);
+       $local_post = json_decode($json);
+       unset($local_post->post_content);
        if ($post->post_status === 'publish') {
                if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
                        return;
@@ -138,7 +140,7 @@ function lnkbio_api_sync($post_id, $post, $update) {
                                'body' => [
                                        'ACTION'        => 'WP_sync',
                                        'post_id'       => $post_id,
-                                       'post'          => json_encode($post),
+                                       'post'          => json_encode($local_post),
                                        'id'            => get_option('lnkbio_id'),
                                        'secret'        => get_option('lnkbio_secret'),
                                        'permalink' => get_permalink($post),
1 curtida

Obrigado por fazer isso!

Pareceu correto para mim. Fiquei surpreso com o que estava acontecendo. Desculpe se pareci um pouco duro na minha postagem inicial sobre o problema. Eu estava quebrando a cabeça com isso por algumas horas.

4 curtidas

Você não foi nada duro, teve ótimas percepções.

Depois de trabalhar um pouco mais nisso, encontramos uma solução melhor e mais elegante usando a função clone.

Isso já foi publicado no plugin Lnk.Bio atualizado e o patch é simplesmente

diff --git a/lnk.bio.php b/lnk.bio.php
index 65759fc..cc0c0d2 100644
--- a/lnk.bio.php
+++ b/lnk.bio.php
@@ -126,8 +126,7 @@ function lnkbio_api_post(string $url, array $data) {
 }

 function lnkbio_api_sync($post_id, $post, $update) {
-       $json = json_encode($post);
-       $local_post = json_decode($json);
+       $local_post = clone($post);
        unset($local_post->post_content);
        if ($post->post_status === 'publish') {
                if (!get_option('lnkbio_id') || !get_option('lnkbio_secret')) {
4 curtidas

Muito obrigado a ambos, vocês têm minha admiração e respeito pela rapidez com que conseguiram detectar e resolver o problema. Vocês planejam incorporar oficialmente essa melhoria na atualização do plugin Link.Bio? Se sim, quando aproximadamente?

1 curtida

Parece que a atualização do plugin Lnk.Bio já foi feita e está funcionando bem (fiquei um pouco confuso com a versão do plugin que permaneceu inalterada). Obrigado.

1 curtida