这听起来是一个有用的功能。要获得所需,您必须改变三件事:
添加复选框以启用每篇文章的匿名评论将复选框值与帖子一起保存在帖子视图中过滤评论注册要求的检查,以启用评论表单,并在实际的评论保存操作中过滤以使其通过如果打开Screen Options 在帖子编辑器页面上,可以启用Discussion 代谢箱。我们将向该元框添加复选框:
我们很幸运,有一个钩子:\'post_comment_status_meta_box-options\'
. 让我们使用它:
add_action( \'post_comment_status_meta_box-options\', \'acpp_checkbox\' );
/**
* Print a checkbox into the comment status metabox.
*
* @wp-hook post_comment_status_meta_box-options
* @param object $post
* @return void
*/
function acpp_checkbox( $post )
{
$key = \'_allow_anonymous_comments\';
$current = get_post_meta( $post->ID, $key, TRUE );
printf(
\'<br /><label for="%1$s">
<input type="checkbox" id="%1$s" name="%1$s" class="selectit" %2$s/> %3$s
</label>\',
$key,
checked( 1, $current, FALSE ),
apply_filters( \'acpp_metabox_label\', \'Allow anonymous comments.\' )
);
}
如你所见,我发明了一个新的post元键
\'_allow_anonymous_comments\'
. 前导下划线将在
Custom Fields 代谢箱。(相关:
How to delete custom field “suggestions” from dropdown list)
如果元值已经存在,并且等于
1
我们
preselect 信息技术
过滤器\'acpp_metabox_label\'
允许主题作者转换该值。我懒得为一个小字符串添加语言文件…
保存元值以保存我们的价值\'save_post\'
, 运行一些检查并将结果存储为整数:
add_action( \'save_post\', \'acpp_save\' );
/**
* Save the checkbox value as number
*
* @wp-hook save_post
* @param int $post_id
* @param object $post
* @return void
*/
function acpp_save( $post_id, $post )
{
// AJAX autosave
if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
return;
// Some other POST request
if ( ! isset ( $_POST[\'post_type\'] ) )
return;
// Missing capability
if ( ! current_user_can( \'edit_\' . $_POST[\'post_type\'], $post_id ) )
return;
$key = \'_allow_anonymous_comments\';
// Checkbox successfully clicked
if ( isset ( $_POST[ $key ] ) and \'on\' === strtolower( $_POST[ $key ] ) )
return update_post_meta( $post_id, $key, 1 );
// Checkbox deselected
delete_post_meta( $post_id, $key );
}
过滤注册检查,现在我们必须在前端使用该值,并更改选项检查的结果
comment_registration
. 我们不想在中更改博客范围的值
wp-admin
:
这就是为什么我们要为is_admin()
到该过滤器。过滤选项检查实际上很简单:钩住\'pre_option_\' . $option_name
并返回除FALSE
. 因为我们不想回来TRUE
或者,我们通过返回来欺骗支票0
.
add_filter( \'pre_option_comment_registration\', \'acpp_comment_reg_filter\' );
/**
* Trick the registration checks on front-end
*
* Important: If we return FALSE, the filter will be effectively ignored.
* It has to be any other value.
*
* @wp-hook pre_option_comment_registration
* @return bool|int
*/
function acpp_comment_reg_filter()
{
if ( is_admin() )
return FALSE;
$key = \'_allow_anonymous_comments\';
$post_id = 0;
// Only available on wp-comments-post.php, not on regular post pages.
if ( isset( $_POST[\'comment_post_ID\'] ) )
$post_id = (int) $_POST[\'comment_post_ID\'];
//
$post = get_post( $post_id );
$open = get_post_meta( $post->ID, $key, TRUE );
if ( 1 == $open )
return 0;
return FALSE;
}
WordPress将此检查用于注释表单、线程注释上的注释回复链接以及在中保存注释时使用
wp-comments-post.php
.