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


Sparkosis
Réponse acceptée

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
Auteur
Réponse acceptée

Yes c'est bon ! :D

Besoin de précisions ?

Help, je n'ai pas trouvé :/

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 ?)

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.

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 ^^

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

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 );

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

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 :)

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

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

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' );

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

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

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

yes, comme cela

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

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',
    ) );

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

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

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

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' );

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)

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 !

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

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

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

Bon et bien je vais faire ça :D Merci

Bon courage !

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 ?

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...).

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

Content d'avoir pu t'aider

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

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 :)

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

Pas de soucis :)
A toi aussi