个性化 WordPress 评论框

三个参考:

https://blog.wpjam.com/article/custom-wordpress-comment-form/

https://www.wpdaxue.com/wordpress-comment_form.html

https://cnzhx.net/blog/altering-wordpress-comment-form/

来源于:

https://blog.wpjam.com/article/custom-wordpress-comment-form/

自定义 WordPress 评论表单和功能实现

WordPress 是一个可以高度自定义的平台,它提供了很多接口等方便开发者根据自己的需求来自定义功能和外表。在一些使用 WordPress 搭建的产品介绍、个人介绍、博客等类型的网站中,评论往往是必不可少的模块。而评论模块中,评论表单又是个比较重要的部分,对于某些特殊的需求,我们往往需要修改表单的外表或者增加一些功能(例如让评论者填写更多的个人信息),本文就来彻底的讲解一下与之相关的函数和修改方法。

关于 WordPress 表单的基础知识

我们先来了解一下基础知识。在 WordPress 主题中,使用 comment_form 函数来生成一个评论表单。通常把评论模块的代码写进单独的 comments.php 文件中,然后使用 comments_template 这个函数在 single.php、page.php 等文件底部引用评论模块。

本文中,使用 twentyeleven 这个官方主题作为演示,因为这个主题写的很标准,便于后面的自定义操作。我们现在可以打开这个主题下面的 comments.php 文件,浏览第 74 行后面。可以看到它直接使用了一句 来调用评论表单。默认的显示效果如下:

默认的 WordPress 评论表单外观

调用这个函数,官方会默认生成这样一个带有 名字、邮箱、网址、评论框 的标准表单。下面我们就要对它进行各种改造了,强烈建议你开启这个主题,然后亲自修改文件观看实际效果。

深入了解 comment_form 函数

comment_form 是可以传递一些参数,我们可以通过编写对应的参数实现表单自定义。你可以打开官方文档看一下:http://codex.wordpress.org/Function_Reference/comment_form

。这里比较常用的有下面几个参数:

  • fields – 控制显示哪几个表单,默认的是三个:网名(name)、邮箱(email)、网址(url)。
  • comment_notes_before – 在评论表单前面显示提示信息。
  • comment_notes_after – 在评论表单后面显示提示信息。
  • title_reply – 这个参数改变评论表单标题,默认是:Leave a Reply。
  • label_submit – 这个参数改变评论表单提交按钮文字,默认是:Post Comment。

我们下面就通过修改这几个参数来实现自定义表单。

自定义 WordPress 评论表单的方法

增加、去掉评论表单中的项目,需要使用 fields 参数。默认的 WordPress 的 fields 参数的内容如下:

$fields =  array('author' => '

' . '' . __( 'Name' ) . ' ' . ( $req ? '*' : '' ) .''comment_author'] ) . '" size="30"' . $aria_req . ' />

','email'  => '

' . __( 'Email' ) . ' ' . ( $req ? '*' : '' ) .''comment_author_email'] ) . '" size="30"' . $aria_req . ' />

','url'    => '

' . __( 'Website' ) . '' .''comment_author_url'] ) . '" size="30" />

',
);

如果你有点 PHP 基础,上面的代码很容易理解吧,如果我们想去掉“网址”文本框,我们把上面 ‘url’ 的键删掉即可。我们使用下面语句来替换 twentyeleven 主题中 comments.php 文件中第 74 行后面的的调用表单的函数 comment_form :

$commenter = wp_get_current_commenter();
$req = get_option( 'require_name_email' );
$aria_req = ( $req ? " aria-required='true'" : '' );
$fields =  array('author' => '

' . '' . __( 'Name' ) . ' ' . ( $req ? '*' : '' ) .''comment_author'] ) . '" size="30"' . $aria_req . ' />

','email'  => '

' . __( 'Email' ) . ' ' . ( $req ? '*' : '' ) .''comment_author_email'] ) . '" size="30"' . $aria_req . ' />

',
);

$comments_args = array('fields' =>  $fields
);

comment_form($comments_args);

