Accueil English Classique A propos Contact rss
WordPress from the beginning
Articles de fond, tests de plugins, modes d'emploi et astuces sur ce CMS
accueil mots-clés plan du blog

Utilisation de Flutter

    Flutter préfigure ce que deviendra sans doute WordPress d'ici quelques années, à savoir un véritable CMS permettant de gérer des types de contenus complexes. Ce besoin est si important dans la création du site, que Drupal lui même, intégrera dans sa version 7 le fameux module CCK.

    De quoi s’agit t’il?

    Vous aurez besoin de cet article si vous créez des sites avec WordPress qui nécessitent plus de types de contenus que les deux de base « articles et pages », et si vous souhaitez ajouter des champs à ceux de base « titre, extrait, texte ».

    Flutter est un des plugins qui permet cela. Il a été développé pour répondre aux besoins des clients d’une agence de création de sites. Il est assez critiqué pour les bugs qu’il contiendrait, son absence de volonté de fournir des mises à jour à la communauté, et sa documentation spartiate, d’où l’idée de cet article.

    Il donne en tout cas des idées aux créateurs de WordPress pour les futures version…

    Note: flutter est un plugin très vaste et cet article se concentre uniquement sur l’aspect « type de contenu » apporté par Flutter, et comment intégrer ces contenus dans le thème. Cet article s’adresse aux webmasters qui utilisent php.

    Installation

    L’installation automatique depuis le tableau de bord fonctionne très bien. Quand on active le plugin, on reçoit une joyeux message qui nous dit qu’il faut créer 3 dossiers :

    Flutter is not ready yet. must create the following folders (and must be writable):

    • wp-content/plugins/fresh-page/thirdparty/phpthumb/cache/
    • wp-content/files_flutter/
    • wp-content/files_flutter/modules/

    Une fois ce détail réglé, Flutter a sa page d’options dans le menu réglage, et un propre menu à part à la racine qui permet de gérer les types de contenus.

    Page d’option

    On peut pousser le bouchon jusqu’à faire disparaître les menus « article et page » de WordPress et n’utiliser que les types de contenus crées avec flutter!

    Options de flutterCréation de nouveaux contenus

    Un nouveau type de contenu, comme article ou page, s’appelle un « write panel ». Par exemple, votre blog veut faire la promotion de musiciens, vous créez un write panel « musicien », vous y mettez les champs « instrument, adresse, site web, page myspace, démos mp3″ etc. Et quand vous obtenez les infos d’un musicien, au lieu de créer un nouvel article, vous créez un nouveau musicien.

    Exemple de trois write panels

    Exemple de trois write panels

    Vous pouvez, lors de la création du write panel, indiquer qu’ils se comportera comme un article, et limiter ses catégories.

    Type de write panel et ses catégories

    Comment ça marche derrière?

    En fait, c’est un nouvel article que flutter va créer, mais cet article aura tous les champs supplémentaires que vous avez mis dans le write panel.

    Techniquement, flutter utilise les post_meta pour stocker les valeurs des champs supplémentaires. C’est le même principe que les champs personnalisés, sauf que flutter apporte tous les types de champs usuels: textfield, textarea, select, checkbox, file, image, color etc.

    Types de champs dans Flutter 1.1

    Aussi, vous pouvez créer des champs réplicables. Par exemple, pour le musicien, un champ « site web », serait réplicable à volonté autant de fois que le musicien a de sites, directement depuis le formulaire d’édition du musicien, donc potentiellement par le musicien lui même s’il a un accès au blog.

    On peut aussi regrouper les champs dans un groupe, rendre ces groupes réplicables, et les ordonner en drag and drop, façon jquery sortable.

    Exemple de groupes et champs d'un write panel

    Affichage dans le blog

    Si votre write panel est de type « article », c’est le fichier single.php quîl faudra aller modifier pour y ajouter quelques codes php qui permettront d’afficher les valeurs des nouveaux champs.

    La plus part du temps, on utilise la fonction get(nom du champ).

    A partir de la doc de flutter et de ces liens1, j’ai pu en retirer les codes suivants.

    Champs non dans un groupe, et non réplicables

    Champ texte (une valeur)

    On appelle la fonction get en lui passant le nom du champ:

    echo 'simple_text: ' . get('simple_text');
    

    Zone de texte multilignes (une valeur)

    On appelle la fonction get en lui passant le nom du champ:

    echo 'simple_textarea: ' . get('simple_textarea');
    

    Checkbox unique (une valeur)

    On aura besoin de faire un petit test pour savoir si la case est cochée:

    echo 'simple_checkbox: ' . get('simple_checkbox') == 'true' ? 'checked' : 'not checked';
    

    Checkbox mutliple (plusieurs valeurs)

    On aura besoin de faire une boucle car la valeur est sérialisée:

    echo 'simple_checkboxlist: ';
    $cklist = get('simple_checkboxlist');
    foreach($cklist as $check) { echo $check; }
    

    Fichier (une valeur, l’url)

    A mettre dans un href:

    echo  get('simple_file');
    

    Date (une valeur)

    Il faudra faire un peu de formatage:

    $date = get('simple_date');
    $timestamp = strtotime($date);
    echo 'simple_date: ' . date('d m Y', $timestamp);
    

    Audio (une valeur)

    Affiche automatiquement un petit lecteur, si pas joli, utilisez que get() et votre lecteur:

    echo 'simple_audio: ' . get_audio('simple_audio');
    

    Couleur (une valeur)

    Couleur html hexadécimale:

    echo  'simple_color: ' . get('simple_color');
    

    Champ non réplicable, dans un groupe non réplicable

    Pas besoin d’indiquer d’autres paramètre en fait:

    echo 'groupe_texte1: ' . get('groupe_texte1');
    

    Champs non dans un groupe, et réplicable

    Methode manuelle

    C’est ici que la fonction get() peut paraître obscure:

    get ( fieldname, group_count, field_count  )
    

    Un petit tour dans le phpmyadmin nous apprend que flutter enregistre pour chaque valeur son numéro de groupe (si le groupe est réplicable) et son numéro de champ (si le champ est réplicable). Ne pas confondre ces numéros avec des ids de groupe ou de champ, rien à voir. En terme d’id, c’est simple, TOUS les champs flutter doivent avoir des noms différents!

    echo 'mult_text: ';
    echo get('mult_text',1, 1);
    echo get('mult_text',1, 3);
    echo get('mult_text',1, 4);
    

    Dans cet exemple, le champ a été répliquà trois fois et j’ai effacé le deuxième. On s’aperçoit immédiatement que la méthode manuelle nous est d’aucune utilité dès qu’on passe en réplicable.

    Méthode automatique

    Voici une idée:

    global $wpdb, $post;
    
    $sql =
    '
    SELECT
    {$wpdb->prefix}postmeta.meta_key as 'name', {$wpdb->prefix}postmeta.meta_value as 'value'
    FROM {$wpdb->prefix}postmeta, {$wpdb->prefix}rc_cwp_post_meta
    WHERE {$wpdb->prefix}postmeta.meta_id = {$wpdb->prefix}rc_cwp_post_meta.id
    AND {$wpdb->prefix}postmeta.post_id = {$post->ID}
    AND {$wpdb->prefix}postmeta.meta_key = 'mult_text'
    ORDER BY
    {$wpdb->prefix}rc_cwp_post_meta.field_count
    ';
    
    $rows = $wpdb->get_results($sql, ARRAY_A);
    
    foreach ( $rows as $field ) {
    echo $field['value'] . '';
    }
    

    Champs non réplicables, dans un groupe réplicable

    Méthode manuelle

    Toujours aussi inutile en pratique:

    echo 'field1 et field2:';
    
    // get ( fieldname, group_count, field_count  )
    echo get('field1',1, 1) . ', ' . get('field2',1, 1);
    echo get('field1',3, 1) . ', ' . get('field2',3, 1);
    echo get('field1',5, 1) . ', ' . get('field2',5, 1);
    echo get('field1',4, 1) . ', ' . get('field2',4, 1);
    

    Dans cet exemple j’ai un groupe fait de deux champs, le groupe a été répliqué 4 fois et j’ai effacé le deuxième.

    Méthode automatique

    Voici une méthode qui sort toutes les valeurs de tous les groupes, les groupes sont classés, chaque champ a sa variable dans les tours du foreach:

    global $wpdb, $post;
    
    $sql =
    '
    SELECT
    group_concat({$wpdb->prefix}postmeta.meta_value ORDER BY {$wpdb->prefix}postmeta.meta_key SEPARATOR '|') as 'value'
    FROM {$wpdb->prefix}postmeta, {$wpdb->prefix}rc_cwp_post_meta
    WHERE {$wpdb->prefix}postmeta.meta_id = {$wpdb->prefix}rc_cwp_post_meta.id
    AND {$wpdb->prefix}postmeta.post_id = {$post->ID}
    AND {$wpdb->prefix}postmeta.meta_key
    IN (
    'field1', 'field2'
    )
    GROUP BY {$wpdb->prefix}rc_cwp_post_meta.order_id
    ORDER BY
    {$wpdb->prefix}rc_cwp_post_meta.order_id, {$wpdb->prefix}rc_cwp_post_meta.field_name
    ';
    
    $rows = $wpdb->get_results($sql, ARRAY_A);
    
    foreach ( $rows as $field ) {
    list($field1, $field2) = explode('|', $field['value']);
    echo  'field1= ' . $field1 . ' et field2= ' . $field2;
    }
    
    1. http://www.doc4design.com/articles/flutter-basic-usage/, http://www.doc4design.com/articles/flutter-duplicate-fields/ []

    Partagez avec les autres

    Share/Bookmark

    Ça vous a plu?

    Ne partez pas sans laisser votre appréciation!
    6 vote(s) 1 Etoile2 Etoiles3 Etoiles4 Etoiles5 Etoiles Loading ... Loading ...

    Réactions

    comments 9 commentaires
    1. Christophe
      28/08/2010 à 15:25

      SELECT group_concat(wp3_postmeta.meta_value ORDER BY wp3_postmeta.meta_key SEPARATOR ‘|’) as ‘value’ FROM wp3_postmeta, wp3_rc_cwp_post_meta WHERE wp3_postmeta.meta_id = wp3_rc_cwp_post_meta.id AND wp3_postmeta.post_id = 73 AND wp3_postmeta.meta_key IN (‘field1′, ‘field2′) GROUP BY wp3_rc_cwp_post_meta.order_id ORDER BY wp3_rc_cwp_post_meta.order_id, wp3_rc_cwp_post_meta.field_name

      Like or Dislike: Thumb up 0 Thumb down 0

    2. 26/08/2010 à 07:13

      @ Christophe
      pouvez vous copier votre requete ici ?

      Like or Dislike: Thumb up 0 Thumb down 0

    3. Christophe
      25/08/2010 à 22:59

      @Anthony

      « méthode qui sort toutes les valeurs de tous les groupes, les groupes sont classés, chaque champ a sa variable dans les tours du foreach: »

      La dernière en somme, je l’ai testé sous mysql directement, elle me sort 0 résultats

      Like or Dislike: Thumb up 0 Thumb down 0

    4. 17/08/2010 à 14:28

      @ Christophe
      C’est quelle requête exactement qui va pas ?

      Like or Dislike: Thumb up 0 Thumb down 0

    5. 17/08/2010 à 14:14

      Très bonne synthèse, j’utilise Flutter depuis pas mal de temps déjà, mais j’ai trouvé la méthode d’automatisation présentée plus sympas que la mienne, sauf que lorsque je l’a teste sur mon preprod elle me ressort 0 résultats …
      Une idée ?

      Like or Dislike: Thumb up 0 Thumb down 0

    6. 13/06/2010 à 18:58

      @sebastien
      Si j’ai bien compris vous voulez savoir quel type d’article affiche single.php par exemple ? Il y a une méta qu’on peut interroger pour chaque post, elle s’appelle _rc_cwp_write_panel_id, elle contient l’identifiant du panel, voici exemple à mettre dans la boucle de single.php :

      global $post;
      if ( get_post_meta($post->ID, ‘_rc_cwp_write_panel_id’, true) == ’1′ ) {
      echo ‘c’est une voiture’;
      }
      else if ( get_post_meta($post->ID, ‘_rc_cwp_write_panel_id’, true) == ’2′ ) {
      echo ‘c’est une moto’;
      }

      Like or Dislike: Thumb up 0 Thumb down 0

    7. sebastien
      09/06/2010 à 16:21

      C’est un excellent article ! Saurais-tu si il est possible de cibler un type d’articles. Par-exemple si j’ai créé un menu « voiture de collection » et un menu « moto », est-ce que je peux dans mon single.php ecrire un truc du genre
      if is_InMenu(« voiture de collection ») {
      } elseif is_InMenu(« moto »){
      }

      Like or Dislike: Thumb up 0 Thumb down 0

    8. 13/02/2010 à 16:13

      J’ai ce plugin en fonction sur imaginaid.org, qui n’a « que » quelques dizaines de visites par jour, donc pas un exemple de référence. Note: depuis wordpress 2.9, les types des contenus ont été abstrait dans le core lui même (cf note dans http://icio.us/upq35s), ce qui veut dire que wordpress 3 devrait avoir une fonction « flutter » built in, en principe… de toute façon de nombreux plugins sur le sujet devraient fleurir :O)

      Like or Dislike: Thumb up 0 Thumb down 0

    9. 13/02/2010 à 12:50

      Excelente presentation…
      quelqu’un a essayer d’utilisez ce plug en prod… ?
      Ca semble une assez bonne solution à des dev parfois un peu limite coté WP…

      Like or Dislike: Thumb up 0 Thumb down 0

    Haut de page
    Choisissez vos widgets

    A propos de cet article

    Wordpress from the beginning is a production of Woodymood
    Performance Optimization WordPress Plugins by W3 EDGE