[SPXSHORTCODES] environnement pour shortcodes

2

Réponses

  • okay j'ai enfin compris l'histoire !
    en fait je faisais ça depuis un bail :D
    j'avais un fichier widgets.php que j'appelais au chargement du site.
    Ce fichier était en quelque sorte ma bibliothèque d'adons (gallery, menu, carte GG, boutons, etc ...).
    Puis dans le template spécifique j'appelais la fonction adéquat.
    Avec ce plugin, exit les templates spécifiques, les widgets s'appellent directement à partir du contenu.
    Sympa l'idée.

    Cependant s'il y a une catégorie d'articles qui appellent à chaque fois un widget de gallery,
    il vaut tout de même mieux faire un template spécifique selon moi.

    Il y a aussi la question de la mise en page, balancer un diapo dans le flux c'est pas top ...
    Faire une mise en page spécifique pour mettre en avant ce diapo c'est mieux.

    Autre point, si l'auteur du site n'est pas le créateur,
    et si celui-ci souhaite écrire le moins de chose possible (ce qui est toujours le cas),
    il vaut mieux aussi dans ce cas automatiser le plus de chose.
    Donc faire un template spécifique ...

    Par expérience, plus vous laissez à vos clients la possibilité d'écrire (du code qui plus est),
    plus nombreuses seront les erreurs ... et plus ils vous appellent pour vous dire "mais pourquoi ..? " !

    Nous sommes d'accord,
    il y a la personne qui crée son propre site et qui ne comprend rien au code à part faire du copier/coller (utilité des short-codes)
    et il y a celle qui ne s'occupe que du contenu et qui fait appel à un pro pour le développement du site. (utilité des templates spécifiques)

    Les approchent sont différentes.
  • Hé les gars vous pouvez tester ce plugin via l'environnement shortcode : spxgooglemaps

    Tout est dans l'aide...
  • Salut,

    Le lien pour télécharger "shortcode" est mal formé (www.http//www......). ;)


    à plus,

    Gzyg
  • Gzyg a écrit:
    Le lien pour télécharger "shortcode" est mal formé (www.http//www......).
    Sur mon site tu veux dire. C'est ok merci.
  • FrancisFrancis Member
    janvier 2017 modifié
    Voici un shortcode qui me turlupinait depuis longtemps, pour afficher le contenu d'un plugin à l'intérieur d'une page.
    Il est téléchargeable ici.
    [Edit : une nouvelle version corrigée et améliorée est disponible dans ce post].

    Il remplace le code PHP callHook qui va chercher le contenu du plugin et peut lui transmettre des paramètres,

    Ce fichier zip contient un fichier qu'ill faut renommer en config.php et placer à la racine du thème (ou intégrer son contenu au fichier config.php s'il est déjà présent).
    En bonus, j'ai ajouté dans ce zip un shortcode de test, pour qui voudra s'essayer aux shortcodes de façon simple (à intégrer également au fichier config.php).

    Le shortcode s'appelle plxplugin, et le paramètre plugin="..." sert à donner le nom du plugin, ce qui donne :
    [plxplugin plugin="nom_du_plugin" param1="..." param2="..." param3="..."]
    
    Cet code est à utiliser pour un plugin qui affiche directement un contenu (avec "echo").

    Si le plugin renvoie une chaîne de texte ou une valeur (avec "return"), il faut ajouter "val-" juste avant le nom du plugin, pour afficher ce contenu :
    [plxplugin plugin="val-nom_du_plugin" param1="..." param2="..." param3="..."]
    

    Important :
    Les paramètres du plugin sont à donner les uns après les autres, et non dans un tableau comme avec le callHook habituel qui appelle les plugins.

    Une remarque :
    Si le shortcode est écrit avec un éditeur Wysiwyg, il sera généralement encadré par une balise p, ce qui ne sera pas génial si le contenu affiché est une balise ul, un bloc div, un formulaire, etc.
    Il suffit alors [del]d'activer le plugin shortcode_p (voir ici) et[/del] de remplacer le nom du shortcode plxplugin par -p-plxplugin pour faire disparaître cette balise p.

    Comme les shortcodes font partie du projet SPX, la discussion est initialisée ici sur le forum SPX, n'hésitez pas à vous y inscrire !
  • FrancisFrancis Member
    mai 2015 modifié
    Lorsqu'un shortcode est écrit avec un éditeur Wysiwyg, comme CKEditor ou TinyMCE, il est généralement encadré par une balise p.

    Le plugin shortcode_p permet d'enlever cette balise p, ce qui est nécessaire si le shortocode renvoie un code HTML du type <ul>...</ul> ou <div>...</div> par exemple : voir ici sur le forum PluXml et sur le forum du projet SPX.

    [Edit : Le plugin natif shortcode intègre maintenant cette fonction, cette variante temporaire shortcode_p n'est plus utile]
  • je-evrardje-evrard Member
    juin 2014 modifié
    Une petite mise à jour en version 1.1 intégrant la modification de francis sur la balise p. (Voir l'aide du plugin pour plus de détails).

    Option : supression de la balise p
    Si on utilise un éditeur Wysiwyg, un shortcode sera en général encadré par une balise p, que l'éditeur crée automatiquement.

    Mais si le shortcode renvoie un bloc div, une liste ul ou un formulaire form, ça fait un peu moche de voir l'ensemble entouré par une balise p.

    Une option permet d'enlever la balise p encadrant le shortcode, la demande s'effectuant en ajoutant "-p-" avant le nom du shortcode, juste après le crochet ouvrant.

    Shortcode normal :
    [== Indéfini ==]
    [nomdushortcode ...paramètres...] 
    

    Shortcode avec suppression de la balise p encadrant le shortcode :
    [== Indéfini ==]
    [-p-nomdushortcode ...paramètres...]
    
    Pour les enclosing on a donc :
    [== Indéfini ==]
    [-p-nomdushortcode ...paramètres...]my content[/nomdushortcode]
    


    téléchargement : ici
  • Merci bien Jérôme, j'ai testé et ça marche !
    Le plugin shortcode_p n'a plus d'utilité à présent, il est intégré dans cette version de spxshortcodes.

    Juste une petite erreur dans le fichier spxshortcodes.php, pour le commentaire de la ligne 99 :
    [== PHP ==]
    # del p for shorcode with <p>[-p-...][/-p-]</p>
    
    Le préfixe -p- ne s'écrit qu'avant le nom du shortcode, pas à la fin, donc on dirait plutôt :
    [== PHP ==]
    # del p for shorcode with <p>[-p-...]</p>  or  <p>[-p-...]...[/...]</p>
    
    Mais ce n'est qu'une ligne de commentaire, le plugin marche très bien quand même :)

    Et je viens de m'apercevoir qu'en tant que plugin indépendant, spxshortcodes ne figurait pas sur la page des plugins non officiels.
    J'ai modifié le wiki pour l'ajouter.
  • je-evrardje-evrard Member
    juin 2014 modifié
    Merci bien Francis.

    Je me suis permit d'ouvrir un forum de discussion sur les shortcodes : ici

    La liste va être longue en terme de possibilités !!!

    J'ai ajouté le shortcode de francis pour la récupération de données des plugins ici

    Libre a vous de vous inscrire sur le forum (me faire une demande) et de rajouter des shortcodes pour alimenter le forum.

    Un lien intéressant : bootstrap3 shortcode

    et aussi : ici

    Bonne journée sous le soleil.
  • C'est une bonne idée d'avoir ouvert une section "shortcodes" sur le forum SPX !
    Avec un topic séparé pour chaque shortcode, on s'y retrouvera mieux, c'est quelque chose qui manquait.
    Ça permettra aussi de discuter autour d'un shortcode précis et de le faire évoluer.

    Merci aussi pour le lien des shortcodes Bootstrap : il y a du monde, là-dedans ! Il y aurait du temps à passer pour sélectionner ce qui est intéressant...
    Est-ce que les 3 fichiers inclus suffisent à les faire fonctionner, tous ces shortcodes, ou est-ce qu'il faut Bootstrap complet pour ça ?
  • De rien Francis.
    Est-ce que les 3 fichiers inclus suffisent à les faire fonctionner, tous ces shortcodes, ou est-ce qu'il faut Bootstrap complet pour ça ?

    Tel quel non ça ne fonctionne pas mais ça donne une idée de structure dans des environnements précis comme bootstrap3. Ca fait réfléchir et ça permet de ne pas réinventer la roue qui est déja bien ronde.
  • **** v 1.2 ****
    - ajoute la possibilité pour un plugin externe de déclarer des shortcodes

    Voir l'aide du plugin pour plus de détails.
  • Merci Jérôme !
    Cette fonctionnalité est intéressante, elle permet de mettre dans le plugin tout ce qui s'y rapporte, y compris un shortcode associé, au lieu d'avoir un morceau dans le fichier config.php du thème.
  • Tout à fait Francis ! Je vous réserve une surprise de taille !
  • Bonjour,

    Encore un grand merci à toi je-evard pour ton boulot.
    Maintenant j'aimerais bien l'utiliser avec spxtynimce pour permettre d'appliquer les shortcodes directement via l'éditeur, mais je ne vois pas comment faire.

    Merci d'avance !
  • je-evrardje-evrard Member
    juillet 2014 modifié
    Hello,

    J'ai préparé deux zip pour toi. (spxtynimce dernière version et spxtinybtshortcode (en beta 0.1)).

    pour spxtynimce je l'ai modifié pour qu'un plugin externe puisse rajouter des boutons dans la toolbar.

    pour spxtinybtshortcode tu verras j'utilise un système de template bootstrap avec mustache.js (le plus dur est fait). Ca te donnera une idée du comment j'ai opéré. Il y d'autres chemins mais celui-ci me semble pas mal et me correspond (simple et ça marche)


    Tu as juste à me donner ton mail.

    a+

    jéjé
  • Merci je-evrard,

    Je viens de t'envoyer un MP.
  • Hello,

    Un petit shortcode qui va vous permettre d'afficher des post facebook directement dans vos pages :
    [== Indéfini ==]
    function facebook_php_func($atts, $content = null) {
    		$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    		$s='<section>
    			<p>';
    		$s.= '
    		
    		<div id="fb-root"></div>
    				<script>(function(d, s, id) {
    				  var js, fjs = d.getElementsByTagName(s)[0];
    				  if (d.getElementById(id)) return;
    				  js = d.createElement(s); js.id = id;
    				  js.src = "//connect.facebook.net/fr_FR/sdk.js#xfbml=1&version=v2.0";
    				  fjs.parentNode.insertBefore(js, fjs);
    				}(document, "script", "facebook-jssdk"));</script>
    
    
    
    				<div class="fb-comments" data-href="'.$actual_link.'" data-width="100%" data-numposts="10" data-colorscheme="light"></div>
    		';
    
    	$s.='</p>
    		</section>';
    	return $s;
    		
    }
    add_shortcode('WFACEBOOK', 'facebook_php_func');
    


    code a mettre dans le fichier de config.php du thème

    usage : n'importe ou par declaration de la balise [WFACEBOOK].

    exemple ici en bas de page

    a+

    jéjé
  • FrancisFrancis Member
    mai 2015 modifié
    J'ai modifié le shortcode que j'avais proposé ici il y a quelque temps et qui permet d'appeler n'importe quel plugin à l'intérieur d'une page.
    Changements :

    - rectification d'un problème qui apparaissait lorsqu'il n'y avait aucun argument

    - ajout d'une option, pour prévoir le cas où le nom de la fonction appelée dans le callHook est différent du nom du plugin
    => au lieu de [plxplugin plugin="nom_plugin" ...], on écrit alors [plxplugin plugin="nom_plugin/nom_fonction" ...].
    Les deux syntaxes sont utilisables.

    Et voici le shortcode plxplugin avec ces deux modifications :
    [== PHP ==]
    /* ---------------------------- FONCTION SHORTCODE plxplugin ---------------------------------*/
            
    // Ce shortcode permet d'appeler n'importe quel plugin actif à l'intérieur d'une page,
    // en écrivant un code du type :
    //                     [plxplugin plugin="nom_du_plugin" param1="..." param2="..." param3="..."]
    /*
    Exemple d'utilisation :
              [plxplugin plugin="nom_du_plugin" param1="..." param2="..."]
    Les noms des paramètres param1, param2, ... sont à remplacer par ceux utlisés dans le plugin.
    
    Il est possible de fournir un texte à afficher, avant et après : paramètres txtdebut="..." et txtfin="..."
    
    // Si le plugin affiche un contenu avec echo (cas le plus courant), celui-ci est récupéré et retourné par le shortcode
    // Sinon, le plugin renvoie une valeur => pour l'afficher, écrire "val-" avant le nom du plugin :     plugin="val-nom_du_plugin" au lieu de plugin="nom_du_plugin"
    
    Si le nom de la fonction dans callHook(nom_fonction) est différent de celui du plugin, écrire ce nom après un "/" dans l'argument plugin :
    plugin="nom_du_plugin/nom_de_la_fonction"      ou avec "val-"      plugin="val-nom_du_plugin/nom_de_la_fonction"
    /* -------------------------------------------------------------------------------------------*/
    function plxplugin_func($tab_atts) {
      $atts = shortcode_atts(array("plugin" =>"", "txtdebut"=>"", "txtfin"=>""), $tab_atts);
      extract($atts, EXTR_OVERWRITE);
      
      unset($tab_atts["plugin"], $tab_atts["txtdebut"], $tab_atts["txtfin"]); // attributs inutiles à transmettre au plugin
      $plxShow = plxShow::getInstance(); // pour appeler les fonctions de la classe plxShow
      
      // Si le nom du plugin est précédé de "val-", c'est qu'il renvoie une valeur qui sera retournée directement
      // Sinon, le plugin affiche lui-même le contenu, qu'il faut intercepter pour pouvoir la retourner
      if (substr($plugin, 0, 4)=="val-") {
            $plugin_retourne_valeur = true;
            $plugin = substr($plugin, 4); // suppression des 4 premiers caractères "val-" qui précèdent le nom du plugin
      }
      else { $plugin_retourne_valeur = false; }
      
      // Si le nom de la fonction (à appeler dans callHook) est différent de celui du plugin, il est mentionné dans l'argument plugin, après le caractère "/"
      $tab = explode("/", $plugin);
      $plugin = $tab[0];
      $fonction = (!empty($tab[1]))?      $tab[1]   :   $plugin;
      $txt_attributs = (empty($tab_atts))?   NULL   :   $tab_atts; 
      
      // Vérification de l'existence du plugin, avant de l'appeler, pour éviter tout message d'erreur 
      if ( ! empty($plxShow->plxMotor->plxPlugins->aPlugins[$plugin]) ) {
          // Appel de la fonction du plugin par son nom $plugin avec transfert du tableau de paramètres $tab_atts
          if ($plugin_retourne_valeur) { // Si le plugin renvoie le contenu sous forme de variable
              $resultplugin = $plxShow->plxMotor->plxPlugins->aPlugins[$plugin]->$fonction($txt_attributs);
              return $txtdebut . $resultplugin . $txtfin;
          }
          else { // Si le plugin affiche directement le contenu avec "echo"
              ob_start();
              $plxShow->plxMotor->plxPlugins->aPlugins[$plugin]->$fonction($txt_attributs);
              $resultplugin = ob_get_clean();
              return $txtdebut . $resultplugin . $txtfin;
          }
      }
      else { return ""; } // Fin du if ... else ... testant l'existence ou non du plugin
    
    }
    
    add_shortcode( 'plxplugin', 'plxplugin_func' );
    
    

    Je l'ai testé avec le plugin mcatalogue, cela permet d'afficher les produits d'une catégorie dans n'importe quelle page du site.
  • FrancisFrancis Member
    janvier 2016 modifié
    Lorsqu'un shortcode est utilisé à partir d'un éditeur comme CKEditor, il est entouré de balises <p> et </p> qu'il faut enlever si le shortcode génère une balise <div> par exemple, sinon le HTML n'est plus valide.

    Le préfixe -p- devant le nom du shortcode enlève ces balises p, mais ça ne fonctionne pas bien si le shortcode possède un contenu sur plusieurs lignes, encadré par [-p-nomdushortcode] et [/-p-nomdushortcode].

    Les cas de figure à prendre en compte sont les suivants :
    [== HTML ==]
    <p>[-p-nomdushortcode]</p>
    
    
    <p>[-p-nomdushortcode] ... [/-p-nomdushortcode]</p>
    
    
    <p>[-p-nomdushortcode]</p>
     ... ... ...
    <p>[/-p-nomdushortcode]</p>
    
    et celui-ci, avec <br> ou <br />, qui se produit si le rédacteur a utilisé Maj+Entrée :
    [== HTML ==]
    <p>[-p-nomdushortcode]<br>
     ... ... ...
    <br>[/-p-nomdushortcode]</p>
    
    Pour traiter tous ces cas de figure, j'ai modifié de la façon suivante la fonction shortcode_p_replace, dans le fichier spxshortcodes.php du plugin :
    [== PHP ==]
      # Delete p for shorcode with :
      #        <p>[-p-...]</p>
      #   or   <p>[-p-...]...[/-p-...]</p>
      #   or   <p>[-p-...]</p> ... <p>[/-p-...]</p>
      # Move p into the shorcode with :
      #        <p>[-p-...]<br> ... <br>[/-p-...]</p>     (<br> instead of </p> or <p> inside the shortcode - works too with <br />)
      public static function shortcode_p_replace($txtcontenu) {
      // 1- del p for shorcodes with  <p>[-p-...]</p>
      // 2- del p for shorcodes with  <p>[-p-...]...[/-p-...]</p>
      // 3- del p for CLOSING shorcodes in   <p>[-p-...]</p> ... <p>[/-p-...]</p> ONLY
        $pattern1 = '/(<p[^>]*>[^<]*\[-p-(.*)\][^<]*<\/p>)/u';
        $pattern2 = '/(<p[^>]*>[^<]*\[-p-(.*)\][^<]*<\/p>)/u';
        $pattern3 = '/(<p[^>]*>[^<]*\[\/-p-(.*)\][^<]*<\/p>)/u'; 
        foreach (array($pattern1, $pattern2, $pattern3) as $pattern) {
            if ($pattern==$pattern3) { $openbracket = '[/'; }  else  { $openbracket = '[';}
            $existe_lignecode = false;
            $existe_lignecode = preg_match_all($pattern, $txtcontenu, $tab_shortcodes, PREG_SET_ORDER);
            if ($existe_lignecode) {
              foreach ($tab_shortcodes as $tab_shortcodecourant) { 
                $shortcode_avec_balise_p = $tab_shortcodecourant[1];
                $shortcode_seul = $openbracket . $tab_shortcodecourant[2] . "]";
                $txtcontenu = str_replace($shortcode_avec_balise_p, $shortcode_seul, $txtcontenu);
              } 
            }
        } 
        
        // 4- move <p> for opening shorcodes   <p>[-p-...]<br>  or  <p>[-p-...]<br /> => [...]<p>
        // 5- move </p> for CLOSING shorcodes   <br>[/-p-...]</p>  or  <br />[-p-...]</p> => [...]<p>
        foreach (array('<br>', '<br \/>') as $br_tag) {
          $pattern4 = '/(<p[^>]*>[^<]*\[-p-(.*)\][^<]*' . $br_tag . ')/u';
          $pattern5 = '/(' .$br_tag. '[^<]*\[-p-(.*)\][^<]*<\/p>)/u';
          foreach (array($pattern4, $pattern5) as $pattern) {
            if ($pattern==$pattern4) {
                $openbracket = '[';
                $closebracket = ']<p>'; }
            elseif ($pattern==$pattern5) {
                $openbracket = '</p>[';
                $closebracket = ']'; }
            $existe_lignecode = false;
            $existe_lignecode = preg_match_all($pattern, $txtcontenu, $tab_shortcodes, PREG_SET_ORDER);
            if ($existe_lignecode) {
                foreach ($tab_shortcodes as $tab_shortcodecourant) { 
                    $shortcode_avec_balise_p = $tab_shortcodecourant[1];
                    $shortcode_seul = $openbracket . $tab_shortcodecourant[2] . $closebracket;
                    $txtcontenu = str_replace($shortcode_avec_balise_p, $shortcode_seul, $txtcontenu);
                } 
            }
          } 
        } 
        
        // for close [/-p-...]
        $txtcontenu = str_replace("[/-p-", "[/", $txtcontenu);
    
        return $txtcontenu;
      }
    
    J'ai testé, normalement ça marche.
  • Hello Francis et bonne année,

    Merci pour les modifications, je vais tester ça rapidement et ferais une nouvelle version. Désolé de ne pas être trop sur le forum en ce moment mais je bosse sur un gros gros projet qui se termine. Je pourrais ainsi reprendre mes devs pluxml très bientôt.

    Je te tiens au courant,

    a+

    jéjé
  • Merci Jéjé, je me doutais que tu étais très occupé, on te voyait beaucoup moins sur le forum depuis quelque temps.
    Bonne année à toi aussi et bon courage pour ton méga-projet !
    Et à très bientôt sur le forum, pour de nouvelles aventures autour de PluXml ! :)
  • Coucou,

    J'ai testé ta fonction francis.


    Declaration des shorcodes theme/config.php :
    [== Indéfini ==]
    <?php 
    
    function button_shortcode1() {
        return '<a href="http://twitter.com/filipstefansson" class="twitter-button">Follow me on Twitter!</a>';
    }
    add_shortcode('button1', 'button_shortcode1'); 
    
    
    function caption_shortcode1( $atts, $content = null ) {
    	return '<span class="caption">' . $content . '</span>';
    }
    add_shortcode( 'caption1', 'caption_shortcode1' );
    
    ?>
    


    html dans l'article :
    [== Indéfini ==]
    <p>[button1]</p>
    <p>[caption1]My caption[/caption1]</p>
    <p>[caption1]</p>
    <p>My caption</p>
    <p>[/caption1]</p>
    <p>-------------------------------------</p>
    <p>[-p-button1]</p>
    <p>[-p-caption1]My caption[/-p-caption1]</p>
    <p>[-p-caption1]</p>
    <p>My caption</p>
    <p>[/-p-caption1]</p>
    

    Rendu fontend html :
    [== Indéfini ==]
    
    <p><a href="http://twitter.com/filipstefansson" class="twitter-button">Follow me on Twitter!</a></p>
    <p><span class="caption">My caption</span></p>
    <p><span class="caption"></p>
    <p>My caption</p>
    <p></span></p>
    <p>-------------------------------------</p>
    <a href="http://twitter.com/filipstefansson" class="twitter-button">Follow me on Twitter!</a>
    <span class="caption">My caption</span>
    <span class="caption">
    <p>My caption</p>
    </span>
    

    Ca marche plutot pas mal Francis ! J'intègre ça dans la version avant fin de semaine. Bravo a toi. Comment font-ils dans wordpress ?

    a+

    jeje

    PS : oui j'étais très occupé mais je reviens sur la scène pluxml. héhé.
  • FrancisFrancis Member
    avril 2016 modifié
    Merci bien Jéjé !
    Bien content de te revoir ici :)

    En cherchant pour Wordpress, je vois une fonction qui remplace "<p>[" par "[", etc.
    Pas idéal, ça pourrait modifier autre chose que les shortcodes.
    Je vois aussi un filtre Wordpress wpautop à modifier et des expressions régulières hyper compliquées, bref pas de solution miracle à première vue.
  • Mise a jour 1.3 (contribution francis)

    **** v 1.3 ****
    - mod function shortcode_p_replace
  • je-evrardje-evrard Member
    juin 2016 modifié
    Un petit shortcode intéressant :
    [== PHP ==]
    // [staticUrl id=001]
    function staticUrl_func ( $atts, $content = null ) {
    	$plxMotor = plxMotor::getInstance();
    	
    	extract(shortcode_atts(array(
    		'id' => '',
    	), $atts));
    	
    	$type='relatif';
    	# Recupération ID URL
    	$staticId = $id;
    	$staticIdFill = str_pad($staticId,3,'0',STR_PAD_LEFT);
    	if(!empty($staticId) AND isset($plxMotor->aStats[ $staticIdFill ]))
    	return  $plxMotor->urlRewrite('?static'.$staticId.'/'.$plxMotor->aStats[ $staticIdFill ]['url']);
    
    }
    
    add_shortcode( 'staticUrl', 'staticUrl_func' );
    

    Par exemple pour créer des liens via des boutons entre pages statiques :
    [== Indéfini ==]
    <a class="button" title="" href="[staticUrl id=012]">En savoir plus</a>
    

    Affiche l'url de la page statique en question.
  • Merci Jéjé, c'est intéressant à la fois pour le shortcode et pour le principe.

    Ça montre qu'on peut mettre un shortcode à l'intérieur d'une balise, dans un attribut, je n'avais pas pensé à ce type d'utilisation.
  • je-evrardje-evrard Member
    juin 2016 modifié
    On peut faire mieux Francis !

    Ce shortcode ci dessous a insérer dans la config.php de votre thème bien sur :
    [== Indéfini ==]
    function plx_get_the_ip() {
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            return $_SERVER["HTTP_X_FORWARDED_FOR"];
        }
        elseif (isset($_SERVER["HTTP_CLIENT_IP"])) {
            return $_SERVER["HTTP_CLIENT_IP"];
        }
        else {
            return $_SERVER["REMOTE_ADDR"];
        }
    }
    
    function plx_contact_form_func( $atts ) {
    	global $plxShow;
    	$plxShow = plxShow::getInstance();
    	$plxShow->plxMotor->plxCapcha = new plxCapcha();
    	
        // This line of comment, too, holds the place of the brilliant yet simple shortcode that creates our contact form. And yet you're still wasting your time to read this comment. Bravo.
    	extract( shortcode_atts( array(
        // if you don't provide an e-mail address, the shortcode will pick the e-mail address of the admin:
        "email" => "",
    	"email_cc" => "",
    	"email_bcc" => "",
    	
        "subject" => "",
        "label_name" => "Your Name",
        "label_email" => "Your E-mail Address",
        "label_subject" => "Subject",
        "label_message" => "Your Message",
        "label_submit" => "Submit",
        // the error message when at least one of the required fields are empty:
        "error_empty" => "Please fill in all the required fields.",
        // the error message when the e-mail address is not valid:
        "error_noemail" => "Please enter a valid e-mail address.",
    	"error_sendemail" => "There is an error, sorry",
    	
    	"error_antispam" => "There is an error antispam, sorry",
    	"captcha" => "true",
    	"label_antispam" => "Antispam",
        // and the success message when the e-mail is sent:
        "success" => "Thanks for your e-mail! We'll get back to you as soon as we can.",
    	
    	), $atts ) );
    	
    	// if the <form> element is POSTed, run the following code
    	if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
    		$error = false;
    		// set the "required fields" to check
    		$required_fields = array( "your_name", "email", "message", "subject" );
    	 
    		// this part fetches everything that has been POSTed, sanitizes them and lets us use them as $form_data['subject']
    		foreach ( $_POST as $field => $value ) {
    			if ( get_magic_quotes_gpc() ) {
    				$value = stripslashes( $value );
    			}
    			$form_data[$field] = strip_tags( $value );
    		}
    	 
    		// if the required fields are empty, switch $error to TRUE and set the result text to the shortcode attribute named 'error_empty'
    		foreach ( $required_fields as $required_field ) {
    			$value = trim( $form_data[$required_field] );
    			if ( empty( $value ) ) {
    				$error = true;
    				$result = $error_empty;
    			}
    		}
    	 
    		// and if the e-mail is not valid, switch $error to TRUE and set the result text to the shortcode attribute named 'error_noemail'
    		if (! filter_var($form_data['email'], FILTER_VALIDATE_EMAIL)) {
    			$error = true;
    			$result = $error_noemail;
    		}
    		
    		if($captcha == "true" AND $_SESSION['capcha'] != sha1($_POST['rep'])){
    			$error = true;
    			$result = $error_antispam;
    		}
    	 
    		// but if $error is still FALSE, put together the POSTed variables and send the e-mail!
    		if ( $error == false ) {
    			
    			$email_subject = $form_data['subject'];
    			// get the message from the form and add the IP address of the user below it
    			$email_message = $form_data['message'] . "\n\nIP: " . plx_get_the_ip();
    			
    			if(plxUtils::sendMail($form_data['your_name'],$form_data['email'],$email,$email_subject,$email_message,'text',$email_cc,$email_bcc)) {
    				// and set the result text to the shortcode attribute named 'success'
    				$result = $success;
    				// ...and switch the $sent variable to TRUE
    				$sent = true;
    			}else{
    				$result = $error_sendemail;
    			}
    			
    		}
    	}
    	
    	if ( $result != "" ) {
    		if ($error == true)
    			$info = '<div class="alert red">' . $result . '</div>';
    		else
    			$info = '<div class="alert blue">' . $result . '</div>';
    	}
    	
    	
    	
    	ob_start();
    	$plxShow->capchaQ();
    	$capcha = ob_get_clean();
    	
    	
    	// anyways, let's build the form! (remember that we're using shortcode attributes as variables with their names)
    	$email_form = '<form class="contact-form" method="post" action="#form">
    		<div>
    			<label for="cf_name">' . $label_name . ':</label>
    			<input type="text" name="your_name" id="cf_name" size="50" maxlength="50" value="' . $form_data['your_name'] . '" />
    		</div>
    		<div>
    			<label for="cf_email">' . $label_email . ':</label>
    			<input type="text" name="email" id="cf_email" size="50" maxlength="50" value="' . $form_data['email'] . '" />
    		</div>
    		<div>
    			<label for="cf_subject">' . $label_subject . ':</label>
    			<input type="text" name="subject" id="cf_subject" size="50" maxlength="50" value="' . $subject . $form_data['subject'] . '" />
    		</div>
    		<div>
    			<label for="cf_message">' . $label_message . ':</label>
    			<textarea name="message" id="cf_message" cols="50" rows="15">' . $form_data['message'] . '</textarea>
    		</div>
    		';
    	if($captcha == "true") {
    	$email_form .='
    		<div>
    			<label for="id_rep"><strong>' . $label_antispam. '</strong></label>
    			'.$capcha.'
    			<input id="id_rep" name="rep" type="text" size="2" maxlength="1" style="width: auto; display: inline;" autocomplete="off" />
    		</div>
    		';
    	}
    	$email_form .='
    		<div>
    			<input type="submit" value="' . $label_submit . '" name="send" id="cf_send" />
    		</div>
    		
    	</form>';
    	
    	if ( $sent == true ) {
    		return $info;
    	} else {
    		return $info . $email_form;
    	}
    
     }
    add_shortcode( 'contact', 'plx_contact_form_func' );
    

    Il permet tout simplement d'afficher un formulaire de contact avec tout ce qui va bien n'importe ou (compatible plucss) et avec antispam optionnel.

    Pour l'usage :
    [== Indéfini ==]
    [contact 
    email="mymail@toto.fr" 
    subject="Projet spx 5" 
    label_name="Votre nom" 
    label_email="Votre addresse email" 
    label_subject="Sujet" 
    label_message="Votre message" 
    label_submit="Envoyer" 
    label_antispam="Vérification anti-spam." 
    error_empty="Veuillez remplir tous les champs." 
    error_noemail="Veuillez entrer une adresse email valide." 
    error_sendemail="Il y a eu une erreur d'envoie" 
    error_antispam="Vous n'avez pas rentrer la bonne lettre pour l'antispam" 
    success="Merci pour votre message ! Nous reviendrons vers vous dès que possible."
    ]
    

    A utiliser sans modération dans une bonne page statique sans une ligne de code et sans plugin ! Enjoy !

    Ca serait inéressant d'avoir un petit emplacement lié au sujet car les possiblités sont nombreuses et flexibles !
  • FrancisFrancis Member
    juin 2016 modifié
    Merci Jéjé pour cette version du formulaire.

    En fait, j'utilise déjà régulièrement une méthode voisine pour afficher un formulaire, avec ce shortcode :
    [== PHP ==]
    /* ---------------------------- FONCTION SHORTCODE affichage_formulaire ---------------------------------*/
    
    // Affiche le formulaire de contact
    //
    // Utilisation :     [-p-affichage_formulaire]     ou     [-p-affichage_formulaire lienform="formulaire-contact.php"]
    //
    // Le préfixe "-p-" avant le shortcode "affichage_formulaire" enlève la balise <p...>...</p> autour du shortcode, pour qu'elle n'entoure pas le formulaire
    //
    function affichage_formulaire_func($atts) {
    // Fonction qui inclut le fichier PHP contenant le formulaire de contact
      extract(shortcode_atts(array("lienform" => 'formulaire-contact.php'), $atts));
      
      $plxShow = plxShow::getInstance(); // pour appeler les fonctions de la classe plxShow
      
      // Chemin du formulaire = celui du template courant (ATTENTION : il faut ici utiliser le chemin RELATIF vers le fichier du formulaire)
      // Chemin absolu vers le dossier template
      ob_start();      $plxShow->template();      $cheminabsolu = ob_get_clean();
      // Chemin de la racine du site
      ob_start();      $plxShow->racine();        $chemin_racine = ob_get_clean();
      // Chemin relatif vers le dossier template
      $cheminrelatif = str_replace($chemin_racine, "", $cheminabsolu) . "/";
      
      $fichieraveccheminrelatif = $cheminrelatif . $lienform;
      
      ob_start();
          include $fichieraveccheminrelatif;
      $txt_form = ob_get_clean();
      
      return $txt_form;
    }
    
    
    add_shortcode( 'affichage_formulaire', 'affichage_formulaire_func' );
    
    et comme indiqué en commentaire, l'utilisation de cette façon à l'intérieur d'une page :
    [affichage_formulaire lienform="monformulaire.php"]
    

    avec dans le dossier du thème courant, un fichier "formulaire-contact.php" contenant un formulaire inspiré du plugin plxMyContact de Stéphane.
  • ppmtppmt Member
    juin 2016 modifié
    Oh je peux supprimer un plugin!

    Je n'ai rien contre les plugins mais un de moins ne fera pas de mal

    Une petite faute dans le code au niveau de la ligne pour envoyer le mail. Le $email_cc est repeter 2 fois. Le 2eme doit etre remplacer pas $email_bcc je pense :)

    Merci beaucoup.

    PS:Je me rends bien compte que j'utilise un plugin pour remplacer un autre plugins mais comme j'utilise deja spxshortcodes...

    PS2: desole pour le message original en anglais....des fois j'oublie a qui je parle !
Connectez-vous ou Inscrivez-vous pour répondre.