Contact Form 7 and Custom post type
Asked Answered
F

3

7

I want to use contact form 7 in Wordpress to build a order Form. I want the content of the order Form to be populated with content from a custom post type "trade Show Material" - The post type contains the fields "name" "number" "description" "photo" . The idea will be that each piece can be selected from the form . Can anyone offer the general direction for this? Should I perhaps be using another plugin entirely?

Flavin answered 9/1, 2015 at 18:51 Comment(1)
Use gravity form if you are using custom field in custom post type.Incorporate
C
18

Maybe you can use the wpcf7_form_tag filter hook for this.

If you want to use a custom post type as the options of a dropdown (select) you can add something like the example below in your functions.php:

function dynamic_field_values ( $tag, $unused ) {

    if ( $tag['name'] != 'your-field-name' )
        return $tag;

    $args = array (
        'numberposts'   => -1,
        'post_type'     => 'your-custom-post-type',
        'orderby'       => 'title',
        'order'         => 'ASC',
    );

    $custom_posts = get_posts($args);

    if ( ! $custom_posts )
        return $tag;

    foreach ( $custom_posts as $custom_post ) {

        $tag['raw_values'][] = $custom_post->post_title;
        $tag['values'][] = $custom_post->post_title;
        $tag['labels'][] = $custom_post->post_title;

    }

    return $tag;

}

add_filter( 'wpcf7_form_tag', 'dynamic_field_values', 10, 2);

In your form you can add the field:

[select* your-field-name include_blank]

In the example above the post_title is used in the options of the dropdown. You can add your own fields here (name, number, description, photo).

Cordle answered 13/1, 2015 at 17:53 Comment(4)
Just confirming this still works with WP 4.2 + CF7 . Thank you.Amygdaline
Works, any idea how to add the post-thumbnail, too?Swoon
Any idea why the _raw_{field_name} information is not working for this? The execution is working, but those variables simply isn't playing along. I even added $pipes = new WPCF7_Pipes($tag['raw_values']); $tag['pipes'] = $pipes; but no joy - the email simply shows the email address part.Endosteum
how can i get the permalink of selected post?Kamin
D
6

I do no think the wpcf7_form_tag works in the same way as vicente showed in his great answer before. It may have changed since 2015.

If you read here it explains how you need to use the wpcf7_form_tag: https://contactform7.com/2015/01/10/adding-a-custom-form-tag/

With that in mind along with this other post from Contact Form 7: https://contactform7.com/2015/02/27/using-values-from-a-form-tag/#more-13351

I came up with this code to create a custom dropdown list for a custom post type that I have.

add_action( 'wpcf7_init', 'custom_add_form_tag_customlist' );

function custom_add_form_tag_customlist() {
    wpcf7_add_form_tag( array( 'customlist', 'customlist*' ), 
'custom_customlist_form_tag_handler', true );
}

function custom_customlist_form_tag_handler( $tag ) {

    $tag = new WPCF7_FormTag( $tag );

    if ( empty( $tag->name ) ) {
        return '';
    }

    $customlist = '';

    $query = new WP_Query(array(
        'post_type' => 'CUSTOM POST TYPE HERE',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'orderby'       => 'title',
        'order'         => 'ASC',
    ));

    while ($query->have_posts()) {
        $query->the_post();
        $post_title = get_the_title();
        $customlist .= sprintf( '<option value="%1$s">%2$s</option>', 
esc_html( $post_title ), esc_html( $post_title ) );
    }

    wp_reset_query();

    $customlist = sprintf(
        '<select name="%1$s" id="%2$s">%3$s</select>', $tag->name,
    $tag->name . '-options',
        $customlist );

    return $customlist;
}

Then you use the tag in contact form 7 like this.

[customlist your-field-name]

Hopefully this helps someone else who was looking for a way to do this like I was.

You could alter it to get any information you need from the custom post type.

It does not have any validation though.

Dougald answered 10/7, 2017 at 14:48 Comment(1)
This is awesome - this solution worked for me like a charm - copy - pasted - included - entered CPT - works! Thank you very much!Submariner
L
0

Clyde Thomas code still works nice, thanks !

In my case I need the data from a plugin instead of a post so I've modified the code removing the WP_query and the while

                    global $wpdb;
                    $result = $wpdb->get_results("SELECT title FROM wp_asl_stores ORDER BY title ASC ");
                    foreach($result as $row) {
                        $customlist .= sprintf( '<option value="%1$s">%2$s</option>',
                esc_html( $row->title ), esc_html( $row->title ) );
                    }
Livvyy answered 26/1, 2022 at 12:29 Comment(1)
This would better be left as a comment for the post Clyde Thomas did vs a new answer.Schrick

© 2022 - 2024 — McMap. All rights reserved.