Some interesting links

It’s been a long time since I wrote my last article.  I have been quite busy with the development of rationalK and with reading a lot of articles on the internet. Here a selection of them.

Productivity and management

Other stuff

I will continuously update the list.
Have a nice reading.

Woocommerce

Bonsoir à tous,
Au vu du grand nombre de personnes me demandant des informations sur mes plugins pour woocommerce, les voici en téléchargement gratuit :

Pour sips atos : http://thomasdt.com/wp-content/uploads/2013/04/woocommerce-gateway-atos1.zip

Pour cyberplus systempay : http://thomasdt.com/wp-content/uploads/2013/04/woocommerce-gateway-systempay-cyberplus.zip

Ces deux plugins fonctionnaient très bien mais je ne les ai pas testés avec les mise à jour de woocommerce.

Attention, je ne fais aucun support ni par mail ni par téléphone. Donc si vous avez l’âme d’un débrouillard en php. C’est pour vous !

A Contact Form 7 to Trello Process

The idea is to add a trello card to your trello board anytime you receive an email from your contact form 7 wordpress plugin.

Here is how you can do it :

add_action( 'wpcf7_mail_sent', 'your_wpcf7_mail_sent_function' );

function your_wpcf7_mail_sent_function($contact_form){
	$boardid='5040f5a3********d1c9ddc70';
	$listid='507f1*********a7a4885';
	$apiKey='6b93***********9146d740c2555798d8';
	$token='6a50b26d45736cfc***********91a29b9bfc7a8c';

	$posted_data = $contact_form->posted_data;
	$formid=$contact_form->id;
	if ($formid==2){
		// devis détaillé :
		$name="Demande de devis détaillé - ".$posted_data['url']."\n\n";
		$desc="De : ".$posted_data['your-name']." ".$posted_data['your-email'].""."\n\n";
		$desc.="Sujet : Demande de devis détaillé"."\n\n";
		$desc.="Société : ".$posted_data['societe']."\n\n";
		$desc.="Téléphone : ".$posted_data['tel']."\n\n";
		$desc.="URL : ".$posted_data['url']."\n\n";
		$desc.="Langue : ".$posted_data['lang']."\n\n";
		$desc.="Cible : ".$posted_data['cible']."\n\n";
		$desc.="Etat : ".$posted_data['etat']."\n\n";
		$desc.="Année de création : ".$posted_data['annee']."\n\n";
		$desc.="Facebook : ".$posted_data['facebook']."\n\n";
		$desc.="Twitter : ".$posted_data['twitter']."\n\n";
		$desc.="Mots clés :".$posted_data['keywords']."\n\n";
		$desc.="Budget : ".$posted_data['budget']."\n\n";
		$desc.="Informations supplémentaires : ".$posted_data['your-message']."\n\n";
		$desc.="Affilié :".$_COOKIE['from']."\n\n";
		$desc.="-- Ce email a été envoyé via formulaire de contact #".$formid." de xxx "."\n\n";
		add_to_trello($name,$desc,$listid,$boardid,$apiKey,$token);
	}
	if ($formid==3){
		// devis rapide :
		$name="Demande de devis rapide - ".$posted_data['url']."\n\n";
		$desc="De : ".$posted_data['your-name']." ".$posted_data['your-email'].""."\n\n";
		$desc.="Sujet : Demande de devis rapide"."\n\n";
		$desc.="Téléphone : ".$posted_data['tel']."\n\n";
		$desc.="URL : ".$posted_data['url']."\n\n";
		$desc.="Budget : ".$posted_data['budget']."\n\n";
		$desc.="Affilié :".$_COOKIE['from']."\n\n";
		$desc.="-- Ce email a été envoyé via formulaire de contact #".$formid." de xxx "."\n\n";
		add_to_trello($name,$desc,$listid,$boardid,$apiKey,$token);
	}
	elseif ($formid==4) {
		// Demande de rappel :
		$name="Demande de rappel - ".$posted_data['tel']."\n\n";
		$desc=$posted_data['tel']." souhaite être rappelé !"."\n\n";
		$desc.="Affilié :".$_COOKIE['from']."\n\n";
		$desc.="-- Ce email a été envoyé via formulaire de contact #".$formid." de xxx "."\n\n";
		add_to_trello($name,$desc,$listid,$boardid,$apiKey,$token);
	}
}

function add_to_trello($name,$desc,$listid,$boardid,$apiKey,$token){
	$data = array(
		'idList' => $listid,
		'name' => $name,
		'desc' => $desc
	);
	$card=cURL_POST_trello($data,'https://trello.com/1/cards/',$apiKey,$token);
}

function cURL_POST_trello($data,$url,$key,$token){
$ch = curl_init();
$questionmarkishere=strpos($url,'?');
if ($questionmarkishere){$char='&';}else{$char='?';}
curl_setopt($ch, CURLOPT_URL, $url.$char.'key='.$key.'&token='.$token);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HEADER, false);
$body = curl_exec($ch);
$headers = curl_getinfo($ch);
//$result=array('headers'=>$headers,'body'=>$body);
curl_close($ch);
$result=json_decode($body);
return $result;
}

