web-dev-qa-db-fra.com

Champs pré-remplis de formulaires Gravity avec type de publication personnalisé

J'utilise Gravity Forms pour créer plusieurs sections de case à cocher sur mon formulaire, chacune pré-remplie avec un terme de taxonomie spécifique à partir d'un type de publication personnalisé.

J'ai trouvé un exemple de la procédure à suivre sur le site Gravity Forms: https://www.gravityhelp.com/documentation/article/dynamically-populating-drop-down-down-fields/ et l'ai modifié pour fonctionner en tant que case à cocher et afficher les miniatures de publication, mais l'exemple ne fonctionne que pour une seule case à cocher.

La seule façon dont je sais comment obtenir ce travail pour toutes les taxonomies du site est de copier/coller la fonction et de la modifier. Cela se traduit par un fichier functions.php saturé. Je pense qu'il pourrait y avoir un moyen de créer une boucle 'foreach' pour chacun des termes de taxonomie, mais je ne suis pas doué avec les boucles foreach et je ne sais pas du tout comment il serait construit.

Voici un exemple de code que j'ai copié/collé pour chaque instance du terme taxonomie:

add_filter( 'gform_pre_render_3', 'list_diesel_heater' );
add_filter( 'gform_pre_validation_3', 'list_diesel_heater' );
add_filter( 'gform_pre_submission_filter_3', 'list_diesel_heater' );
add_filter( 'gform_admin_pre_render_3', 'list_diesel_heater' );
function list_diesel_heater( $form ) {

foreach ( $form['fields'] as &$field ) {

    if ( $field->type != 'checkbox' || strpos( $field->cssClass, 'diesel-heater' ) === false ) {
        continue;
    }

    $posts = get_posts( 'numberposts=-1&post_type=product&product_cat=diesel-heaters' );

    $choices = array();

    foreach ( $posts as $post ) {
        $thumb = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'thumbnail' );
        $url = $thumb['0'];
        $choices[] = array( 'text' => '<img src="' . $url . '"><p>'. $post->post_title .'</p>', 'value' => $post->post_title );
    }

    $field->placeholder = 'Select a Post';
    $field->choices = $choices;
}
return $form;
}

J'espérais qu'il serait possible d'avoir une boucle foreach au sein de la fonction et de remplacer les instances de "réchauffeur diesel" par le terme de taxonomie. Je ne suis pas bon avec les boucles foreach et espérais que quelqu'un pourrait s'il vous plaît fournir des conseils.

1
chriswhiteley

Dans votre instruction foreach, vous essayez à la fois d'obtenir et d'affecter des propriétés à un non-objet. Essentiellement, la variable $field n'est en réalité pas un objet, mais plutôt un tableau. Je ne sais pas pourquoi l'exemple de code sur le site Web de Gravity Forms utilise la notation d'objet. L'API sous-jacente a peut-être changé.

Quoi qu'il en soit, voici ce dont vous avez besoin:

add_filter( 'gform_pre_render_3', 'list_diesel_heater' );
add_filter( 'gform_pre_validation_3', 'list_diesel_heater' );
add_filter( 'gform_pre_submission_filter_3', 'list_diesel_heater' );
add_filter( 'gform_admin_pre_render_3', 'list_diesel_heater' );
function list_diesel_heater( $form ) {

    foreach ( $form['fields'] as &$field ) {

        if ( $field['type'] != 'checkbox' ) {
            continue;
        }

        $posts = get_posts( 'numberposts=-1&post_type=product&product_cat=clothing' );

        $choices = array();

        foreach ( $posts as $post ) {
            $thumb = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'thumbnail' );
            $choices[] = array( 'text' => '<img src="' . $thumb['0'] . '"><p>'. $post->post_title .'</p>', 'value' => $post->post_title );
        }

        $field['placeholder'] = 'Select a Post';
        $field['choices'] = $choices;

    }

    return $form;

}

J'ai changé le product_cat ci-dessus et supprimé la deuxième instruction de la première condition afin de tester ce code sur mon environnement de développement WooCommerce à l'aide du fichier XML fictif de données WooCommerce. Par conséquent, vous devez modifier les paramètres en fonction de vos spécifications.

Voici un exemple de sortie:

 enter image description here 

Vous devrez attribuer un style à la sortie en conséquence

2
userabuser