Bonjour à tous,
j'ai utilisé le WpGet de Peter Unfold : http://peter.upfold.org.uk/projects/wpget, qui marche très bien pour mettre en place un flux rss sur mon site, mais dans le contenu d'un article, il affiche également les shortcodes caption (légendes d'images), ce que je voudrais éviter :

RECENT POSTS : 

Hitting the road with Shane Conroy
Hi!
I'm Shane Conroy 22 years young from Berkley Vale, NSW and I'm going on a roadtrip around the country.
[b][caption id="attachment_1190" align="aligncenter" width="300"] Shane Conroy - Youngroys Adventures[/caption][/b]
I'm chasing my childhood dream of escaping the everyday...
Posted on 20/02/2014 10:29 by wetravelcoblog.
1 comment.


Quelqu'un aurait une solution?
merci d'avance!

petite précision : les articles du flux sont ceux d'un blog wordpress, et le flux est affiché sur un site distant.
en gros je veux supprimer toute la ligne que j'ai mise en gras : c'est-à-dire les balises caption mais également le contenu entre ces balises..

Merci à celle/celui qui m'aidera!
Modérateur
Je ne connais pas ce WPGet.
Il faudrait que tu trouves la partie du script qui s'occupe de générer le XML. Ensuite tu vas procéder à un assainissement de ce qui doit se trouver dans la description en utilisant par exemple la fonction preg_replace (en remplaçant ton shortcode par une chaîne de caractères vide. Quelque chose comme ça (j'ai repris un exemple de la page de doc de preg_replace et l'ai modifié) :
$content = 'Le contenu avec ton éventuel shortcode'; // En principe tu devras trouver une variable qui contient ça dans WPGet
$pattern = '/la regexp qui va bien pour repérer tes shortcodes/'; // regexp à dfinir... [cligne]
$replacement = ''; // Chaîne vide
$new_content =  preg_replace($pattern, $replacement, $content);

Ce serait bien si on pouvait voir la paryie du script qui s'occupe de générer la description, on pourra mieux t'aider.
Merci pour ta réponse!

J'ai rajouté :
$content = preg_replace('#\[caption[^\]]*\]([^\[]*)\[/caption\]#','', $content);

Ça masque bien le premier shortcode caption de chaque contenu d'article mais pas les autres :
Je ne vois pas pourquoi..une idée?

Voici ce que ça donne :

The Roadtrip Diaries - The end of the beginning...
Our last day of The Roadtrip Diaires project started with an early morning hike down to treachery. (ICI LE 1ER CAPTION EST BIEN MASQUÉ) The Frenchies got wet and surfed, while we enjoyed being immersed in the yellow, blue and green contrast of nature that surrounded us.[b][caption id="attachment_1157" align="aligncenter" width="300"][/b] Yet...
Posted on 14/12/2013 06:01


Merci pour ton aide Smiley smile

Voici la fonction concernée :

function formatWPContent($wpdata, $chars, $stripimages, $stripembed, $stripscript, $striplinks) { 

	if ($chars > 0) {
		$content = stripslashes($this->html_substr($wpdata['post_content'], $chars, 20));
		$content = $this->convert_smart_quotes($content);
		$content = preg_replace('/(\r\n|\n|\r)/', '', $content);
		 $content = preg_replace("#\[caption([^\]]*)]([^\[]*)\[/caption\]#", " ", $content);	
	}
	else {
		$content = $wpdata['post_content'];
		$content = $this->convert_smart_quotes($content);
	}

	// strip images from posts
	if ($stripimages) {
		$content = preg_replace('#</?img[^>]*>#is', '<!--img-->', $content);
	}

	if ($stripembed) {
		// strip embeds from posts
		$content = preg_replace('#</?embed[^>]*>(.+</embed[^>]*>|)#is', '<!--embed-->', $content);
	}

	if ($stripscript) {
		// strip javascript from posts
		$content = preg_replace('#</?script[^>]*>(.+</script[^>]*>|)#is', '<!--script-->', $content);
	}
	
	if ($striplinks) {
		// strip any links (or other <a> tagged content) from posts
		$content = preg_replace('#</?a[^>]*>#is', '<!--link-->', $content);
		$content = preg_replace('#</?\/a[^>]*>#is', '<!--endlink-->', $content);
	}	


	?>
	<div class="box_latest_posts"><?php
	echo '<a href="'.$wpdata['guid'].'"><strong>'.$wpdata['post_title'].'</strong></a></br>
	<span class="description_latest_posts">'.nl2br($content).'</span>
	<span class="date_latest_posts">Posted on '.date($this->dateformat, strtotime($wpdata['post_date'])).'</span></br>';

	if ($this->showauthor)

		//echo ' by '.$wpdata['display_name']; // print author name
	
	//echo '.<br />'.$wpdata['comment_count'];


	if ($wpdata['comment_count'] > 0) {
		$jump = "#comments";
	}
	else {
		$jump = "#respond";
	}
	if ($wpdata['comment_count'] == 1) {
		$comment = "comment";
	}
	else {
		$comment = "comments";
	}

	//echo ' <a href="'.$wpdata['guid'].$jump.'">'.$comment.'</a>.';

	?></div><?php

} // end formatWPContent()

Modifié par mazett (09 Jul 2014 - 05:24)
Modérateur
mazett a écrit :

J'ai rajouté :
$content = preg_replace('#\[caption[^\]]*\]([^\[]*)\[/caption\]#','', $content);

Ça masque bien le premier shortcode caption de chaque contenu d'article mais pas les autres :
Je ne vois pas pourquoi..une idée?

Un problème de regexp je pense. Rajouter une option ? Peut-être une recherche multiligne (m) ? Mais apparemment, les retours à la ligne sont supprimés avant, d'arès ton code.
Sinon, WordPress met à dispo une fonction strip_shortcodes(), tu peux t'en inspirer pour trouver la bonne regexp :
shortcodes.php in tags/3.9.1/src/wp-includes – WordPress Trac (ligne 225 pour la regexp et 398 pour l'asssainissement)
Modifié par jojaba (09 Jul 2014 - 08:11)
Oui j'ai rajouté la fonction de suppression des sauts de ligne, ça pose problème pour l'éxécution du regex shortcode??

L'option m ne change rien..
$content = preg_replace('#\[caption([^\]]*)]([^\[]*)\[/caption\]#m', ' ', $content);	


Merci pour les liens, je vais tenter de déchiffrer tout ça.. si tu as une autre idée entre temps n'hésite pas Smiley smile
Modérateur
Pourrais-tu donner les autres captions à retrouver et remplacer ? Ils ne correspondent peut-être pas tout simplement à ton motif de recherche ?
Je ne suis pas trop à l'ais avec les regexp, mais peut-être qu'en indiquant le début et la fin de la regexp avec ^ et $ ?
#^\[caption([^\]]*)]([^\[]*)\[/caption\]$#

Modifié par jojaba (09 Jul 2014 - 14:37)
Apparemment le problème est dû au fait qu'on n'a que la 1ere moitié du caption à cause du système qui tronque le message à 450caractères max.

Or ce que recherche la regex, c'est un texte entre les 2 balises caption. Du coup, elle ne repère pas le morceau où il n'y en a qu'une moitié

Comment faire pour gérer le cas du caption commencé et pas terminé?
je sèche..

en modifiant la regex de la sorte ça masque l'ouverture de caption, son contenu mais PAS la fermeture :
$content = preg_replace('#\[caption([^\]]*)]([^\[]*)#i', ' ', $content);


un début de solution peut etre?
N'est-il pas possible de faire 2regex qui se complètent ?
celui-ci, + un autre masquant simplement la balise de fermeture de caption [/caption] ?
Pas très propre cependant.. Smiley confused
Modérateur
mazett a écrit :
Apparemment le problème est dû au fait qu'on n'a que la 1ere moitié du caption à cause du système qui tronque le message à 450caractères max.

Il faudrait travailler sur tout le contenu de l'article :
$wpdata['post_content']

A moins que ce soit cette valeur-l qui soit tronquée...
Dans ce cas-là, il faudra peut-être retrouver le contenu de l'article directement dans la bdd...
Modifié par jojaba (13 Jul 2014 - 08:24)
Merci pour ta réponse,
en déplaçant cette fonction après l'appel des articles (cad avant qu'ils soient tronqués), ça ne marche pas non plus..

Etant à court de temps, j'ai opté pour une solution pas très propre (et qui me laissera peut etre des surprises dans le futur lors de l'upload d'autres articles sur le blog..),
mais qui marche pour l'instant.

En gros ça prend en compte 3types de situations :
1er cas : il trouve l'ouverture et la fermeture du caption (par exemple "[caption id""]blabla[/caption]")
2e cas : il ne trouve que l'ouverture mais pas la fermeture (par exemple "[caption id""] ...")
3e cas : il trouve seulement un bout de l'ouverture de caption (par exemple "[caption...")

$content = preg_replace('#\[caption([^\]]*)]([^\[]*)\[/caption\]#i', ' ', $content); 	
		$content = preg_replace('#\[caption([^\]]*)]#i', ' ', $content);
		$content = preg_replace('#\[caption([^\]]*)#i', ' ', $content);


Merci pour ton aide en tout cas.
Modifié par mazett (14 Jul 2014 - 06:45)
Modérateur
J'ai vite jeté un oeil dans WPGet, c'est la fonction html_substr() (ligne 121 de wpget.php) qui réduit la longueur de l'article. Donc, il faut récupérer le contenu avant le traitement de cette fonction...
Bonne continuation Smiley cligne