Envoi de newsletter HTML avec amazon ses

Petit snippet de script php utilisant le code de Anthone et Dan :

http://whitehatcrew.com/blog/free-php-class-for-sending-email-through-amazon-ses/

http://www.orderingdisorder.com/aws/ses/

<?php
require_once('ses.php');
$AccessKeyID='AKIAJT*******3XYQIWA';
$SecretKey='b8tTSghJqV*************y/HQ9';
$ses = new SimpleEmailService($AccessKeyID,$SecretKey);
$m = new SimpleEmailServiceMessage();
$m->setFrom('thomas@lyonsalsacongress.com');
$m->addTo('thomas@lyonsalsacongress.com');
$m->addBCC(array('salut@gmail.com', 'thomas@6www.net'));
$m->addReplyTo('thomas@lyonsalsacongress.com');
$m->setSubject('News du Lyon Salsa Congress');
$m->addRawMessageFromFile('html','news.html','text/html');
print_r($ses->sendEmail($m));
print_r($ses->getSendQuota());
print_r($ses->getSendStatistics());
?>

Il faut sauver la page en HTML depuis le navigateur et l’uploader sur le site.

Les functions : ses

Bon dimanche.

Paypal pour WordPress avec un formulaire personalisé

Bonjour,
Ci dessous un petit guide pour transformer votre site wordpress en e-boutique sans utiliser le plugin wp-e-commerce.
En plus de créer un boutton paypal, cela vous crée un formulaire pour demander plus d’informations à l’acheteur comme la taille, la couleur du produits, son signe astrologique, etc.

Fonctionnement général :

Vous placer un shortcode sur les pages de votre site ou vous voulez faire apparaitre un bouton paypal. Exemple, je vends une guitare en plastique à 8.35€, cela donne : [PaypalBuyNowButton item_name=”Guitare en plastique” amount=”8.35″]

Le code suivant est à placer dans le fichier functions.php :

function my_scripts_method() {
    wp_deregister_script( 'joinFields' );
    wp_register_script( 'joinFields', 'http://www.votre-site.fr/wp-content/themes/votre-theme/joinFields.js');
    wp_enqueue_script( 'joinFields' );
}    
add_action('wp_enqueue_scripts', 'my_scripts_method');

function PaypalBuyNowButton($atts){
  global $wpdb, $post;
  extract( shortcode_atts( array('item_name' => 'Prevision astrale','amount' => '0.10'), $atts));
  //$Output.='<a href="#" onclick="joinFields()">joinFields</a>';
  //print_r($atts);
  $Output.='<form action="https://www.paypal.com/cgi-bin/webscr" method="post" name="fmBuy" id="fmBuy" onSubmit="joinFields()">
  <input type="hidden" name="cmd" value="_xclick">
  <input type="hidden" name="business" value="votreemailebay@hotmail.com">
  <input type="hidden" name="lc" value="FR">
  <input type="hidden" name="item_name" value="'.$item_name.'">
  <input type="hidden" name="amount" value="'.$amount.'">
  <input type="hidden" name="currency_code" value="EUR">
  <INPUT TYPE="hidden" name="charset" value="utf-8">
  <input type="hidden" name="button_subtype" value="services">
  <input type="hidden" name="no_note" value="1">
  <input type="hidden" name="no_shipping" value="1">
  <input type="hidden" name="rm" value="1">
  <p>Votre nom<br />
  <input type="text" id="nom" name="nom" value="'.$keyarray['last_name'].'" size="40" /></span> </p>
  <p>Votre prénom<br />
  <input type="text" id="prenom" name="prenom" value="'.$keyarray['first_name'].'" size="40" /></span> </p>
  <p>Votre date de naissance<br />
  <input type="text" id="datedenaissance" name="datedenaissance" value="" size="40" /></span> </p>
  <p>Votre heure de naissance<br />
  <input type="text" id="heuredenaissance" name="heuredenaissance" value="" size="40" /></span> </p>
  <p>Votre lieu de naissance<br />
  <input type="text" id="lieudenaissance" name="lieudenaissance" value="" size="40" /></span> </p>
  <p>Votre email<br />
  <input type="text" id="email" name="email" value="'.$keyarray['payer_email'].'" size="40" /></span></p>
  <p>Votre numéro de téléphone<br />
  <input type="text" id="telephone" name="telephone" value="" size="40" /></span></p>
  <p>Votre adresse postale complète<br />
  <input type="text" id="adresse" name="adresse" value="" size="100" /></span></p>
  <input type="hidden" name="custom" id="custom" value="">
  <input type="hidden" name="return" value="http://www.votre-site.fr">
  <input type="hidden" name="cancel_return" value="http://www.votre-site.fr">
  <input type="hidden" name="notify_url" value="http://www.louisette-astro.fr/paypal_ipn.php">
  <input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHosted">
  <input type="image" src="https://www.paypalobjects.com/fr_FR/FR/i/btn/btn_buynowCC_LG.gif" border="0" name="submit" alt="PayPal - la solution de paiement en ligne la plus simple et la plus sécurisée !">
  <img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
  </form>';
  return $Output;
}
add_shortcode( 'PaypalBuyNowButton', 'PaypalBuyNowButton' );