上面代码很容易理解,先使用 wp_get_current_commenter 函数来获取当前的评论者的一些信息,方便下面调用。然后生成了一个 fields 变量,内容是一个包含 author、email 两个键的数组,对应的键值就是评论表单的 HTML 结构。保存刷新一下就可以看到改变了:

为评论表单去掉了 网址 文本框

同样道理,如果想只显示一个 网名 文本框,你就吧 email 键也删掉。当然,因为 email 文本框是必填的,这样会导致出现一些问题。上面介绍的几个常用的参数,跟 fields 参数的用法类似,下面我们想要改变评论表单标题和发表按钮文字的话,可以这样写:

$commenter = wp_get_current_commenter();
$req = get_option( 'require_name_email' );
$aria_req = ( $req ? " aria-required='true'" : '' );
$fields =  array('author' => '

' . '' . __( 'Name' ) . ' ' . ( $req ? '*' : '' ) .''comment_author'] ) . '" size="30"' . $aria_req . ' />

','email'  => '

' . __( 'Email' ) . ' ' . ( $req ? '*' : '' ) .''comment_author_email'] ) . '" size="30"' . $aria_req . ' />

',
);

$comments_args = array('fields' =>  $fields,'title_reply'=>'评论一下','label_submit' => '发射!'
);

comment_form($comments_args);

保存刷新一下,就可以看到咱们修改的文字了:

修改 WordPress 表单中的文字

要注意的是,如果你的主题是要给别人用的,特别是外国人,为了国际化,修改的内容要用 __() 这个函数包裹,可以方便翻译,例如:__( ‘发射!’ ) 。

为表单增加更多文本框

上面说了怎么去掉某个表单中的文本框,如果我觉得表单功能太弱,想要用户在发表评论的时候填写更多的信息呢?我们仍然使用 fields 这个参数来传递。如果想要增加一个新的文本框让评论者填写自己所在的地区,我们使用下面这段代码:

$commenter = wp_get_current_commenter();
$req = get_option( 'require_name_email' );
$aria_req = ( $req ? " aria-required='true'" : '' );
$fields =  array('author' => '

' . '' . __( 'Name' ) . ' ' . ( $req ? '*' : '' ) .''comment_author'] ) . '" size="30"' . $aria_req . ' />

','email'  => '

' . __( 'Email' ) . ' ' . ( $req ? '*' : '' ) .''comment_author_email'] ) . '" size="30"' . $aria_req . ' />

','position' => '

' . __( '地区' ) . '' .
        '

'
);

$comments_args = array('fields' =>  $fields,'title_reply'=>'评论一下','label_submit' => '发射!'
);

comment_form($comments_args);

保存刷新之后,就会多出来一个 “地区” 表单,由于是新建的,所以没有样式,你可以编写一些 CSS 美化一下,这里不再赘述。

为 WordPress 表单增加 地区 文本框

虽然我们可以在这个文本框中填写信息,但是你点击发送之后,不会有任何变化,因为还没有具体的功能代码接受你这个新建表单的内容。实现这个功能需要用到 comment_post 这个 hook 钩子。先给出具体代码:

function add_comment_meta_values($comment_id) {

    if(isset($_POST['position'])) {$position = wp_filter_nohtml_kses($_POST['position']);
        add_comment_meta($comment_id, 'position', $position, false);}

}
add_action ('comment_post', 'add_comment_meta_values', 1);

将上面代码复制到 functions.php 文件中即可。上面代码大体功能就是:在评论内容被提交的时候会触发 comment_post 这个 hook ,使用 add_action 函数为 comment_post 这个 hook 绑定一个函数,函数的内容就是接收表单中 position 这个文本框的内容,然后过滤掉 html 标签,再使用 add_comment_meta 这个函数将内容插入到数据库中。具体插入到 wp_commentmeta 这个表中,你提交了信息之后,会在这个表中发现对应内容

将新建文本框的内容存储到数据库中

仅仅存到了数据库中当然不行了,我们还要取出来在评论内容中显示。使用下面代码可以调用出来对应的内容:

 echo "TA 现在在: ".get_comment_meta( $comment->comment_ID, 'position', true ); ?>

