Utilisation de Flutter
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!
Cré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.
Vous pouvez, lors de la création du write panel, indiquer qu’ils se comportera comme un article, et limiter 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.
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.
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;
}
- http://www.doc4design.com/articles/flutter-basic-usage/, http://www.doc4design.com/articles/flutter-duplicate-fields/ [↩]
Suggestions de lecture
Partagez avec les autres
Ça vous a plu?
Ne partez pas sans laisser votre appréciation!
















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:
0
0
@ Christophe
pouvez vous copier votre requete ici ?
Like or Dislike:
0
0
@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:
0
0
@ Christophe
C’est quelle requête exactement qui va pas ?
Like or Dislike:
0
0
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:
0
0
@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:
0
0
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:
0
0
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:
0
0
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:
0
0