Archives mensuelles : août 2017

PHP : Remplacer du texte dans un fichier

Après avoir vu comment créer un fichier et écrire dedans en php, en continuant l’exemple d’un installateur de site, on peux aussi avoir besoin de modifier le texte d’un fichier, par exemple pour configurer des url dans un fichier « .htaccess ». Le code ci-dessous permet de le faire facilement :

class Misc {
    /**
     * Va remplacer toutes les chaines $find par $replace dans le fichier $file
     */

    public static function replaceInfile($file, $find, $replace) {
        if ($find != $replace) {
            //recupere la totalité du fichier
            $str = file_get_contents($file);
            if ($str === false) {
                return false;
            } else {
                //effectue le remplacement dans le texte
                $str = str_replace($find, $replace, $str);
                //remplace dans le fichier
                if (file_put_contents($file, $str) === false) {
                    return false;
                }
            }
        }
        return true;
    }
}

L’utilisation se faisant de cette manière :

if (!Misc::replaceInfile('../.htaccess', 'ancienne chaine', 'nouvelle chaine')) {
   //gestion erreur
}

Comme dans plusieurs articles précédents, pour ce code, j’ai imaginé cela sous la forme d’une fonction statique placé dans une classe Misc qui contiendrait diverses fonctions utilitaires

WordPress : Passer des variables à get_template_part()

Dans wordpress l’appel à un template via get_template_part() ne transmet pas les variables définis au dessus de l’appel.
Ci-dessous une solution de contournement afin que toutes les variables préalablement définis à l’appel du template restent accessibles.

include(locate_template('listing-loop.php'));//'listing-loop' à remplacer par votre template bien sur.

WordPress : WP_Query avec un tableau de « post__in » vide retourne des résultats !

La fonction WP_Query de wordpress qui permet de récupérer des posts en fonction d’une liste de critères contient une incohérence au niveau de l’argument « post__in ».
Cet argument permet de passer un tableau de posts (liste d’identifiants) afin de limiter la requête à ces posts. Pourtant si on lui passe un tableau vide, la recherche se fera sur tous les posts et on aura donc des résultats, alors qu’on s’attend à ne rien avoir.
Cela peut être gênant si notre tableau d’identifiants et généré dynamiquement et que l’on ne sait pas à l’avance si il va être vide.
Il faut donc penser à cette subtilité lors du développement afin de retrouver un comportement cohérent.
Une des solution est de toujours donner un identifiant inexistant (0) au tableau.

//!! va retourner des résultats !!
$listingIDs = array();
$args = array('post_type' => $type, 'post__in' => $listingIDs);
$my_query = new WP_Query($args);
//Ne retournera rien//
$listingIDs = array(0);
$args = array('post_type' => $type, 'post__in' => $listingIDs);
$my_query = new WP_Query($args);

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