Archive for IT

ITPrivate galleries in WordPress using PiwigoPress

Une fois n’est pas coutume, un post plutôt technique. Si vous ne savez pas lire un minimum de php, passez votre chemin, ce post n’est pas pour vous ! Une fois n’est pas coutume, également, un titre en anglais, afin qu’il soit mieux référencé, car je pense que ça pourra aider des gens dans le même cas que moi. S’ils ne lisent pas le français, ils comprendront au moins le code !

Nous allons donc parler de Piwigo, le chouette outil que j’ai découvert, et qui permet d’héberger votre propre site de partage de photos. L’idée, c’est de partager ses photos avec ses amis, comme sous G+ ou Facebook, mais on ne donne pas ses photos à des multinationales mal intentionnées qui peuvent ensuite faire ce qu’elles veulent avec, on les garde sur son serveur perso ! D’ailleurs si vous voulez un accès, pas de souci, demandez-moi par email ! Piwigo est bien sûr open-source, et je suis vite devenue fan, il est facile à installer, à configurer, et possède de nombreux plugins ! Il est relativement connu, et possède même un plugin qui permet de l’interfacer avec WordPress (l’outil utilisé pour ce blog), PiwigoPress.

Premier souci rencontré : PiwigoPress n’était pas compatible avec ma version de Piwigo, la 2.6. Pour résoudre ce souci, j’ai fait comme indiqué sur ce forum, à savoir :

remplacer les lignes contenant

$pictures = $thumbc["result"]["images"]["_content"];

par

$pictures = $thumbc["result"]["images"];

Cela concerne le fichier thumbnails_reloader.php, ligne 27; et le fichier PiwigoPress_code.php, ligne 61.

Une fois cela fait, on a un PiwigoPress qui fonctionne. On peut insérer des liens vers des images de son Piwigo dans ses posts et dans un widget de la sidebar. Deuxième souci que j’ai alors rencontré : ces images doivent être publiques. Et tous mes albums étaient privés… j’ai donc cherché des solutions, et je suis tombée sur cet article du même forum. Sa solution fonctionne, mais elle ne permet pas d’utiliser la visualisation des photos dans WordPress, il faut insérer les id des photos à la main, c’est un peu fastidieux. Du coup, avec taz, on a cherché comment améliorer cela. Et nous avons fini par réussir ! Voici donc les manip à faire :

Dans piwigopress.php, on ajoute à la ligne 32 :

add_shortcode('PiwigoPressPrivate', 'PiwigoPress_photoblogPrivate');

Puis, à la ligne 91, on insère toute cette fonction, avec USER et PASSWORD les identifiant d’un utilisateur dans Piwigo qui a accès aux albums qui vous intéressent :