在 functions.php 文件的 570 行附近,找到 comment_text 这个函数,在后面插入这句代码就可以显示出来了。保存刷新之后就可以看到刚刚输入的内容:

在前台调用存放在数据库中的评论扩展信息

主要提供了一个思路和基本的方法,抛砖引玉,根据你的个人需求进行进一步的改造等。

总结和思维发散

本文使用 twentyeleven 这个官方主题作为演示是有原因的,因为它的代码非常规范、标准。实现这个本文中自定义方法,主题必须使用 comment_form 这个函数生成表单。我大体看了一下,国外的主题写的比较规范,而国内的一些主题则不是使用 comment_form 函数生成的表单,而是直接写上了表单的 HTML 结构,然后插入一些 PHP 函数。这样,本文所说的方法肯定就会失效了。

这种方法是通过直接修改主题目录下面的 comments.php 文件实现的,这样可能不好管理。WordPress 也提供了对应 hook 来实现本文的效果,例如前面提到的去掉表单中的某个文本框,可以使用 comment_form_default_fields 这个 hook 来实现。具体代码请看之前写过的文章:WordPress 技巧:去掉评论模块中的网站链接表单。其他的可以自行摸索,这样可以只在 functions.php 中修改方便管理。

了解了基本实现过程,你就可以根据自己的需求新建表单的文本框等信息了,不要忘了编写对应的 CSS 代码让表单更加美观。

来源于:

通过 comment_form() 自定义 WordPress 评论表单

WordPress 3.0 新增了comment_form() 函数来构建评论表单,下面简单讲解一下 comment_form() 的使用方法,希望能帮助大家自定义评论表单。

调用 comment_form()

如果你要在主题中调用评论表单,只需要在使用下面简单的代码即可:

<?php comment_form(); ?>

就像我们在官方的主题 twentyfourteen 的 comments.php 文件的倒数第2行看到一样:

<?php
/**
 * The template for displaying Comments
 *
 * The area of the page that contains comments and the comment form.
 *
 * @package WordPress
 * @subpackage Twenty_Fourteen
 * @since Twenty Fourteen 1.0
 */
/*
 * If the current post is protected by a password and the visitor has not yet
 * entered the password we will return early without loading the comments.
 */
if ( post_password_required() ) {
	return;
}
?>
<div id="comments" class="comments-area">
	<?php if ( have_comments() ) : ?>
	<h2 class="comments-title">
		<?php
			printf( _n( 'One thought on “%2$s”', '%1$s thoughts on “%2$s”', get_comments_number(), 'twentyfourteen' ),
				number_format_i18n( get_comments_number() ), get_the_title() );
		?>
	</h2>
	<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : ?>
	<nav id="comment-nav-above" class="navigation comment-navigation" role="navigation">
		<h1 class="screen-reader-text"><?php _e( 'Comment navigation', 'twentyfourteen' ); ?></h1>
		<div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'twentyfourteen' ) ); ?></div>
		<div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'twentyfourteen' ) ); ?></div>
	</nav><!-- #comment-nav-above -->
	<?php endif; // Check for comment navigation. ?>
	<ol class="comment-list">
		<?php
			wp_list_comments( array(
				'style'      => 'ol',
				'short_ping' => true,
				'avatar_size'=> 34,
			) );
		?>
	</ol><!-- .comment-list -->
	<?php if ( get_comment_pages_count() > 1 && get_option( 'page_comments' ) ) : ?>
	<nav id="comment-nav-below" class="navigation comment-navigation" role="navigation">
		<h1 class="screen-reader-text"><?php _e( 'Comment navigation', 'twentyfourteen' ); ?></h1>
		<div class="nav-previous"><?php previous_comments_link( __( '← Older Comments', 'twentyfourteen' ) ); ?></div>
		<div class="nav-next"><?php next_comments_link( __( 'Newer Comments →', 'twentyfourteen' ) ); ?></div>
	</nav><!-- #comment-nav-below -->
	<?php endif; // Check for comment navigation. ?>
	<?php if ( ! comments_open() ) : ?>
	<p class="no-comments"><?php _e( 'Comments are closed.', 'twentyfourteen' ); ?></p>
	<?php endif; ?>
	<?php endif; // have_comments() ?>
	<?php comment_form(); ?>
