WP Discourse - Personalización de plantillas

Caso de uso: Tengo enlaces de YouTube en mis publicaciones de WordPress. Quiero que el video de YouTube aparezca automáticamente en la publicación correspondiente de Discourse después de publicar la entrada en WordPress.

Problema: Parece que no funciona porque, tras la sincronización, el HTML de la publicación en Discourse es:

<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

El video de YouTube solo se muestra correctamente si elimino las etiquetas <p></p>.

Entonces, ¿cómo elimino las etiquetas <p></p>? Espero no tener que eliminarlas manualmente, ya que podría tener miles de publicaciones.

No estoy seguro de si puedo eliminar las etiquetas <p></p> directamente en el archivo functions.php.

Seguí tu tutorial de personalización. Este es el código en functions.php:

// Agrega la imagen destacada a la publicación que se publica en Discourse.
function my_namespace_publish_format( $input ) {
    ob_start();
    ?>
    {excerpt} **<-----¿puedo eliminar las etiquetas p aquí?**
    <?php
    $output = ob_get_clean();
    
    // Nota: se ha eliminado la llamada a apply_filters() que estaba en la función original.
    return $output; 
}

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format' );
1 me gusta

Dependiendo de cómo se hayan publicado tus videos, es posible que puedas usar algo como esto:

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format', 10, 2 );
function my_namespace_publish_format( $input, $post_id ) {
	$post_content = apply_filters( 'the_content', get_post( $post_id )->post_content );
	$videos = get_media_embedded_in_content( $post_content );
	$video_string = '';
	foreach( $videos as $video ) {
	    $video_string .= $video . '<br>';
    }
    ob_start();

    echo '<small>Originalmente publicado en {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;
}

Esto debería funcionar si los videos están incrustados en tu sitio de WordPress. Puede que necesites probar y ajustar para obtener el formato correcto. El principal problema que encontré fue que, si hay espacios en blanco antes de la etiqueta iframe de YouTube, Discourse la interpretará como código.

Avísame si este enfoque no funciona en tu sitio.

Lo que me gustaría lograr es que los videos de YouTube se muestren cuando los usuarios hagan clic en el botón “Mostrar publicación completa” en Discourse para expandir una publicación de WordPress. Sin embargo, no estoy seguro de si eso será posible.

1 me gusta

Hola Simon

Gracias por responder. Agradezco mucho tu ayuda.

Pero parece que no funciona.

La salida fue:

<small>Originalmente publicado en http://staging.a1.sg/matrix/</small><br><br><iframe title="GCE O-Level 
A-Maths: Matrix &amp; su inversa" width="525" height="394" 
src="https://www.youtube.com/embed/alJEZwwtQ3U?feature=oembed" frameborder="0" 
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>. 
</iframe><br><p><iframe title="GCE O-Level A-Maths: Matrix &amp; su inversa" width="525" 
height="394" src="https://www.youtube.com/embed/alJEZwwtQ3U?feature=oembed" frameborder="0" 
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>. 
</iframe></p>

También agregué un código extra en el archivo functions.php después de probar la solución propuesta anteriormente, para asegurarme de que el enlace de YouTube se mantenga como una cadena.

remove_shortcode( 'embed' );
remove_filter( 'the_content', [ $GLOBALS['wp_embed'], 'autoembed' ], 8 );
remove_filter( 'the_content', [ $GLOBALS['wp_embed'], 'run_shortcode' ], 8 );
remove_action( 'edit_form_advanced', [ $GLOBALS['wp_embed'], 'maybe_run_ajax_cache' ] );

Pero la salida (como se muestra a continuación) también tiene etiquetas

. Como mencioné antes, las etiquetas

en las publicaciones de Discourse están causando el problema.

<small>Originalmente publicado en http://staging.a1.sg/matrix/</small><br><br>. 
<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

Es decir, si elimino las etiquetas

, el enlace se incrustará automáticamente en Discourse. Pero sigue siendo un proceso manual.

¿O hay alguna forma de crear publicaciones masivamente en Discourse usando datos de Google Sheets? De esta manera, podría prescindir de WordPress. El equivalente en WordPress es wpallimport.com.

La salida de tu primer ejemplo de código se parece mucho a lo que esperaba. Creo que el problema es que necesitas agregar https://www.youtube.com/embed a la configuración del sitio de Discourse allowed iframes. Esto permitirá que el iframe presente en el marcado del mensaje se muestre como un reproductor de video en Discourse.

3 Me gusta

¡Funciona maravillosamente!!! ¡Muchas gracias!!!

Pero hay dos incrustaciones en lugar de una.

La salida es la siguiente. ¿Hay algo mal con el código que me sugeriste?

<small>Originalmente publicado en http://staging.a1.sg/beautiful/</small><br><br><iframe src="https://www.youtube.com/embed/alJEZwwtQ3U" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe><br><p><iframe src="https://www.youtube.com/embed/alJEZwwtQ3U" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format', 10, 2 );
function my_namespace_publish_format( $input, $post_id ) {
	$post_content = apply_filters( 'the_content', get_post( $post_id )->post_content );
	$videos = get_media_embedded_in_content( $post_content );
	$video_string = '';
	foreach( $videos as $video ) {
	    $video_string .= $video . '<br>';
    }
    ob_start();

    echo '<small>Originalmente publicado en {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;

¿Podrías intentar publicar una publicación sin usar la plantilla personalizada ahora? Es posible que todo lo que necesitaba hacerse fuera agregar https://www.youtube.com/embed a la configuración del sitio iframes permitidos de tu Discourse.

¿Qué editor estás usando en tu sitio de WordPress, el antiguo Editor Clásico o el nuevo Editor de Bloques? Además, ¿estás publicando la publicación completa en Discourse o solo un extracto?

Esto podría hacerse escribiendo un pequeño script para publicar publicaciones desde un archivo CSV.

1 me gusta
  1. Funciona. Gracias, Simon. ¿Hay alguna forma de eliminar el enlace de regreso a WordPress? Como se muestra en la captura de pantalla a continuación.

  1. ¿Podrías indicarme hacia dónde dirigirme o proporcionarme un tutorial sobre qué tipo de script debería escribir?
1 me gusta

Supongo que la forma más rápida sería ocultarlo con CSS.

Para evitar que aparezca el enlace a tu dominio de WordPress debajo del título del tema, desmarca la opción “Add Featured Links” en la página de configuración de WP Discourse Publishing. Para eliminar el enlace destacado de los temas ya publicados, puedes ocultarlo con CSS o eliminarlo de la base de datos de tu sitio Discourse. Estaré fuera del trabajo durante los próximos días, pero podré ayudarte con esto cuando vuelva el miércoles.

Si puedes esperar hasta el miércoles, puedo echarte una mano con esto. Si necesitas hacerlo antes, podrías intentar crear un nuevo tema en nuestra categoría Support preguntando cómo crear temas a través de la API desde un archivo CSV.

2 Me gusta