function PiwigoPress_photoblogPrivate($parm) {
$default = array(
'url' => '',
'id' => 0,     // image_id
'size' => 'la', // Default large
'desc' => 0,   // Generate picture description
'class' => '',  // Specific class
'style' => '',  // Specific style
'lnktype' => 'picture' // Default generated link
);
$parm = array_change_key_case( $parm );
extract( shortcode_atts( $default, $parm ) );
$previous_url = get_option( 'PiwigoPress_previous_url' );
if ($previous_url === false) {
$previous_url = $_SERVER['HTTP_HOST'] . '/piwigo';
add_option( 'PiwigoPress_previous_url', $previous_url );
}
if ($url == '') $url = $previous_url;
if (substr($url,0,4)!='http') $url = 'http://' . $url;
if (substr($url,-1)!='/') $url .= '/';
if ($previous_url != $url) update_option( 'PiwigoPress_previous_url', $url );
if ( !is_numeric($id) or $id < 1) {
return "<!-- PiwigoPress 'id' attribute in error -->\n\n<br>"
. __('PiwigoPress shortcode attribute "id" is required and must be positive.','pwg') . "<br>\n\n" ;
}
$deriv = array ( 'sq' => 'square', 'th' => 'thumb', 'sm' => 'small', 'xs' => 'xsmall', '2s' => '2small',
'me' => 'medium', 'la' => 'large', 'xl' => 'xlarge', 'xx' => 'xxlarge');
if (!function_exists('pwg_get_contents')) include 'PiwigoPress_get.php';
session_write_close();
$Curl_Session = curl_init($url . 'ws.php?method=pwg.session.login');
$tmp_fname = tempnam("/tmp", "COOKIE");
curl_setopt ($Curl_Session, CURLOPT_COOKIEJAR, $tmp_fname);
curl_setopt ($Curl_Session, CURLOPT_POST, 1);
curl_setopt ($Curl_Session, CURLOPT_POSTFIELDS, "username=USER&password=PASSWORD");
curl_setopt ($Curl_Session, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($Curl_Session, CURLOPT_COOKIEFILE,  $tmp_fname);
curl_setopt($Curl_Session, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($Curl_Session);
$Curl_Session = curl_init();
curl_setopt ($Curl_Session, CURLOPT_COOKIEJAR, $tmp_fname);
curl_setopt ($Curl_Session, CURLOPT_COOKIEFILE,  $tmp_fname);
curl_setopt($Curl_Session, CURLOPT_TIMEOUT, 5);
curl_setopt ($Curl_Session, CURLOPT_POST, 0);
curl_setopt($Curl_Session, CURLOPT_URL, $url . 'ws.php?method=pwg.session.getStatus');
curl_setopt($Curl_Session, CURLOPT_USERAGENT, 'Mozilla/5.0');
curl_setopt($Curl_Session, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($Curl_Session, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($Curl_Session, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt ($Curl_Session, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($Curl_Session, CURLOPT_URL, $url . 'ws.php?method=pwg.images.getInfo&format=php&image_id=' . $id);
$response = @curl_exec($Curl_Session);
$status = @curl_getinfo($Curl_Session);
@curl_close($Curl_Session);

$thumbc = unserialize($response);
if ($thumbc["stat"] == 'ok') {
$picture = $thumbc["result"];
if (isset($picture['derivatives']['square']['url'])) {
$picture['tn_url'] = $picture['derivatives'][$deriv[$size]]['url'] ;
$atag = "";
if ( $lnktype == 'none' ) $atag = '';
if ( $lnktype == 'album' ) {
$cats = array_reverse($picture['categories']);
$atag = '<a title="' . htmlspecialchars($cats[0]['name']) . '" href="'
. $url . 'index.php?/category/' . $cats[0]['id'] . '" target="_blank">';
}
$div = '<div>' . $atag. '<img  src="' . $picture['tn_url'] . '" alt=""/>';
if (isset( $picture['comment'] ) and $desc) {
$picture['comment'] = stripslashes(htmlspecialchars(strip_tags($picture['comment'])));
$div .= '<blockquote>' . $picture['comment'] . '</blockquote>';
}
if ( $lnktype != 'none' ) $div .= '</a>';
$div .= "\n
</div>";
}
}
if ($style!='') $style = ' style="'.$style.'"';
$str =  '<div id="Photo-' . $id . '-'. $size .'"' . $style . '><!-- PiwigoPress Started -->';
$str .=  $div . '</div><!-- PiwigoPress Ended -->';
return $str;
}

On remplace également “public=true” par public=”false” dans PiwigoPress_code.php, ligne 105 :

'ws.php?method=pwg.categories.getList&format=php&public=false');

Enfin, on modifie également PiwigoPress_get.php. A la ligne 20, on ajoute le paramètre suivant, pour forcer l’utilisation de curl pour récupérer les images.

$mode = 'ch';

Et ligne 54, sous l’instruction

if ($mode !== 'Err' and function_exists('curl_init')) {

on ajoute les lignes suivantes, avec USER et PASSWORD les identifiant d’un utilisateur dans Piwigo qui a accès aux albums qui vous intéressent, et ADRESSE_SITE l’url de votre site Piwigo :


$ch = @curl_init('http://ADRESSE_SITE/ws.php?method=pwg.session.login');
$tmp_fname = tempnam("/tmp", "COOKIE");
@curl_setopt ($ch, CURLOPT_COOKIEJAR, $tmp_fname);
@curl_setopt ($ch, CURLOPT_POST, 1);
@curl_setopt ($ch, CURLOPT_POSTFIELDS, "username=USER&password=PASSWORD");
@curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
@curl_setopt ($ch, CURLOPT_COOKIEFILE,  $tmp_fname);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
@curl_exec ($ch);

Enfin, sous la ligne 55, qui contient

($ch = @curl_init();)

on ajoute :


@curl_setopt ($ch, CURLOPT_COOKIEJAR, $tmp_fname);
@curl_setopt ($ch, CURLOPT_COOKIEFILE,  $tmp_fname);

Et voilà !
Vous pouvez voir sur le menu droit que ça fonctionne, et que ça donne un chouette widget 😉

ITMigration de Dotclear sous WordPress

En rédigeant mon post précédent, celui sur les services de conversion de blog en livre qui, pour la plupart, ne fonctionnent que pour WordPress ou d’autres services très connus comme Blogger, je me suis dit que c’était un peu idiot de laisser mon blog sous Dotclear. En 2006, lorsque j’ai commencé ce blog, c’était LE logiciel de blog à utiliser, il était tout récent, avec une solide communauté qui développait plein de plugins. Mais aujourd’hui, ce n’est plus vraiment le cas. Je n’ai jamais pu migrer sous la version 2, car la plupart des plugins qui me plaisaient (la newsletter en cas de nouveau post, les images des catégories, etc) n’étaient pas compatibles. Du coup je suis restée avec une version assez vieillote, et pour avoir testé WordPress avec mes autres blogs, il faut bien dire que niveau ergonomie, il n’y a pas photo… sans parler de la liste impressionnante de plugins disponibles !

J’ai donc décidé de sauter le pas. J’ai donc fait une installation de WordPress, puis tout d’abord tenté l’export de mes posts sous forme de fichier plat, avec un plugin Dotclear, flatexport. L’idée était de remplacer le chemin des images dans ce fichier par le chemin pour WP, puis importer le fichier sous WP via un plugin dédié, flatimport. Mais ce plugin n’est plus maintenu, et il ne fonctionnait pas avec la dernière version de WP… Après tâtonnement, j’ai finalement réussi à récupérer l’intégralité du contenu de mon blog DC grâce au plugin Dotclear Importer. J’ai juste eu un souci de charset, qui a fait que tous les accents apparaissaient sous forme de caractères étranges. Souci résolu grâce à de super requêtes sql “replace” fournies par mon chéri ;).

Ensuite, il restait à récupérer les images, trouver un thème sympa, qui rappelle l’ancien, et à ajouter quelques plugins. Un pour avoir les catégories en image (Category images, ainsi qu’un plugin pour ajouter automatiquement les boutons Twitter et g+ sous les posts (All In One Social Network Buttons) et un pour afficher mes tweets dans un widget (Tweet blender). Et là, ça commençait à être sympa. Mais la cerise sur le gâteau, c’est le plugin de Newsletter que j’ai trouvé (Wysija Newsletters) : tout simplement une tuerie, il ajoute toutes les fonctionnalités que j’ai toujours voulu, et en plus il fait des news classes au thème du blog par défaut ! Vous avez dû la recevoir d’ailleurs, il permet aussi de récupérer une liste d’inscrits.

Je crois que je n’ai rien oublié ; indiquez-moi si une fonctionnalité de l’ancien blog vous manque ! 😉