Archives de catégorie : PHP

WordPress : Réécriture d’un paramètre dans une URL

Exemple de code wordpress permettant de transformer une url avec un paramètre du type « ?param=slug-param » en une url réécrite plus « propre »

Grace à ce code on va transformer
« https://numa-bord.com/custom-slug/slug-post/?param=slug-autre-post »
en
« https://numa-bord.com/custom-slug/slug-post/slug-autre-post »

add_action('init', 'yoursite_init');

function yoursite_init() {
    global $wp, $wp_rewrite;
    $wp->add_query_var('custom_param');
    $wp_rewrite->add_rule('custom-slug/([^/]+)/([^/]+)', 'index.php?custom_param=$matches[2]&post_type=custom-type&name=$matches[1]', 'top');

    // activer seulement la première fois
    //$wp_rewrite->flush_rules(false);
}

Dans le template, on peux récupérer notre paramètre de la façon suivante :

$param = get_query_var('custom_param');

C’est une technique qui permet de faire pas mal de chose, l’exemple ci dessus pourrait permettre de comparer deux « post ».
Plus concrètement sur un site ayant des véhicules en « custom post type », permettre de comparer les caractéristiques de deux d’entre eux avec une url de ce type :
https://numa-bord.com/comparateur/vehicule1/vehicule2

Snippet PHP : Uploader une image en provenance d’un formulaire

Exemple d’une fonction permettant de gérer l’upload d’une image en provenance d’un formulaire. Permet de la renommer et de la placer dans le répertoire voulus en fonctions des paramètres passés. Attention ici on contrôle uniquement le fait que ce soit une image, si on à des contraintes sur la taille du fichier ou les extensions autorisées il faudra rajouter des vérifications.

Comme pour le snippet précédent on imagine cette fonction dans une class « Misc » qui pourrait contenir d’autre fonctions utilitaires variées.

class Misc {
    /**
     * uploade le fichier image en provenance du input "file" ayant pour nom $fieldName et donne le nom $imgName à l'image
     * retourne le nouveau dossier/nom.ext de l'image si upload ok, sinon false
     */

    public static function uploadImg($fieldName, $imgName, $target_dir = "../images/") {
        if (isset($_FILES[$fieldName]) && $_FILES[$fieldName]["name"] != "") {
            $ext = pathinfo($_FILES[$fieldName]["name"], PATHINFO_EXTENSION);
            $target_file = $target_dir . $imgName . '.' . $ext;
            //contrôle si c'est bien une image
            $check = getimagesize($_FILES[$fieldName]["tmp_name"]);
            if ($check !== false) {
                if (move_uploaded_file($_FILES[$fieldName]["tmp_name"], $target_file)) {
                    return $target_file;
                }
            }
        }
        return false;
    }
}

Utilisation (après l’envoi d’un formulaire ayant un input de type « file » ayant pour attribut « name » la valeur « logo ») :

Misc::uploadImg('logo', 'logo');//retourne le nouveau chemin et nom de l'image uploadé (ex : "../images/logo.png") ou false en cas d'erreur.

PHP : Importer les données dans une base depuis un fichiers .sql

Ci-dessous un script PHP permettant d’importer dans une base les données d’un fichier « export.sql ». Cela permet de créer les tables et d’insérer les données dans la base directement en PHP sans passer par l’import du fichier via le PhpMyAdmin

Ça peut être utile par exemple dans un « installeur » de site, dans la même idée de l’article précédent qui permettait de Créer une fichier de configuration en PHP

//effectuer la connexion à la base de données
$mysqli = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
//fichier contenant le sql
$lines = 'export.sql';
//initialisation des variables
$req = "";
$finRequete = false;
//pour chaque ligne du fichier
foreach ($lines as $line) {
    //on saute les commentaires
    if (
substr($line, 0, 2) == '--' || $line == '') {
        continue;
    }
    //on ajoute la ligne à la requête
    $req .= $line;
    //Permet de repérer quand il faut envoyer l'ordre SQL...
    if (substr(trim($line), -1, 1) == ';') {
        $finRequete = true;
    }
    //si requête terminé, on l'exécute et on recommence le traitement à partir de la ligne suivante
    if ($finRequete) {
        if (!$mysqli->query($req)) {
            echo "<div class='alert alert-danger'>Erreur : " . $mysqli->error . "<br>" . $req . "</div>";
        }
        $req = "";
        $finRequete = false;
    }
}