</div><!-- #comments -->

comment_form() 参数

1
<?php comment_form($args, $post_id); ?>
  • $args:comment_form() 的输出配置参数,为一个关联数组,配置项非常丰富,下面我们会详细说明。
  • $post_id:文章id,默认为空,即当前id
$args的默认配置:
$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' ),);

自定义评论表单

删除表单字段

如果我们想要删除网址字段,只需要打开主题的 functions.php 文件,添加以下代码:
add_filter('comment_form_default_fields', 'mytheme_remove_url');
 
function mytheme_remove_url($arg) {$arg['url'] = '';return $arg;
}

保存后刷新页面,你就会看到“url”输入框已经不存在了。

新增表单字段

假设我们要添加一个 QQ 字段,同样在主题的 functions.php 添加下面的代码即可:
function my_fields($fields) {
	$fields['qq'] = '<p class="comment-form-qq">' . '<label for="qq">'.__('QQ').'</label> ' .
	'<input id="qq" name="qq" type="text" value="' . esc_attr( $commenter['comment_qq'] ) . '" size="30" /></p>';
	return $fields;
}
add_filter('comment_form_default_fields','my_fields');

刷新页面,即可看到新增的表单。

替换默认表单字段

代码和上面的例子差不多,如果你设置的字段为(author、email、url)其中之一,即 $fields[‘author’]、$fields[’email’]、$fields[‘url’] ,就可以替换默认的字段的输出内容。

默认的这三个字段如下:
$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>',
	);

comment_form() 钩子

评论表单同时还带了不少钩子,让你可以在喜欢的位置添加你想要的内容,具体钩子如下:

  • comment_form_before
  • comment_form_must_log_in_after
  • comment_form_top
  • comment_form_logged_in_after
  • comment_notes_before
  • comment_form_before_fields
  • comment_form_field_{$name}
  • comment_form_after_fields
  • comment_form_field_comment
  • comment_form (action hook)
  • comment_form_after
  • comment_form_comments_closed
在这里,倡萌只简单举一个小例子,在默认字段后面显示一句话,同样添加到主题的 functions.php :
function add_my_tips() {
	echo '欢迎踊跃发言!';
}
// 在默认字段(前面说的姓名、邮箱和网址)的下面添加字段
add_filter('comment_form_after_fields', 'add_my_tips');
// 在已登录下面添加字段(因为用户登录后,是没有默认上面三个字段的),所以要使用这个钩子插入内容
add_filter('comment_form_logged_in_after', 'add_my_tips');

其他的就靠大家多多实践了。

更多信息,请参考官方文档:http://codex.wordpress.org/Function_Reference/comment_form

来源于:

https://cnzhx.net/blog/altering-wordpress-comment-form/

对大多数人而言,WordPress 的评论框(留言表单)也许没有多少需要自定义的地方。我恰好想在提交评论按钮前面加一段话,顺便参考别的资料总结一下。

文中介绍的方法和代码基于 WordPress 3.3.1,至于以后会不会根据更新情况修改,这个很难说。如果有修改,会在文后说明。阅读此文需要对 PHP 有一点点了解,另外还需要知道 WordPress 主题的构建方法。嗯,实际上一般用法只需要依葫芦画瓢即可。

目录 Contents

0. 此文涵盖的内容

文中介绍的方法仅仅是修改 WordPress 默认的评论框内容,也就是默认已有定义的那些元素,不会增加新的域或按钮。仅仅是“修改”,而不是“重建”。所用方法基于 WordPress Codex 中 comment_form  一节的参数和 filter。

1. 背景

文中的方法分为两种:a. 修改参数; b. 使用 filter。涉及到的文件都在 theme 文件夹中(位于 /wp-content/theme/ 目录)。每种方法只涉及到一个特定的文件。这样就不需要修改 WordPress 核心文件了,那样会很麻烦:每次升级 WordPress 都需要重新修改,而且容易引起错误。

