web-dev-qa-db-fra.com

Insertion de valeurs de case à cocher de formulaire Gravity dans des champs personnalisés avancés

J'essaie de transférer les valeurs de case à cocher d'un formulaire Gravity Forms (qui crée une nouvelle publication) dans un champ Champs personnalisés avancés. J'ai lu et trouvé des informations dans un post (au bas de la question).

Est-ce la bonne façon de le faire? Il ne s'agit pas d'insérer les multiples cases à cocher GF dans la zone de texte ACF. Devrais-je créer des cases à cocher avec les mêmes options dans ACF? Voici mon code:

add_action("gform_post_submission", "acf_post_submission", 10, 2);

function acf_post_submission ($entry, $form)
{
    $post_id = $entry["post_id"];
    $values = get_post_custom_values("submit_intended", $post_id);  
    update_field("field_23", $values, $post_id);

}

J'ai également essayé ce qui suit concernant les captures d'écran:

add_action("gform_post_submission", "checkbox_arrays", 10, 2);
function checkbox_arrays($entry, $form)
{
    $post_id = $entry["post_id"];
    $form_id = $entry["form_id"];

    if ($form_id==3)
    {
        $values = get_post_custom_values("submit_gf_intended", $post_id);
        add_post_meta($post_id, "submit_intended", $values);
    }
}

Ce message dans le forum de champs personnalisés avancés peut aider - http://support.advancedcustomfields.com/discussion/544/acf-and-gravity-forms/p1

J'ai également joint des captures d'écran.

enter image description hereenter image description here

3
Rob

Ma situation face à ce problème était un peu problématique car je voulais utiliser le plug-in GF Update Post pour permettre à mes utilisateurs de modifier leur message juste après avoir soumis le contenu. Avec la solution ci-dessus, ACF n'écrit pas dans la base de données et ne corrige pas les champs ACF (du moins pour moi).

Ma solution:

  1. Créez un groupe de champs personnalisés ACF, ajoutez un champ avec les mêmes cases à cocher et utilisez la même méta_key que votre formulaire Gravity.

  2. Utilisez une fonction après soumission pour extraire toutes les clés correspondantes sous forme de tableau et mettre à jour la clé de champ ACF (Afficher à l'écran -> Valeur du champ ACF dans l'écran d'édition du groupe de champs ACF).

    add_action("gform_after_submission_YOUR_FORM_ID", "acf_post_submission", 10, 2);
    
    function acf_post_submission ($entry, $form)
    {
       $post_id = $entry["post_id"];
       $values = get_post_custom_values("YOUR_CUSTOM_FIELD", $post_id);
       update_field("ACF_FIELD_KEY", $values, $post_id);
    }
    
4
Andy

J’y ai jeté un nouveau coup d’œil ce matin et j’estime que votre problème et votre solution sont très simples.

NB: utilisation des versions actuelles - WordPress 3.5, Advanced Custom Fields 3.5.7.2, Gravity Forms 1.6.11

Premièrement, les champs "ordinaires" tels que les champs de texte ne nécessitent aucun effort supplémentaire; créez dans ACF, créez une publication qui l'utilise pour qu'elle soit trouvée par GF, ajoutez-la à un formulaire GF et utilisez-la. La valeur est écrite dans le champ. La tâche est finie. Aucun code supplémentaire requis.

Désormais, pour les cases à cocher, plusieurs ticks signifient plusieurs valeurs à ajouter à la publication. GF fait ce que vous attendez d'un plugin WordPress sain, il crée plusieurs entrées dans la table postmeta. Mais ce n'est pas ce que veut ACF. Lorsque vous modifiez une publication et cochez plusieurs cases dans un champ ACF, un seul enregistrement postmeta avec un tableau sérialisé est enregistré. Agréable.

Donc, pour "réparer" ce que GF fait pour qu'il soit brisé comme ACF le veut, obtenez l'ID de votre formulaire et ajoutez un filtre pour supprimer les données de publication avant GF l'enregistre dans postmeta:

$formID = 1;    // replace with ID of your form
add_filter("gform_post_data_$formID", 'wpse_78826_gformPostData', 10, 3);

/**
* dirty hack to write checkbox field values as serialised arrays
* to please Advanced Custom Fields, which is _doing_it_wrong()
* @param array $post_data not really the $_POST data, more like a summary of it
* @param array $form the GF form "object"
* @param array $lead the GF lead / entry "object"
* @return array
*/
function wpse_78826_gformPostData($post_data , $form, $lead) {
    $post_data['post_custom_fields']['checkboxen'] = serialize(explode(',', $post_data['post_custom_fields']['checkboxen']));

    return $post_data;
}

La tâche est finie. Mauvais bidouillage, mais ACF est heureux au moins.

2
webaware