Ensuite il faut créer le fichier javascript joinFields.js qui va concaténer les elements du formulaire :

function joinFields(){
 var nom = document.getElementById('nom').value;
 var prenom = document.getElementById('prenom').value;
 var datedenaissance = document.getElementById('datedenaissance').value;
 var heuredenaissance = document.getElementById('heuredenaissance').value;
 var lieudenaissance = document.getElementById('lieudenaissance').value;
 var email = document.getElementById('email').value;
 var telephone = document.getElementById('telephone').value;
 var adresse = document.getElementById('adresse').value;
 var req=nom+'&'+prenom+'&'+datedenaissance+'&'+heuredenaissance+'&'+lieudenaissance+'&'+email+'&'+telephone+'&'+adresse;
 var custom = document.getElementById('custom');
 custom.value=req;
  }

Le troisième fichier paypal_ipn.php est à placer à la racine de votre site :

<?php

error_reporting(E_ALL ^ E_NOTICE);
$emailtext = "";
// Read the post from PayPal and add 'cmd'
$req = 'cmd=_notify-validate';
if(function_exists('get_magic_quotes_gpc')){$get_magic_quotes_exits = true;}
foreach ($_POST as $key => $value)
// Handle escape characters, which depends on setting of magic quotes
    {
    if($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1)
        {$value = urlencode(stripslashes($value));}
    else {$value = urlencode($value);}
    $req .= "&$key=$value";
    }
// Post back to PayPal to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0rn";
$header .= "Content-Type: application/x-www-form-urlencodedrn";
$header .= "Content-Length: " . strlen($req) . "rnrn";
$fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);

// Process validation from PayPal
if (!$fp)
    { // HTTP ERROR
    }
else
    {
    // NO HTTP ERROR
    fputs ($fp, $header . $req);
    while (!feof($fp))
        {
        $res = fgets ($fp, 1024);
        if (strcmp ($res, "VERIFIED") == 0)
            {
            // Check the payment_status is Completed
            if ($_POST['payment_status']=='Completed')
                {
                $emailtext.='Bonjour,'."n".'Nous avons reçu votre commande '."n".'Détails de votre demande :'."n";
                $emailtext.='Type de demande : '.$_POST['item_name']."n";
                $custom = explode("&",$_POST['custom']);
                $emailtext.='Nom : '.$custom[0]."n".'Prénom : '.$custom[1]."n";
                $emailtext.='Date de naissance :'.$custom[2]."n".'Heure de naissance :'.$custom[3]."n".'Lieu de naissance :'.$custom[4]."n";
                $email=$custom[5];
                $emailtext.='Email : '.$email."n".'Téléphone : '.$custom[6]."n";
                $emailtext.='Adresse : '.$custom[7]."nn";

                foreach ($_POST as $key => $value)
                    {
                    //$emailtext .= $key . " = " .$value ."nn";
                    }

                    $headers  = 'MIME-Version: 1.0' . "rn";
                    $headers .= 'Content-type: text/plain; charset=utf-8' . "rn";
                    $headers .= 'From: Vous <nepasrepondre@votre-site.fr>' . "rn";
                    $headers .= 'Bcc: votre-email@hotmail.com' . "rn";
                    mail($email, "Accusé de reception de votre commande", $emailtext,$headers);
                }//End if completed
            }
        else if (strcmp ($res, "INVALID") == 0)
            {
            foreach ($_POST as $key => $value){$emailtext .= $key . " = " .$value ."nn"; }
            mail('votre-email@hotmail.com', "Live-INVALID IPN at astro", $emailtext . "nn" . $req);
            }  
        }
        fclose ($fp);
    }
?>

Enfin il est important de bien régler vos options de paypal, notamment pour l’ipn :
Paypal -> Préférences -> Plus d’options -> Mes outils de vente -> Notifications instantanées de paiement
(ou directement : https://www.paypal.com/cgi-bin/customerprofileweb?cmd=_profile-ipn-notify)

Paypal Réglage IPN
Paypal Réglage IPN

Note : La somme des champs réponses (nom, prénoms, …) ne peut dépasser 256 caractères (limitation de cette technique). Si besoin de plus de caractères, utiliser une base de données ou wpec.

Todo :

  • intégrer dans un plugin.
  • le lier à un plugin type contact form 7 pour ne pas avoir a créer le formulaire en dur