WordPress : Afficher des vidéos à partir du lien d’un fournisseur externe grâce à la fonction « wp_oembed_get »

Connaissez vous la fonction « wp_oembed_get » de wordpress ? Ce n’était pas mon cas il y’a peu de temps, et je n’ai pas tout de suite trouvé la solution de ce que je voulais faire, alors que cette fonction existante fait le travail.

Avec cette fonction à partir d’un lien (en provenance d’un champ personnalisé par exemple) wordpress cherche à créer le lecteur « embarqué » de la ressource visé par ce lien. Dit plus clairement à partir d’un lien Youtube il affiche le lecteur youtube, idem à partir d’un lien vimeo ou dailymotion. Et ceci marche avec beaucoup de service, et pas seulement des vidéos. C’est le cas par exemple pour flickr, twitter, soundcloud, instagram…etc

La fonction prend l’url en premier paramètre et optionnellement en second un tableau « height » et ou « width » pour spécifier la hauteur/largeur du document à affiché

Pour l’utiliser rien de plus simple :

$url = 'https://www.youtube.com/watch?v=-lZdBT2Zl-A';
$embed = wp_oembed_get($url, ['width'=>450]);
//si pas d'erreur on affiche
if($embed){
    echo $embed;
}

WordPress : Remplacer la fonction d’un plugin utilisant if(!function_exist())

Souvent les plugins wordpress déclarent leurs fonctions dans une condition « if(!function_exist()) » de ce type :

if (!function_exists('la_fonction_du_plugin')) {
    function la_fonction_du_plugin() {
        //code de la fonction
        //...
    }
}

Si le plugin ne propose pas de méthode permettant d’overrider le fichier contenant cette fonction ni de hook pour la modifier on se retrouve bloqué. Mais on peux tirer avantage que la fonction soit englober dans un « if(!function_exist()) » pour ne pas modifier le coeur du plugin est ainsi continuer à pouvoir profiter des mises à jour.

La solution consiste à déclarer la même fonction mais avant que le fichier du plugin qui la contient soit chargé. C’est ici que se situe l’astuce, rien de plus simple quand on sait que wordpress propose un système de « must use plugins ». Il suffit de placer un fichier php dans le dossier « /wp-content/mu-plugins » (on crée le dossier si il n’existe pas). Ce fichier sera automatiquement chargé avant tous les autres plugins. On peux placer plusieurs fichiers, peu importe leur noms qui seront alors chargé dans l’ordre alphabétique. Appelons par exemple notre fichier « load.php » et remplaçons notre fonction :

if (!function_exists('la_fonction_du_plugin')) {
    function la_fonction_du_plugin() {
        //code modifié de la fonction
        //...
    }
}

C’est tout simple, encore faut il connaitre cette possibilité et l’existence des « must use plugins ». Bien sur on peux se servir de ce fichier pour excuter n’importe quel code avant que le reste ne soit chargé (plugins, thème)

WordPress : Fonctions de gestions des utilisateurs

Ci-dessous un petit mémo de quelques fonctions permettant la gestion des utilisateurs sous WordPress

//Savoir si le visiteur est connecté en tant qu'utilisateur :
is_user_logged_in();

//Récupération de l'identifiant de l'utilisateur courant :
get_current_user_id();

//Récupération de l'objet user courant et affichage de son nom
$user = wp_get_current_user();
echo $user->display_name;

//Vérifier si l'utilisateur a un rôle (à partir de l'objet $user récupérer ci-dessus)
if (is_user_logged_in() && in_array('administrator', $user->roles)) {
    //option visible par l'administrateur
}

//Afficher l'avatar d'un utilisateur (l'utilisateur courant dans ce cas) avec une taille de 60px
echo get_avatar(get_current_user_id(), 60);

//Récupérer la valeur meta unique "nom_de_le_meta" pour l'utilisateur courant :
get_user_meta(get_current_user_id(), 'nom_de_le_meta', true);

//Enregistrer la valeur "mavaleur" pour la meta unique "nom_de_le_meta" de l'utilisateur courant :
add_user_meta(get_current_user_id(), 'nom_de_le_meta', "mavaleur", true);

WordPress : Utilisation de l’ajax dans WordPress

