过滤管理员(后端)‘回复’评论

时间:2022-01-19 作者:Rick Hellewell

查找管理/评论/回复流程的过滤器挂钩(在评论管理屏幕中使用“回复”)。这将在自定义插件中使用。

(该插件在前端输入的注释中添加了一个隐藏字段,以减少机器人输入的注释。额外字段正确插入前端,但不插入管理员注释列表页面。)

我需要

在评论管理列表的评论下拉列表中添加一个隐藏字段(单击评论的“回复”链接时显示的评论字段)https://developer.wordpress.org/reference/files/wp-admin/includes/class-wp-comments-list-table.php/ .

我走对了吗?是否有用于将字段添加到“管理/评论”页面上的评论框表单的过滤器?

(注意:错误地将此问题张贴在StackExchange主区域。并在没有解释我的努力的情况下获得了否决票和接近票。因此,将此问题复制到此处-我的本意。)

Added

隐藏字段通过“add\\u meta\\u box\\u comment”操作挂钩添加到前端的注释表单中,该操作挂钩使用“add\\u meta\\u box”函数指定字段和该插入/隐藏字段的回调函数。

隐藏/添加的字段通过“edit\\u comment”挂钩进行处理。如果隐藏字段不存在,则不会保存注释。

这在前端可以正常工作,但隐藏/添加字段不会添加到后端的注释表单中;答复;在评论列表页面上。

2 个回复
最合适的回答,由SO网友:Rick Hellewell 整理而成

虽然@SallyCJ的答案可能有用,而且可能是很好的信息,但我的应用程序采用了不同的方向。

我的应用程序在注释表单中需要一个隐藏字段。虽然可以轻松地将隐藏字段添加到前端注释表单中,但后端不使用该过程。但我的应用程序需要在验证过程中发布该隐藏值。

由于隐藏字段不容易插入后端下拉评论表单(当您点击回复按钮时会得到),我推断只有授权的管理员才能访问管理员/评论列表,因此我的应用程序不需要检查它是否是访问评论表单的bot。(我的插件感知机器人评论提交。)如果您以管理员身份登录,则您不是机器人。

因此,在检查隐藏字段的部分中,我添加了此项以将GUID值添加到前端注释表单上显示的“隐藏字段”:

if (current_user_can( \'moderate_comments\' ) ) {
     // forces the guid on admin/comment replies without needing
     //    to add a hidden field to the dropdown form.
    $_POST[\'the_hidden_field\'] = wp_generate_uuid4(); 
    return $commentdata;
    }
“if”语句仅适用于管理员/编辑/作者角色,因此隐藏字段会添加到评论帖子中。

请注意,其他人说,您可以使用is\\u admin()查看您是否在管理页面中,但在某些情况下返回false-例如,如果您在管理/列表注释页面中,您点击“回复”按钮获取注释。此处的is\\u admin()检查返回false。所以那没用。

添加上面的代码解决了我的问题。可能并不适用于所有人-您可能需要@SallyCJ建议的代码。但这对我有用。

SO网友:Sally CJ

是否有用于将字段添加到“管理/评论”页面上的“评论框”表单的过滤器?

如果你是说inline 编辑或回复评论的表单wp-admin/edit-comments.php, 然后

表单的输出使用wp_comment_reply() 它有一个同名的钩子,即。wp_comment_reply, 您可以使用它返回自己的评论回复表单HTML。

然而,内联编辑是一种JavaScript功能,因此我只需使用JS向表单中添加自定义字段。

工作示例,下面是一个示例脚本,用于添加名为hidden_field (已标记Hidden Field) 以该形式:

jQuery( function ( $ ) {
    // Append the field at the bottom of the inline form, above the submit
    // button. Just customize the HTML, but ensure the selector is correct.
    // ( i.e. I used [name="hidden_field"], so change it based on your HTML. )
    $( \'#replysubmit\' ).before(
        \'<p style="padding: 3px 0 2px 5px; clear: both">\' +
            \'<label>Hidden Field:</label> \' +
            \'<input name="hidden_field" />\' +
        \'</p>\'
    );

    // Note: (window.)commentReply is defined by WordPress.
    $( \'#the-comment-list\' ).on( \'click\', \'.comment-inline\', function() {
        var $field = $( \'#replyrow input[name="hidden_field"]\' );

        // If the Quick Edit button is clicked, set the field value to the
        // current database value.
        if ( \'edit-comment\' === commentReply.act ) {
            $field.val( $( \'#hidden_field-\' + commentReply.cid ).val() );
        } else {
        // If the Reply button is clicked, then we empty the field.
            $field.val( \'\' );
        }
    } );

    // Submit the form when the Enter key is pressed.
    $( \'#replyrow input[name="hidden_field"]\' ).on( \'keypress\', function( e ) {
        if ( e.which == 13 ) {
            commentReply.send();
            e.preventDefault();
            return false;
        }
    } );
} );
<将其保存到外部JS文件并将脚本加载到评论页面,例如通过admin_enqueue_scripts hook, like so:(确保admin-comments 哪个加载wp-admin/js/edit-comments.js, 在依赖项列表中)

add_action( \'admin_enqueue_scripts\', \'my_admin_enqueue_scripts\' );
function my_admin_enqueue_scripts() {
    if ( \'edit-comments\' === get_current_screen()->id ) {
        wp_enqueue_script( \'my-script\', \'/path/to/the/script.js\',
            array( \'admin-comments\' ) );
    }
}
comment_post (您已经使用的)edit_comment 挂钩。例如:

add_action( \'edit_comment\', \'my_save_comment_hidden_field\' ); // for the Quick Edit button
add_action( \'comment_post\', \'my_save_comment_hidden_field\' ); // for the Reply button
function my_save_comment_hidden_field( $comment_ID ) {
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
        return;
    }

    if ( ! isset( $_POST[\'hidden_field\'] ) ||
        ! current_user_can( \'edit_comment\', $comment_ID )
    ) {
        return;
    }

    $value = sanitize_text_field( $_POST[\'hidden_field\'] );

    update_comment_meta( $comment_ID, \'hidden_field\', $value );
}
<input />.. 你可以使用其他元素;重要的是,将值存储在某个位置,以便JS在编辑注释时,即单击;快速编辑;。

例如,我通过comment_text hook:

add_filter( \'comment_text\', \'my_comment_text\', 10, 2 );
function my_comment_text( $comment_text, $comment ) {
    $value = $comment ? get_comment_meta( $comment->comment_ID, \'hidden_field\', true ) : \'\';

    $input = sprintf( \'<input type="hidden" id="hidden_field-%d" value="%s" />\',
        $comment->comment_ID, esc_attr( $value ) );

    return $comment_text . $input;
}