Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Adding A Custom Form-Tag to Contact Form 7 in Wordpress
* Contact form 7
* custom tag: [posts show:12]
* show parameter is optional
add_action('wpcf7_init', 'custom_add_form_tag_posts');
function custom_add_form_tag_posts()
wpcf7_add_form_tag('posts', 'custom_posts_form_tag_handler');
function custom_posts_form_tag_handler($tag)
//get current (local) date
$blogtime = current_time('mysql');
list( $today_year, $today_month, $today_day, $hour, $minute, $second ) = preg_split('([^0-9])', $blogtime);
//how may to show? (default 6)
$show=$tag->get_option('show', 'int', true);
$args = [
'post_type' => 'posts',
'posts_per_page'=> $show ? $show : $numberPosts,
'order' => 'ASC'
// The Query
$the_query = new WP_Query($args);
// The Loop
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
'id' =>get_the_ID(),
'title' =>get_the_title(),
// debug your query
// echo $the_query->request;
// Structure
$res="<div class='12u'><h3 class='mb-0'>No posts to display</h3></div>";
if ($rows) {
$res="<div class='row'>";
foreach ($rows as $row) {
$res.='<input type="checkbox" name="posts[]" value="'.esc_html($row['title']).'" id="'.esc_html($row['id']).'" />';
$res.='<label for="'.esc_html($row['id']).'">'.esc_html($row['title']).' <br>';
$res.= esc_html($row['title'])
$res.=' </label>';
return $res;
* When saving, change the array to a comma, separated list, just to make it easier
add_filter("wpcf7_posted_data", function ($posted_data) {
//'posts' is the name that you gave the field in the CF7 admin.
if (isset($posted_data['posts'])) {
$posted_data['posts'] = implode(", ", $posted_data['posts']);
return $posted_data;
* A tag to be used in "Mail" section so the user receives the special tag
* [posts]
add_filter('wpcf7_special_mail_tags', 'wpcf7_tag_post', 10, 3);
function wpcf7_tag_post($output, $name, $html)
$name = preg_replace('/^wpcf7\./', '_', $name); // for back-compat
$submission = WPCF7_Submission::get_instance();
if (! $submission) {
return $output;
if ('posts' == $name) {
return $submission->get_posted_data("posts");
return $output;

This comment has been minimized.

Copy link

commented Apr 5, 2019

Hi @eduardoarandah, I follow your code, but stuck in a situation. Can you please take a look here, and give me any suggestion.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.