允许客人在单个帖子上发表评论

时间:2012-11-23 作者:Amaca

我只允许尚未注册的客人评论一篇帖子。其他帖子只能对注册用户发表评论。

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

这听起来是一个有用的功能。要获得所需,您必须改变三件事:

添加复选框以启用每篇文章的匿名评论Screen Options 在帖子编辑器页面上,可以启用Discussion 代谢箱。我们将向该元框添加复选框:

enter image description here

我们很幸运,有一个钩子:\'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:

enter image description here

这就是为什么我们要为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.

插件仅此而已。您可以将代码作为插件下载到GitHub上:
Plugin Anonymous comments per post

结束

相关推荐

是什么原因导致wp-Comments-post.php重定向到浏览器的IP地址?

我有一个WordPress副本正在运行,它最近已经从共享主机转移到我控制的VPS上。虽然同一站点的测试副本在同一实例的另一个vhost上、在同一IP地址上正确运行,但在我将公共站点移到另一个vhost上之后,注释表单开始将访问者重定向回自己的IP地址,并显示302 Found 代替成功的302 Moved Temporarily.运行WP 3.4.1,我尝试了:从仪表板重新安装WP,并检查所有插件都是最新的,停用所有插件并将主题设置为211,与工作测试安装不同,以检查它们是否是来自多个IP、计算机和浏览器