Longitud de extracto personalizada no me funciona

Estoy intentando reducir el número de palabras que aparecen en “Discours” cuando publico un artículo en WordPress. Pero en cambio, no veo ni una sola palabra :slight_smile:


2 Me gusta

¿Estás usando el editor de bloques o el editor clásico antiguo para publicar la entrada?

¿Puedes compartir un enlace a la entrada? Eso podría dar algunas pistas sobre lo que está saliendo mal.

¿Qué sucede si intentas agregar manualmente un extracto a la entrada?

Gracias por tu respuesta. Todavía estamos usando el editor clásico.
Nos está sucediendo actualmente para todos los artículos, pero aquí están los enlaces:

No sé si entiendo completamente cómo agregar un extracto manualmente.

Hace años que no usamos “Extracto” para las publicaciones en WordPress, no lo entendí de inmediato.

Pero parece que cuando relleno “manualmente” en WordPress, todo funciona bien.

¿Hay alguna solución para que las primeras X palabras se envíen a Discourse sin tener que rellenar manualmente el “Extracto”?

1 me gusta

Tiene sentido. La lógica que se utiliza para crear el extracto es diferente cuando el extracto se crea manualmente que cuando el plugin WP Discourse analiza el extracto del contenido de la publicación.

Debería funcionar ahora, pero puede haber un conflicto en tu sitio entre el plugin Discourse y otro plugin que tengas instalado. Otra posibilidad es que estés utilizando códigos cortos en la publicación que no se están analizando correctamente cuando el plugin Discourse intenta crear el extracto.

¿Estás utilizando códigos cortos en tus publicaciones?

Para mi propia referencia, el problema parece estar aquí: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub. Supongo que algo está saliendo mal en relación con la llamada a $excerpt = apply_filters( 'the_content', $raw );

3 Me gusta

Sí, usamos shortcodes. Intentaré deshabilitarlos temporalmente y ver qué sucede. Gracias por las indicaciones. Les informaré lo que encontremos.

1 me gusta

Si deshabilito la mayoría de los complementos del sitio, todo parece funcionar correctamente. Gracias por las indicaciones. Buscaré el complemento problemático :slight_smile:

2 Me gusta

Unas horas después :). Ya he encontrado al culpable, ¿el plugin Lnk.Bio – Plugin WordPressu | WordPress.org Česko lo hace? ¿Alguna idea de cómo solucionarlo?

1 me gusta

El plugin LnkBio tiene una función que se engancha a la acción 'wp_insert_post'. Esa función llama a unset($post->post_content) en el objeto $post de WordPress. Teóricamente, esto no debería eliminar el atributo post_content de la publicación fuera de la función LnkBio, pero cuando lo pruebo localmente (simulando las llamadas a la API del plugin LnkBio), la llamada a unset($post->post_content) está eliminando el contenido de la publicación para el plugin WP Discourse aquí: wp-discourse/lib/discourse-publish.php at main · discourse/wp-discourse · GitHub.

Esto solo sucede cuando las publicaciones se publican con el Editor Clásico. Si las publicaciones se publican con el Editor de Bloques, el contenido de la publicación está disponible para el plugin WP Discourse. Supongo que esto se debe a que las publicaciones publicadas con el Editor de Bloques se publican a través de una solicitud REST.

Tenga en cuenta que me encuentro con el problema de que no se publica contenido en Discourse tanto cuando establezco una longitud de extracto personalizada como cuando selecciono la opción “Usar contenido completo de la publicación” de WP Discourse.

La solución más fácil sería cambiar al uso del Editor de Bloques.

Otra opción sería contactar a LnkBio e informarles sobre el problema. Podrían solucionarlo encontrando una forma más segura de analizar el contenido de la publicación para su solicitud 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 establecida en `example.com` para pruebas sin cuenta de 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: también podría simplemente editar el código del plugin LnkBio para eliminar la llamada a unset($post->post_content); y luego encontrar una manera de establecer los valores apropiados para el objeto $post que se utiliza aquí:

'post' => json_encode($post)

En general, editar plugins de esta manera es una mala idea, pero funcionaría si tiene mucho cuidado. Probablemente solo haga esto si tiene una forma de probar sus cambios en un sitio que no sea de producción.

1 me gusta

Hola,

Este es el mantenedor del plugin Lnk.Bio para Wordpress.

La función lnkbio_api_sync solo utiliza la función unset en la variable local $post y no debería afectar a ningún código fuera de la función.
La variable $post tampoco se pasa por referencia, por lo que definitivamente es local a esa función, de lo contrario, afectaría a la publicación/extracto en todo el código de WP.

Cualquier cambio que hagamos en $post es local a esa función solamente, a menos que quizás el código de Discourse use de alguna manera variables globales.

¿Tienen una instalación sandbox de Discourse para la cual puedan compartir las credenciales de la API para que podamos probar el plugin de Discourse localmente y cómo interactúa con nuestro código?

Gracias de antemano.

2 Me gusta

Sí, eso es lo que pensaba.
El plugin WP Discourse utiliza global $post en tres lugares:

No estoy seguro de si esto podría tener algún impacto en lo que está sucediendo. Tampoco veo una buena manera de evitar el uso de global $post en esos archivos.

Esto es interesante: Global Variables « WordPress Codex

Se aconseja a los desarrolladores que consideren esta una Lista de Nombres Reservados y que no creen variables locales con los mismos nombres en Plugins o Temas. Bajo algunas circunstancias, el valor de la variable global será reemplazado por el valor de la variable local, causando errores en el Núcleo de WordPress que son difíciles de diagnosticar.

Creo que podríamos haber encontrado un caso límite.

No tengo. Solo estoy brindando soporte gratuito aquí. Sé que puedes registrarte para una prueba gratuita en Discourse pricing | Discourse - Civilized Discussion. Elige el plan Estándar o el de Negocios. Solo toma unos minutos poner en marcha un sitio.

2 Me gusta

Gracias, aprecio los comentarios.

Nos hemos registrado para la prueba como sugirió y pudimos reproducir el problema.

Descubrimos que incluso renombrar $post a $local_post o similar no resuelve el problema. La única solución alternativa que encontramos es json_encode y luego json_decode el contenido, para crear un objeto completamente separado. Muy feo.

Sin embargo, publicamos una actualización para resolver esta incompatibilidad, a pesar de que el diseño anterior era 100% correcto desde el punto de vista del código.

Aquí está el parche que ya se ha 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 me gusta

¡Gracias por hacer eso!

Me pareció correcto. Me sorprendió lo que estaba pasando. Lamento si mi publicación inicial sobre el problema sonó un poco dura. Había estado dándole vueltas durante unas horas para entonces.

4 Me gusta

No fuiste nada duro, tuviste grandes ideas.

Después de trabajar un poco más en ello, encontramos una solución mejor y más elegante usando la función clone.

Esto ya se ha publicado en el plugin Lnk.Bio actualizado y el parche es simplemente

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 Me gusta

Muchas gracias a ambos, tienen mi admiración y respeto por la rapidez con la que pudieron detectar y solucionar el problema. ¿Planean incorporar oficialmente esta mejora en la actualización del plugin Link.Bio? Si es así, ¿aproximadamente cuándo?

1 me gusta

Parece que la actualización del plugin Lnk.Bio ya está hecha y funciona bien (me confundí un poco porque la versión del plugin no cambió). Gracias.

1 me gusta