CMB 2 save custom field types

Par Florian.C, il y a 9 ans


Bonjour,

Tout d'abord j'utilise Worpress et cmb2 dans leur dernière version.

J'essaye de créer un champ personnalisé dans un Custom Post Type. Ce champ utilise CMB2 et liste tous les établissements qui ont été créé dans un autre CPT.

On voit bien tous les établissements. Mon problème c'est qu'il ne le prend pas en compte. Tout d'abord dans le back office rien n'est sélectionné mais pire, dans la base de données (post_meta) il est introuvable.

Dans la doc dont je me suis servi (l'exemple du mail), cela fonctionne mais pas avec mon code : https://github.com/CMB2/CMB2/wiki/Adding-your-own-field-types.

Voici mon code + screen du résultat (http://prntscr.com/fdqd65)

//Paramètre de la metabox, fait le listing des établissements function cmb2_render_etablissement_nom() { //Recupère les noms des établissements $args_etablissement = array( 'post_type' => 'etablissement', 'post_status' => 'publish', 'order' => 'DESC', ); $query_etablissement = new WP_Query( $args_etablissement ); $tab_etablissement = array(); $i = 1; echo '<input type="radio" name="établissement" value="0">Aucun <br/>'; if( $query_etablissement->have_posts() ) { while ($query_etablissement->have_posts()) { $query_etablissement->the_post(); $tab_etablissement[$i] = get_the_title(); echo '<input type="radio" name="établissement" value="' . $i . '">' . $tab_etablissement[$i]; if ($i % 2 == 0){ echo "<br/>"; } $i++; } } } add_action( 'cmb2_get_etablissement', 'cmb2_render_etablissement_nom', 10, 5 ); //En back affiche la metabox function cmb2_etablissement_metabox() { $cmb30 = new_cmb2_box( array( 'id' => 'cmb2_etablissement', 'title' => 'Etablissement', 'object_types' => array( 'conference_fdesr' ), ) ); $cmb30->add_field( array( 'name' => 'Etablissement à selectionné', 'id' => 'cmb2_etablissement_select', 'type' => 'radio', 'options_cb' => 'cmb2_render_etablissement_nom', ) ); } add_action( 'cmb2_admin_init', 'cmb2_etablissement_metabox' );

Je précise que ce code ce trouve dans mon fichier meta.php avec toutes mes autres meta CMB2.

Merci pour votre aide. Bonne journée !

38 réponses

Florian.C, il y a 9 ans

Ah merci :) Mais pense tu que cela puisse être compatible avec la librairie CMB2 ?

Je crois que tu vas me conseiller de tout faire à la main

Sparkosis, il y a 9 ans

C'est natif à wordpress, donc ça ne devrait pas posé de problèmes, car au final un plugin utilise lui aussi les fonctions de wp donc ça devrait être ok :)

Florian.C, il y a 9 ans

Je vais tester ça et je reviens vers toi pour confirmer, merci @Sparkosis !

Sparkosis, il y a 9 ans

pas de soucis, si ça va pas regarde au niveau de ton plugin sur la doc que tu as envoyé, tu as une fonction sanitize qui apprioris permet de sauvegarder

Florian.C, il y a 9 ans

Besoin de précisions ?

Florian.C, il y a 9 ans

Help, je n'ai pas trouvé :/

Sparkosis, il y a 9 ans

Salut,

peux-tu être plus précis ? avec ** Mon problème qu'il ne le prend pas en compte

Est ce que tu parle de ça lorsque tu sauvegarde ?

Ps: (pourquoi avoir fait le choix de passé par un plugin ?)

Florian.C, il y a 9 ans

Salut !

Oui, il ne sauvegarde rien (même dans la base de donnée je ne trouve rien).

Car il est bien fait et me permet d'aller plus vite. Je n'ai pas à créer un calendrier par exemple.

Sparkosis, il y a 9 ans

En faite, lorsque tu ajoute un nouveau "post" je sais pas comment tu as appelé cela, et que tu met un établissement, l'établissement ne se sauvegade pas c'est bien ça ? histoire que je sois sur ^^

Florian.C, il y a 9 ans

Oui c'est ça :) Je peux selectionné un établissement (http://prntscr.com/fdqd65) mais quand je sauvegarde, il le prend pas en compte..

Sparkosis, il y a 9 ans

Est ce que tu as utilisé le hook permettant de sauvegardé t'es metabox ? cela vient de là si jamais tu l'as pas fais, voici la documentation:

/** * Save post metadata when a post is saved. * * @param int $post_id The post ID. * @param post $post The post object. * @param bool $update Whether this is an existing post being updated or not. */ function save_book_meta( $post_id, $post, $update ) { /* * In production code, $slug should be set only once in the plugin, * preferably as a class property, rather than in each function that needs it. */ $post_type = get_post_type($post_id); // If this isn't a 'book' post, don't update it. if ( "book" != $post_type ) return; // - Update the post's metadata. if ( isset( $_POST['book_author'] ) ) { update_post_meta( $post_id, 'book_author', sanitize_text_field( $_POST['book_author'] ) ); } if ( isset( $_POST['publisher'] ) ) { update_post_meta( $post_id, 'publisher', sanitize_text_field( $_POST['publisher'] ) ); } // Checkboxes are present if checked, absent if not. if ( isset( $_POST['inprint'] ) ) { update_post_meta( $post_id, 'inprint', TRUE ); } else { update_post_meta( $post_id, 'inprint', FALSE ); } } add_action( 'save_post', 'save_book_meta', 10, 3 );
Florian.C, il y a 9 ans

Oui j'ai testé cela mais d'après ce que j'ai compris c'est plus pour vérifier si la valeur (en l'ocurence un mail dans leur exemple) à la bonne structure.
Sans cette function cela s'enregistre quand même, ce qui permet de sauvegarder c'est la "Step 3: Use the field type" :

function cmb2_text_email_metabox() { $cmb = new_cmb2_box( array( 'id' => 'cmb2_text_email_metabox', 'title' => 'Person Information', 'object_types' => array( 'post' ), ) ); $cmb->add_field( array( 'name' => 'Email', 'id' => '_cmb2_person_email', 'type' => 'text_email', 'desc' => 'Invalid email addresses will be wiped out.', ) ); } add_action( 'cmb2_admin_init', 'cmb2_text_email_metabox' );
Sparkosis, il y a 9 ans

Hum d'aprés ce que je lis le hook cmb2_admin_init sauvegarde aussi, donc je ne sais pas trop actuellement, j'essaie de voir ce qu'il manque

Sparkosis, il y a 9 ans

Juste pour essayer, essaie de faire un sanitize juste en retournant la valeur

Florian.C, il y a 9 ans

Comme ceci on est d'accord ?

function cmb2_sanitize_etablissement_value( $value ) { $value = sanitize_text_field( $value ); return $value; } add_filter( 'cmb2_sanitize_etablissement', 'cmb2_sanitize_etablissement_value', 10, 2 );

Encore merci de ton aide --> https://media.giphy.com/media/AeWoyE3ZT90YM/giphy.gif

Sparkosis, il y a 9 ans

yes, comme cela

Florian.C, il y a 9 ans

Ca ne fait rien, aucune trace dans la base de donnée non plus

Florian.C, il y a 9 ans

C'est peut être le fait que le "type" soit "radio" qui le perturbe ou plutôt mon argument "'options_cb' => 'cmb2_render_etablissement_nom',"

Je te remet le code :

$cmb30->add_field( array( 'name' => 'Etablissement à selectionné', 'id' => 'cmb2_etablissement_select', 'type' => 'radio', 'options_cb' => 'cmb2_render_etablissement_nom', ) );
Sparkosis, il y a 9 ans

Pour l'essaie essaie en checkbox, le problème c'est que je connais pas ce plugin donc c'est un peu embêtant

Florian.C, il y a 9 ans

Oui moi aussi avec l'exemple deux.

En gros c'est assez simple,

Il faut déclarer notre function et l'endroit où les metabox vont se trouver :

//En back affiche la metabox function cmb2_etablissement_metabox() { $cmb30 = new_cmb2_box( array( 'id' => 'cmb2_etablissement', 'title' => 'École Universitaire', 'object_types' => array( 'rdv', 'table_ronde', 'portrait' ), ) );

Et puis tu rattache à ta box (qui est lié à une page ou post) les métabox que tu veux dont voiçi la liste.

Après pour en créer c'est un poil différent

Sparkosis, il y a 9 ans

Et le hook de sauvegard doit etre dans le hook du plugin je suppose ?

Florian.C, il y a 9 ans

Et bien il y a juste à faire cela et ça gère l'apparence (et l'emplacement) en back et la sauvegarde.

function cmb2_etablissement_metabox() { $cmb30 = new_cmb2_box( array( 'id' => 'cmb2_etablissement', 'title' => 'Etablissement', 'object_types' => array( 'conference_fdesr' ), ) ); $cmb30->add_field( array( 'name' => 'Etablissement à selectionné', 'id' => 'cmb2_etablissement_select', 'type' => 'radio', 'options_cb' => 'cmb2_render_etablissement_nom', ) ); } add_action( 'cmb2_admin_init', 'cmb2_etablissement_metabox' );
Florian.C, il y a 9 ans

Sauf que la vue que c'est fait main il faut lui dire quoi afficher (step 1) et le "verifier/sauvegarder" (ça on est pas sur hein) (step 2)

Sparkosis, il y a 9 ans

Pour moi si tu as vraiment rien dans ta bdd c'est qu'il sauvegarde pas, donc en soit ça viendrait de là aprés, je ne sais pas vraiment comment le plugin gère ça, j'aurais été toi, je l'aurais fait en natif, au final tu aurais gagné du temps :)

Florian.C, il y a 9 ans

J'utilise cette librairie qui me fait gagner du temps mais comme c'est la première fois que je l'utilise pour en créer un moi même effectivement j'en perds mais c'est pas grave je veux apprendre :)

Je vais faire l'exemple avec le multicheck dès que je peux !

Sparkosis, il y a 9 ans

Tu fais comme tu le souhaite, c'est un conseil tu es pas obligé de le suivre :) mais pour le coup, je ne pourrais pas trop t'aider à te dépatouiller avec le plugin, essaie peut - être de poster un sujet sur le forum du plugin

Florian.C, il y a 9 ans

Si je veux le faire par moi même, tu pense que le tuto des champs personnalisés de Grafikart est à jour ?

Sparkosis, il y a 9 ans

Je pense que oui, ça fait un moment que je l'ai pas vu, mais wordpress ne change pas souvent leurs politique on va dire, si jamais ta un soucis sur ça, je serais beaucoup plus enclin à t'aider pour le coup

Florian.C, il y a 9 ans

Bon et bien je vais faire ça :D Merci

Sparkosis, il y a 9 ans

Bon courage !

Florian.C, il y a 9 ans

Yes c'est bon ! :D

Sparkosis, il y a 9 ans

Ah j'allais lire ce que tu m'avais écris avant ^^" et j'ai actualisé. Content d'avoir pu t'aider, tu vois c'est pas bien compliqué, as-tu fais un thème toi même ?

Florian.C, il y a 9 ans

Oui, ce n'est pas mon premier mais pour des choses complexe comme un calendrier je passe par CMB2. C'est un gain de temps énorme (quand c'est déjà dedans...).

Sparkosis, il y a 9 ans

Cool :) hésite pas à partager ton projet pour que je regarde un peu si ça te dis.

Content d'avoir pu t'aider

Florian.C, il y a 9 ans

Merci beaucoup, les problèmes arriveront sans doute ahah. Tu es sur discord ?

Sparkosis, il y a 9 ans

Actuellement je n'y suis pas non, je suis sparkosis sur discord si jamais, je peux m'y connecter si tu veux mais je suis au travail donc pas 100% dispo :)

Florian.C, il y a 9 ans

Moi aussi :) Mais voilà c'est plus conviviale si jamais tu veux que l'on s'entre aide un jour ahah.
Bon courage

Sparkosis, il y a 9 ans

Pas de soucis :)
A toi aussi