WP Discourse - Personnalisation des modèles

Cas d’usage : Il y a des liens YouTube dans mes articles WordPress. Je veux que la vidéo YouTube s’affiche automatiquement dans l’article Discourse correspondant après la publication de l’article WordPress.

Problème : Cela ne semble pas fonctionner car, après la synchronisation, le HTML de l’article Discourse est :

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

La vidéo YouTube ne s’affiche correctement que si je supprime les balises <p></p>.

Alors, comment supprimer les balises <p></p> ? J’espère ne pas avoir à supprimer manuellement les balises <p></p>, car j’ai peut-être des milliers d’articles.

Je ne suis pas sûr de pouvoir supprimer les balises <p></p> directement dans le fichier functions.php.

J’ai suivi votre tutoriel de personnalisation. Voici le code dans functions.php :

// Ajoute l'image mise en avant à l'article publié sur Discourse.
function my_namespace_publish_format( $input ) {
    ob_start();
    ?>
    {excerpt} **<-----puis-je supprimer les balises p ici ?**
    <?php
    $output = ob_get_clean();
    
    // Remarque : l'appel à apply_filters() présent dans la fonction d'origine a été supprimé.
    return $output; 
}

add_filter( 'discourse_publish_format_html', 'my_namespace_publish_format' );
1 « J'aime »

Selon la manière dont vos vidéos ont été publiées, vous pourriez être en mesure d’utiliser quelque chose comme ceci :

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>Publié à l'origine sur {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;
}

Cela devrait fonctionner si les vidéos sont intégrées sur votre site WordPress. Il se peut que vous ayez besoin de quelques essais et erreurs pour obtenir le bon formatage. Le principal problème que j’ai rencontré est que, s’il y a des espaces avant la balise iframe de YouTube, Discourse l’interprétera comme du code.

Faites-moi savoir si cette approche ne fonctionne pas sur votre site.

Ce que j’aimerais voir fonctionner, c’est l’affichage des vidéos YouTube lorsque les utilisateurs cliquent sur le bouton « Afficher l’article complet » dans Discourse pour étendre un article WordPress. Je ne suis pas sûr que cela soit possible, cependant.

1 « J'aime »

Salut Simon,

Merci d’avoir répondu. J’apprécie énormément ton aide.

Mais cela ne semble pas fonctionner.

La sortie était :

<small>Publié à l'origine sur http://staging.a1.sg/matrix/</small><br><br><iframe title="GCE O-Level 
A-Maths: Matrix &amp; its Inverse" 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; its Inverse" 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>

J’ai également ajouté un code supplémentaire dans le fichier functions.php après avoir essayé la solution proposée ci-dessus, afin de m’assurer que le lien YouTube reste une chaîne de caractères.

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

Mais la sortie (comme montré ci-dessous) contient aussi des balises

. Comme mentionné précédemment, les balises

dans les publications Discourse posent problème.

<small>Publié à l'origine sur http://staging.a1.sg/matrix/</small><br><br>. 
<p>https://www.youtube.com/watch?v=alJEZwwtQ3U</p>

C’est-à-dire que si je supprime les balises

, le lien s’intègre automatiquement sur Discourse. Mais c’est toujours un processus manuel.

ou existe-t-il un moyen de créer des posts en masse sur Discourse en utilisant des données provenant de Google Sheets ?

De cette façon, je pourrais me passer de WordPress.

L’équivalent sur WordPress est wpallimport.com

La sortie de votre premier exemple de code ressemble à ce que j’attendais. Je pense que le problème vient du fait que vous devez ajouter https://www.youtube.com/embed à votre paramètre de site Discourse iframes autorisées. Cela permettra à l’iframe présente dans le balisage du message de s’afficher sous forme de lecteur vidéo sur Discourse.

3 « J'aime »

Ça fonctionne à merveille !!! Merci !!!

mais il y a deux embeds au lieu d’un seul.

le résultat est ci-dessous. y a-t-il un problème avec le code que vous m’avez suggéré ?

<small>Publié à l'origine sur 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>Publié à l'origine sur {blogurl}</small><br><br>';
    echo $video_string;
    echo '{excerpt}';
    $output = ob_get_clean();

    return $output;

Pourriez-vous essayer de publier un message sans utiliser le modèle personnalisé maintenant ? Il se peut que tout ce qui devait être fait était d’ajouter https://www.youtube.com/embed à votre paramètre de site Discourse iframes autorisées.

Quel éditeur utilisez-vous sur votre site WordPress, l’ancien Éditeur classique ou le nouvel Éditeur par blocs ? Publiez-vous également le message complet sur Discourse, ou seulement un extrait ?

Cela pourrait être réalisé en écrivant un petit script pour publier des messages à partir d’un fichier CSV.

1 « J'aime »
  1. Ça fonctionne. Merci Simon. Y a-t-il un moyen de supprimer le lien retour vers WordPress, comme illustré sur la capture d’écran ci-dessous ?

  1. Pourriez-vous s’il vous plaît m’orienter vers une ressource ou un tutoriel indiquant quel type de script il faudrait écrire ?
1 « J'aime »

Je suppose que le moyen le plus rapide serait de le masquer avec du CSS.

Pour empêcher l’apparition du lien vers votre domaine WordPress sous le titre du sujet, désactivez l’option « Ajouter des liens mis en avant » sur votre page de paramètres de publication WP Discourse. Pour supprimer le lien mis en avant des publications déjà publiées, vous pouvez soit le masquer avec du CSS, soit le retirer de la base de données de votre site Discourse. Je serai absent du travail pendant les prochains jours, mais je pourrai m’en occuper dès mon retour mercredi.

Si vous pouvez attendre jusqu’à mercredi, je pourrai vous aider à le faire. Si vous devez le faire plus tôt, vous pourriez essayer de créer un nouveau sujet dans notre catégorie Support en demandant comment créer des sujets via l’API à partir d’un fichier CSV.

2 « J'aime »