Voici un post d’exemple sur l’utilisation de l’ajax dans WordPress. Nous allons voir à travers la création d’un mini plugin, comment lancer une requête ajax utilisant le système conçu pour ça dans wordpress.

Le plugin sera utilisable en plaçant le shortcode

[submit-input-ajax]

dans une page. La démonstration est ici

On avait déjà vu comment créer un plugin permettant l’utilisation d’un shortcode. Pour ajouter de l’ajax il faudra ajouter certains éléments « wp_ajax_ ». Le code fonctionnel du plugin est présenté ci-dessous :

/*
  Plugin Name: Plugin action ajax
  Description: Demonstration d'un plugin effectuant une action ajax
 */


class PluginActionAjax {

    public function __construct() {
        //shortcode permettant d'afficher le formulaire avec le champs input et le bouton de soumission
        add_shortcode('submit-input-ajax', array($this, 'shortcode_submit_input_ajax'));
        //chargement des scripts à inclures (css, js...)
        add_action('wp_enqueue_scripts', array($this, 'action_ajax_scripts'));
        //appel ajax de notre fonction "process_action_ajax" si l'utilisateur est loggé "wp_ajax_" ou si il ne l'est pas "wp_ajax_nopriv_"
        add_action('wp_ajax_process_action', array($this, 'process_action_ajax'));
        add_action('wp_ajax_nopriv_process_action', array($this, 'process_action_ajax'));
    }

    /**
     * génère le formulaire lorsqu'on utilise le plugin [submit-input-ajax]
     */

    public function shortcode_submit_input_ajax($atts) {
        $html = '<form class="submit-input-ajax-container">';
        $html .= '<div><label for="submit-input-ajax">Veuillez entrez une information et valider en cliquant sur le bouton</label></div>';
        $html .= '<input type="text" id="submit-input-ajax" />';
        $html .= '<button type="submit" id="btn-submit-input-ajax" >Valider</button>';
        $html .= '</form>';
        return $html;
    }

    /**
     * traite l'appel ajax
     */

    public function process_action_ajax() {
        //verifie l'existence non vide de l'input
        if (isset($_POST['input']) && $_POST['input'] != '') {
            //n'importe quel traitement
            $message = 'Voici votre message en sha1 : ';
            $message .= sha1($_POST['input']);
            //retour success
            wp_send_json_success(['message' => $message]);
        }
        //retour erreur
        wp_send_json_error(['message' => 'Impossible !']);
    }

    /**
     * Appel des fichiers js/css nécessaires au fonctionnement
     */

    public function action_ajax_scripts() {
        global $post;
        //si notre shortcode est présent dans le post courant.
        if (is_a($post, 'WP_Post') && has_shortcode($post->post_content, 'submit-input-ajax')) {
            wp_enqueue_style('paa-style', plugin_dir_url(__FILE__) . '/styles.css');
            //ajout du script lancant la requete ajax
            wp_enqueue_script('paa-ajax', plugin_dir_url(__FILE__) . '/script.js', array('jquery'));
            //on informe le script précédent de l'adresse "adminAjax" de wordpress
            wp_localize_script('paa-ajax', 'adminAjax', admin_url('admin-ajax.php'));
        }
    }

}
new PluginActionAjax();

Il ne reste plus qu’a créer le fichier script.js qui lancera l’appel de « process_action » lors de la soumission du formulaire généré par le shortcode. Il contient le code suivant :

jQuery(document).ready(function () {
    /*lors de la soumission du formulaire, on vérifie que le champ est replie et on appelle notre action ajax*/
    jQuery(document).on("submit", ".submit-input-ajax-container", function (e) {
        e.preventDefault();
        var input = jQuery("#submit-input-ajax").val();
        if (input == "") {
            alert("Vous devez completer le champ ! ");
        } else {
            jQuery.ajax({
                //apel de l'url ajax wordpress
                url: adminAjax,
                method: 'POST',
                data: {
                    //nom de notre action déclaré dans le plugin "wp_ajax_..."
                    action: 'process_action',
                    input: input
                },
                success: function (data) {
                    alert(data.data.message);
                },
                error: function (data) {
                    //erreur
                }
            });
        }
    });
});

Pour des explication détaillées, vous pouvez vous rendre sur cette page

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