PHP : Créer un fichier et écrire dedans

Exemple de code permettant de créer et d’écrire dans un fichier en PHP. Un des cas courant de ce besoins est la création de fichiers de configuration. Le code suivant permet de créer le fichier « config.db.php » qui comme son nom l’indiquer contiendra les constantes PHP permettant la connexion à la base de données.

Imaginons qu’il s’agit d’une partie d’un installeur de site. On demande de remplir les informations de connexion à l’utilisateur dans un formulaire classique. Une fois soumis on contrôle les champs, on vérifie que la connexion fonctionne et dans ce cas, on créer le fichier de configuration.

Dans le code est utilisé le tableau $fields sensé contenir les informations envoyé par le formulaire (et préalablement contrôlé)

<?php
/*...traitement du formulaire posté retournant le tableau $fields...*/
//nom du fichier à créer.
$filename = 'config.db.php';
//creation du fichier si il n'existe pas et ouverture en écriture
$conf_file = fopen($filename, 'w');
//on écrit dans le fichier ligne par ligne
fwrite($conf_file, '<?php' . "\r\n");
fwrite($conf_file, 'define("DB_HOST","' . $fields['host'] . '");' . "\r\n");
fwrite($conf_file, 'define("DB_USERNAME","' . $fields['username'] . '");' . "\r\n");
fwrite($conf_file, 'define("DB_PASSWORD","' . $fields['password'] . '");' . "\r\n");
fwrite($conf_file, 'define("DB_NAME","' . $fields['name'] . '");' . "\r\n");
//fermeture du fichier
fclose($conf_file);

Snippet PHP : Générer une chaine aléatoirement

Exemple d’une fonction permettant de générer une chaine aléatoire, avec le nombre de caractères et les caractères utilisés paramétrable.

On imagine cette fonction dans une class « Misc » qui pourrait contenir d’autre fonctions utilitaires variées.

class Misc {

    /**
     * Générer une chaine aléatoire de $lenght caractères, utilisant les $characters
     */

    public static function randomString($length = 20, $characters = 'abcdefghijklmnopqrstuvwxyz0123456789') {
        $charactersLength = strlen($characters);
        $randomString = '';
        for ($i = 0; $i < $length; $i++) {
            $randomString .= $characters[rand(0, $charactersLength - 1)];
        }
        return $randomString;
    }

}

Utilisation :

Misc::randomString();//retourne une chaine du type "8iplqu8fkz4d4ffn83sy"

PHP : Travailler avec les dates

PHP fournit les classe DateTime, DateTimeImmutable et DateInterval qui permettent de travailler et faire des calculs facilement sur les dates

On peux par exemple facilement trouver la date qu’il sera dans X jours de la façon suivante :

$start = new DateTimeImmutable('2017-06-25 09:00');//date de départ (25 jun 2017)
$end = $start->modify('+10 day');//10 jours plus tard
$end->setTime(0,0,0);//on passe l'horaire a 00:00:00
echo $end->format('d/m/Y H:i:s');//affiche : 05/07/2017 09:00:00

On peux aussi connaitre la différence (nombre de jours, mois) entre 2 dates

$start = new DateTimeImmutable('2017-06-25');//date de départ (25 juin 2017)
$end = new DateTimeImmutable('2017-08-31');//date de départ (31 aout 2017)
$interval = $start->diff($end);//on récupère la différence entre ces 2 dates
echo $interval->format('%a jours');//affiche : 67 jours
echo $interval->format('%m mois et %d jours');//affiche : 2 mois et 6 jours

Beaucoup de chose sont possible, ci-dessous on récupère le dernier jour du mois en cours, et le nombre de jours qui nous sépare de cette date

$now = new DateTime();//aujourd'hui
$end = new DateTime($now->format('Y-m-t'));//fin du mois
$interval = $now->diff($end);//on récupére la différence entre ces 2 dates
echo $interval->format('%a jours');//on affiche le nombre de jour entre ajourd'hui et la fin du mois

Pour plus d’informations il suffit de se reporter à la documentation PHP