Почему моя переменная comment_form не работает?

Я работаю над настраиваемой темой, основанной на Starkers html5 3.0 и использую систему комментариев этой темы. Я следил за инструкциями custom_form от Otto , Soapbox Dave , forlogos и Deluxe Blog Tips .

Весь мой код, кажется, работает правильно, за исключением того, что я не могу получить ни одно из полей вне поля comment_form_default_fields для отображения. Эта тема настраивается как дочерняя тема, но в родительском коде отсутствует код комментария.

Можете ли вы помочь мне найти проблему?

Связанный код functions.php:

// Custom Callback - Comments if ( ! function_exists( 'starkers_comment' ) ) : /** * Template for comments and pingbacks. * * @since Starkers HTML5 3.0 */ function starkers_comment( $comment, $args, $depth ) { $GLOBALS['comment'] = $comment; switch ( $comment->comment_type ) : case '' : ?> <article <?php comment_class(); ?> id="comment-<?php comment_ID() ?>"> <?php comment_author_link() ?> <a href="<?php echo esc_url( get_comment_link( $comment->comment_ID ) ); ?>"> <?php echo time_ago(); ?></a> ... <?php comment_reply_link( array_merge( $args, array( 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?><br /> <?php if ( $comment->comment_approved == '0' ) : _e( 'Your comment is awaiting moderation.', 'starkers' ); ?><br /> <?php endif; comment_text(); ?> <?php break; case 'pingback' : case 'trackback' : ?> <article <?php comment_class(); ?> id="comment-<?php comment_ID() ?>"> <p><?php _e( 'Pingback:', 'starkers' ); ?> <?php comment_author_link(); ?><?php edit_comment_link( __('(Edit)', 'starkers'), ' ' ); ?></p> <?php break; endswitch; } endif; /** * Closes comments and pingbacks with </article> instead of </li>. * * @since Starkers HTML5 3.0 */ function starkers_comment_close() { echo '</article>'; } /** * Adjusts the comment_form() input types for HTML5. * * @since Starkers HTML5 3.0 */ function starkers_fields($fields) { $commenter = wp_get_current_commenter(); $req = get_option( 'require_name_email' ); $aria_req = ( $req ? " aria-required='true'" : '' ); $fields = array( 'author' => '<p><label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '*' : '' ) . '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>', 'email' => '<p><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '*' : '' ) . '<input id="email" name="email" type="email" value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>', 'url' => '<p><label for="url">' . __( 'Website' ) . '</label>' . '<input id="url" name="url" type="url" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>', ); return $fields; } add_filter('comment_form_default_fields','starkers_fields'); function my_fields($fields) { $fields['new'] = '<p>red rover 1</p>'; return $fields; } add_filter('comment_form_top','my_fields'); 

Код комментария:

 <?php if ( post_password_required() ) : ?> <p><?php _e( 'This post is password protected. Enter the password to view any comments.', 'starkers' ); ?></p> <?php return; endif; ?> <?php // You can start editing here -- including this comment! ?> <?php if ( have_comments() ) : ?> <div class="trirow_875h" id="comments-title"><h4 class="cufon">Activities</h4></div> <div class="trirow_875m" style="padding:10px 15px;"> <?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?> <nav> <?php previous_comments_link( __( '&larr; Older Comments', 'starkers' ) ); ?> <?php next_comments_link( __( 'Newer Comments &rarr;', 'starkers' ) ); ?> </nav> <?php endif; // check for comment navigation wp_list_comments( array( 'style' => 'div', 'callback' => 'starkers_comment', 'end-callback' => 'starkers_comment_close' ) ); if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : // Are there comments to navigate through? ?> <nav> <?php previous_comments_link( __( '&larr; Older Comments', 'starkers' ) ); ?> <?php next_comments_link( __( 'Newer Comments &rarr;', 'starkers' ) ); ?> </nav> <?php endif; // check for comment navigation else : // or, if we don't have comments: if ( ! comments_open() ) : ?> <p><?php _e( 'Comments are closed.', 'starkers' ); ?></p> <?php endif; // end ! comments_open() endif; // end have_comments() ?> </div> <div class="trirow_875b"></div> <div class="clear"></div> <?php comment_form(); ?> Is there anybody out there? <input type="hidden" name="my_user_id" value="<?php echo $myid; ?>" /> 

Этот код не имеет смысла:

 function my_fields($fields) { $fields['new'] = '<p>red rover 1</p>'; return $fields; } add_filter('comment_form_top','my_fields'); 

Я даже не уверен, что он должен делать, потому что comment_form_top – это действие, а не фильтр.

Если вы хотите добавить дополнительные поля, вы должны использовать фильтр comment_form_default_fields:

 add_filter('comment_form_default_fields','my_fields'); 

Однако это может не работать или работать с перерывами, потому что функция starkers_fields написана неправильно. Это должно быть так:

 function starkers_fields($fields) { $commenter = wp_get_current_commenter(); $req = get_option( 'require_name_email' ); $aria_req = ( $req ? " aria-required='true'" : '' ); $fields['author'] = '<p><label for="author">' . __( 'Name' ) . '</label> ' . ( $req ? '*' : '' ) . '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>'; $fields['email'] = '<p><label for="email">' . __( 'Email' ) . '</label> ' . ( $req ? '*' : '' ) . '<input id="email" name="email" type="email" value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>'; $fields['url'] = '<p><label for="url">' . __( 'Website' ) . '</label>' . '<input id="url" name="url" type="url" value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>'; ); return $fields; } add_filter('comment_form_default_fields','starkers_fields'); 

Разница здесь в том, что эта версия изменяет поля, а не заменяет их прямо. Таким образом, позволяя другим полям проходить через него без изменений.

Предполагая, что вы не хотите изменять функцию starkers_fields, возможно, потому что это родительская тема, которую вы не контролируете, тогда вы можете обойти ее нарушение, регулируя свой приоритет фильтра, чтобы убедиться, что my_fields запускаются после него:

 function my_fields($fields) { $fields['new'] = '<p>red rover 1</p>'; return $fields; } add_filter('comment_form_default_fields','my_fields',20);