IT Private 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 😉

Comments are closed.