前一种方法只涉及到 comments.php 文件。大多数主题都会有这个文件。虽然并不是一定要有 comments.php 文件,只不过这是 WordPress 推荐的方式。

第二种方法只需要修改 functions.php 文件。同样的,大多数主题都会有这个文件。主题自定义的功能都在这个文件中。与上面不同的是,如果你的主题中没有这个文件,你可以自己创建一个。

2. 评论框简史

在版本 3 之前,整个 WordPress 评论框的全部代码都是在主题的 comments.php 文件中的。这使得修改它非常的方便。不过带来的问题就是让主题看起来有些乱。

开发人员也注意到了这个问题,然后从 WordPrss 3 开始,评论框就被精简为一个函数了,直接在主题的相应位置调用此函数:

 comment_form(); ?>

从此,基本上所有的主题都会直接使用此函数生成默认的评论框,顶多就是在 CSS 样式定义上各有各的风格。一切变得极其简洁。

然而问题也随之而来:如果有人想要改变评论框,那就需要多动动脑子了。

3. 两种方法

有两种方法可以对评论框进行自定义,能完成的任务也一样。要采用哪一种方法一方面看你要干什么,另一方面就看个人的喜好了。

注意:方法 2 是我个人非常推荐的方法,会覆盖掉方法 1。

方法 1: 在 COMMENTS.PHP 中更改 COMMENT_FORM() 调用

这个方法用于以下场景是比较合适的:

  • 修改评论框的所有细节
  • 修改评论框中各字段(field)的标记,包括标签(label)
  • 其实,要完成想我开头提到的那种修改目的,这个方法也是很好的

这个方法是通过给通常的评论框函数调用

 comment_form(); ?>

增加一些细节来实现修改的。这些细节通过参数来传递给该函数。要改变什么细节,就指定相应的参数。例如:

 comment_form( $args, $post_id ); >

其中,

  • $args:可选,是一个数组(array()),包含用于评论框的字符串和字段等的配置内容,如果不写该参数,就使用默认的(见下面);
  • $post_id:可选,指定要在 ID 为 $post_id 的文章下产生该评论框,如果不写该参数,就会使用当前文章的 ID(即在每篇文章下产生该文章的评论框)

以类似下面的形式定义上面的参数 $args 数组 array() :

$args = array(
        'parameter_name' => 'value',
        'another_parameter' => 'value'
    ));

默认的参数数组内容如下(via):

$args = array(
	'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' ),
	'comment_field' => '
' . _x( 'Comment', 'noun' ) . '
',
	'must_log_in' => '
' .  sprintf( __( 'You must be logged in to post a comment.' ), wp_login_url( apply_filters( 'the_permalink', get_permalink( ) ) ) ) . '
',
	'logged_in_as' => '
' . sprintf( __( 'Logged in as %2$s. Log out?' ), admin_url( 'profile.php' ), $user_identity, wp_logout_url( apply_filters( 'the_permalink', get_permalink( ) ) ) ) . '
',
	'comment_notes_before' => '
' . __( 'Your email address will not be published.' ) . ( $req ? $required_text : '' ) . '
',
	'comment_notes_after' => '
' . sprintf( __( 'You may use these HTML tags and attributes: %s' ), ' ' . allowed_tags() . '' ) . '
',
	'fields' => apply_filters( 'comment_form_default_fields', array(
		'author' => '
' . '' . __( 'Name', 'domainreference' ) . ' ' . ( $req ? '*' : '' ) . ''comment_author'] ) . '" size="30"' . $aria_req . ' />
',
		'email' => '
' . __( 'Email', 'domainreference' ) . ' ' . ( $req ? '*' : '' ) . ''comment_author_email'] ) . '" size="30"' . $aria_req . ' />
',
		'url' => '
' . __( 'Website', 'domainreference' ) . '' . ''comment_author_url'] ) . '" size="30" />
' ) ) );

能够使用的参数基本上包括了评论框的各个方面的细节。WordPress Codex entry on comment_form() 中对可用的参数有较为全面的介绍,并指明了参数的默认值(也就是不做修改时的样子)。

