Archives de catégorie : Wordpress

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

WordPress : Création d’un plugin permettant d’ajouter un shortcode

Voici ci-dessous le code très simple d’un plugin wordpress.
Celui-ci permet d’utiliser un nouveau shortcode dans le système wordpress.
Dans le cas présent il va simplement afficher la liste des xx derniers utilisateurs inscrit sur le site.

Pour l’exemple le plugin s’appelle « Mon shortcode ». Il suffit de créer le fichier php « mon-shortcode.php » avec le code ci dessous.
La pratique veut que l’on place ce fichier dans un dossier du même nom « mon-shortcode », dossier à placer bien entendu dans le dossier des plugins de wordpress.
La dernière fonction présenté permet d’ajouter une fichier de mise en page et de traitement javascript. Il faut bien sur les ajouter dans ce même dossier pour qu’il soient correctement appelés.

/*
  Plugin Name: Mon shortcode
  Description: Shortcode permettant d'afficher les derniers utilisateurs inscrits. Shortcode à utiliser sur une page : [mon-shortcode nbusers="xx"]
  Version: 0.1
  Author: Numa BORD
 */


class MonShortcode {

    public function __construct() {
        add_shortcode('mon-shortcode', array($this, 'shortcode_mon_shortcode'));
        add_action('wp_enqueue_scripts', array($this, 'mon_shortcode_scripts'));
    }

    /**
     * Fonction de traitement du shortcode, à utiliser comme ci-dessous
     *
     * [mon-shortcode nbusers="xx"]
     */

    public function shortcode_mon_shortcode($atts) {
        //init
        $default = array();
        $default['nbusers'] = 10;
        //controle des parametres passé dans le shortcode
        if (isset($atts['nbusers'])) {
            $atts['nbusers'] = (int) $atts['nbusers'];
        }
        //configuration definis par les parametre par defaut et ceux passé dans le shortcode
        $config = shortcode_atts($default, $atts);
        //
        $list = '<div class="mon-shortcode">';
        $users = get_users(array('number' => $config['nbusers'], 'orderby' => 'registered', 'order' => 'DESC'));
        foreach ($users as $user) {
            $list .= '<div class="single-user">';
            //avatar
            $list .= '<div class="avatar-glob">';
            $list .= get_avatar($user->user_email, 60);
            $list .= '</div>'; //avatar-glob
            $list .= '<div class="info-glob">';
            //pseudo
            $list .= '<div class="title">';
            $list .= $user->display_name;
            $list .= '</div>'; //title
            //date d'inscription
            $list .= '<div class="date">';
            $registrered = new \DateTime($user->user_registered);
            $list .= $registrered->format('d/m/Y H:i:s');
            $list .= '</div>'; //date
            //
            $list .= '</div>'; //info glob
            $list .= '</div>'; //single user
        }
        $list .= '</div>';
        return $list;
    }

    /**
     * Appel des fichiers js/css necessaires (facultatif)
     */

    public function mon_shortcode_scripts() {
        global $post;
        if (is_a($post, 'WP_Post') && has_shortcode($post->post_content, 'mon-shortcode')) {
            wp_enqueue_style('mon-shortcode-style', plugins_url('/mon-shortcode/style.css'));
            wp_enqueue_script('mon-shortcode-js', plugins_url('/mon-shortcode/script.js'), array('jquery'));
        }
    }

}

new MonShortcode();

Avec quelques améliorations, on peux obtenir un shortcode permettant d’afficher les derniers inscrits en popup comme sur cette page de démonstration