m-torin
  • 0
Учитель

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

  • 0

Я работаю над пользовательской темой, основанной на 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');

код comment.php:

<?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; ?>" />
Share
  1. Этот код не имеет смысла:

    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);
    
    • 0

Оставить ответ

You must login to add an answer.