Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

My ideal comment form will have 3 fields- Name, Location, Comment. I'm using the following bits of code-

comments.php

<?php comment_form(
    array(
        'fields' => apply_filters( 'comment_form_default_fields', $fields ),
        'comment_notes_after' => ' ',
        'title_reply' => 'Please feel free to share your home owning hopes, dreams, or concerns?',
        'logged_in_as' => '',
    )
); ?>

functions.php

<?php

function my_fields($fields) {
$fields['Name'] = '<p>Name</p>';
$fields['Location'] = '<p>Location</p>';
return $fields;
}
add_filter('comment_form_default_fields','my_fields');

?>

As you can see on the live site, that's not working. Any ideas why/how to remedy?

share|improve this question
add comment

1 Answer

I think you're a bit confused about how comment_form works. So let's take a look (this is in wp-includes/comment-template.php):

<?php
function comment_form( $args = array(), $post_id = null ) {
    // snip snip 
    $fields =  array(
        'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                    '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
        'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '<span class="required">*</span>' : '' ) .
                    '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
        'url'    => '<p class="comment-form-url"><label for="url">' . __( 'Website' ) . '</label>' .
                    '<input id="url" name="url" type="text" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
    );

    $required_text = sprintf( ' ' . __('Required fields are marked %s'), '<span class="required">*</span>' );
    $defaults = array(
        'fields'               => apply_filters( 'comment_form_default_fields', $fields ),
        'comment_field'        => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>',
        'must_log_in'          => '<p class="must-log-in">' . sprintf( __( 'You must be <a href="%s">logged in</a> to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
        'logged_in_as'         => '<p class="logged-in-as">' . sprintf( __( 'Logged in as <a href="%1$s">%2$s</a>. <a href="%3$s" title="Log out of this account">Log out?</a>' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) ) . '</p>',
        'comment_notes_before' => '<p class="comment-notes">' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '</p>',
        'comment_notes_after'  => '<p class="form-allowed-tags">' . sprintf( __( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes: %s' ), ' <code>' . allowed_tags() . '</code>' ) . '</p>',
        'id_form'              => 'commentform',
        'id_submit'            => 'submit',
        'title_reply'          => __( 'Leave a Reply' ),
        'title_reply_to'       => __( 'Leave a Reply to %s' ),
        'cancel_reply_link'    => __( 'Cancel reply' ),
        'label_submit'         => __( 'Post Comment' ),
    );

    $args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) );

        // $args get used to fill out the fields here
}

You need only to override the arguments you want to change. If you want custom fields, simply pass in the fields -- no need to bother with hook into comments_form_default_fields.

Overly simplified example:

<?php comment_form(array(
    'fields'    => array(
        'author' => '<input type="text" name="author" />',
        'location' => '<input type="text" name="location" />',
    ),
));

WordPress will handle saving the author field, but you'll have some more work to do for getting location saved. I wrote a tutorial about this.

Basically: hook into comment_post. Check $_POST for the field, save it:

<?php
add_action( 'comment_post', 'wpse69222_insert_comment', 10, 1 );
function wpse69222_insert_comment( $comment_id )
{
    // prolly should do more validation here?
    if( isset( $_POST['location'] ) )
        update_comment_meta( $comment_id, 'location', esc_attr( $_POST['location'] ) );
}

You might also want admin area fields and a way to edit that location from the admin, but that's another question.

share|improve this answer
    
thank you for you input(and the link to your tutorial). i've made the changes per your comment, and not only are the custom fields still not showing, but I'm now receiving the following error from wp_list_comments Warning: call_user_func() expects parameter 1 to be a valid callback, function 'my_custom_comments' not found or invalid function name in /home/content/56/9896856/html/wp-includes/comment-template.php on line 1336 –  user1255049 Oct 15 '12 at 3:53
    
That's a separate issue. You can pass a callback to display the comment in wp_list_comments. It means the function my_custom_comments doesn't exist. So you can create it or remove the callback. Here's the custom callback in TwentyEleven for an example. –  chrisguitarguy Oct 15 '12 at 5:08
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.