省事的话,也可以不定义参数数组 $args = array(…,而是直接将要修改的某个参数放在数组里直接调用。如下面的例子。

例如,默认情况下,在评论框的下面有一行字提示用户可以在评论时使用某些 HTML 代码,存储这些提示文字的参数是 comment_notes_after。想修改为别的提示,比如指向网站上某个说明页面的链接(如隐私政策页面),就可以直接将原始函数调用改为:

 comment_form(array(
        'comment_notes_after' => '
请访问我们的 隐私政策 页面。
'
    ));
?>

再例如,可以通过下面的形式,将默认的评论框标题 Leave a Reply 改写为别的,甚至可以是中文字符:

 comment_form(array('title_reply'=>'雁过留声,人过留名')); ?>

如果需要设置多个参数,需要在每个参数后面使用英文半角的逗号( , )隔开(最后一个参数后除外)。

如果要修改评论框的字段( fields )就稍微麻烦一些(此类应用建议使用下面的方法 2)。需要在上面参数数组 array 的里面创建一个字段数组(下面例子中将其命名为(赋值给) $fields ),然后通过 filter 来调用它。新数组 $fields 将被 ‘fields’ 参数调用。下面的例子中在 $fields 数组中指定了 author 字段的内容(包含了显示它所需要的所有 HTML 代码):

 comment_form(array(
        $fields = array(
            'author' => '
' . '' . __( 'Your Name' ) . ' . $aria_req . ' />
'
            );
    ));
?>  

这样就可以更加精细地控制评论框中“作者”(author)的显示方式。上例中将默认的标签 “Name” 改成了 “Your Name”,并将默认值(value)设置成了“Your First and Last Name”。现在只需要在参数数组 array 中调用该字段定义即可:

 comment_form(array(
        $fields = array(
            'author' => '
' . '' . __( 'Your Name' ) . ' . $aria_req . ' />
'
            );

        'fields'              => apply_filters( 'comment_form_default_fields', $fields ), 
        'comment_notes_after' => '
请访问我们的 隐私政策 页面。
'
    ));
?>

其中的一句:

apply_filters( 'comment_form_default_fields', $fields )

就是告诉 WordPress 要使用你提供的代码(这里使用 $fields 变量来定义)来替换评论框的默认字段 comment_form_default_fields。需要注意的是,上面的代码中 $fields 里只定义了 author 字段,所以如果你将上面的代码应用到自己的主题的话,评论框显示出来就只有“姓名”那个栏目了。当然,你也可以比照这个例子继续编写其它字段,email(邮件地址)和 url(网站地址)的代码。

这里给个直接修改参数形式的,稍作修改的评论框三个字段的修改代码,其中按照 HTML5 的建议增加了 placeholder

comment_form(
    array(
        'fields' => array(
            'author' => '<p class="comment-form-author"><label for="author">昵称label> <span class="required">*span><input type="text" placeholder="姓名或昵称" aria-required="true" size="30" value="' . esc_attr( $commenter['comment_author'] ) . '" name="author" id="author">p>',
            'email' => '<p class="comment-form-email"><label for="email">邮箱label> <span class="required">*span><input type="text" placeholder="电子邮件地址" aria-required="true" size="30" value="' . esc_attr( $commenter['comment_author_email'] ) . '" name="email" id="email">p>',
            'url' => '<p class="comment-form-url"><label for="url">站点label><input type="text" placeholder="个人主页网址" size="30" value="'.$comment_author_url.'" name="url" id="url">p>'
            )
        )
 );

方法 2: 在 FUNCTIONS.PHP 中使用 HOOK FILTER

这种方法比较适合于

  • 省略或改写字段(姓名、邮件、网址)
  • 当你想使用更加贴近核心也是最彻底的方法的时候

该方法采用 WordPress 的滤器(filters)来实现。使用 filter,可以在评论框最后输出之前对其进行修改(所以会覆盖掉在 comments.php 中的修改)。

这个就需要在主题的 functions.php 文件中操作了。将编写的代码放到 functions.php 文件的结尾即可(如果结尾有 ?>,则应放在 ?> 之前)。

如果你的主题没有 functions.php 文件,自己创建一个就行了(简单的 Windows 记事本程序就可以操作了),但是要注意的是,自己创建的时候应该先在该文档中输入下面的代码做为开头,

 

然后另起一行输入自定义的代码。先创建一个函数(function)来定义需要进行的操作。不过似乎只能用来操作(修改显示方式等)字段(fields),比如三个输入内容 author(姓名)、email(电邮)和 url(网址)。

例如,移除某字段:

add_filter('comment_form_default_fields', 'mytheme_remove_commentform_fields');
function mytheme_remove_commentform_fields($fields){
    $fields['email'] = '';  // 后面的参数留空表示移除 email 字段
    $fields['url'] = '';  // 移除 website 字段return $fields;
}

程序的名称就随意啦,只要保证上面一行 add_filter 中调用的与之一致就行了。

再比如修改 author 字段的形式:

function alter_comment_form_fields($fields){
    $fields['author'] = '
' . '' . __( 'Your name, please' ) . ' ' . ( $req ? '*' : '' ) .
                    ''comment_author'] ) . '" size="30"' . $aria_req . ' />
';
    $fields['email'] = '';  // 移除 email 字段
    $fields['url'] = '';  // 移除 website 字段

    return $fields;
}

需要注意的是,如果要修改某个字段,必须将该字段相关的所有部分 —— 标签、输入框等 —— 都定义在里面,否则……自己看看就知道了。

实际上也可以通过挂钩 filter 来增加新的字段。只不过,如果没有相应的 WordPress 数据库操作,新加的字段并不会存储到数据库中,只能是个摆设。新加字段的方法是:

function my_fields($fields) {
     $fields['new'] = '
新字段' ' . ( $req ? '"required">*' : '' ) . '"new" name="new" size="30" type="text" value="' . esc_attr( $commenter['comment_author_new'] ) . '" />
'; 
    return $fields; 
}
add_filter('comment_form_default_fields','my_fields');

这里给个采用 filter 方式的,稍作修改的评论框三个字段的修改代码,与前面参数传递方式那个实现的操作是一模一样的,只不过这个要用在 functions.php 文件里头。

function alter_comment_form_fields($fields){
    $fields['author'] = > '<p class="comment-form-author"><label for="author">昵称label> <span class="required">*span><input type="text" placeholder="姓名或昵称" aria-required="true" size="30" value="' . esc_attr( $commenter['comment_author'] ) . '" name="author" id="author">p>';
    $fields['email'] = > '<p class="comment-form-email"><label for="email">邮箱label> <span class="required">*span><input type="text" placeholder="电子邮件地址" aria-required="true" size="30" value="' . esc_attr( $commenter['comment_author_email'] ) . '" name="email" id="email">p>';
    $fields['url'] = > '<p class="comment-form-url"><label for="url">站点label><input type="text" placeholder="个人主页网址" size="30" value="'.$comment_author_url.'" name="url" id="url">p>';
    return $fields;
}

add_filter('comment_form_default_fields','alter_comment_form_fields');

直接将上面的代码放到你的 functions.php 文件中,稍作修改即可。不过,如果要改变评论框出现的位置,那还是需要动一下 comments.php 文件的。

实际上,将下面的代码保存下来,随时可以往里面填写东西来实现修改(每行前面的 // 表示注释掉改行,即让它不起作用,所以,要用的话就把 // 删掉):

function alter_comment_form_fields($fields){
    //$fields['author'] = ''; //removes name field
    //$fields['email'] = '';  //removes email field
    //$fields['url'] = '';  //removes website field
    return $fields;
}

add_filter('comment_form_default_fields','alter_comment_form_fields');

后记

写这个的时候查了查资料,参考了2篇文章:

  1. http://chipcullen.com/altering-the-comment-form-in-wordpress/
  2. http://www.1stwebdesigner.com/wordpress/comment-form-customization/

如果你有什么建议和疑问,请在下方留言。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/altering-wordpress-comment-form/>。转载请保留此信息及相应链接。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新消息 消息中心
有新私信 私信列表
搜索