如何让WooCommerce后台评论页排除comment_type为question的自定义评论
WooCommerce后台评论页排除自定义问答评论的解决方案
问题背景
我正在开发WooCommerce商品问答插件,已实现前端提问表单,并将问题以comment_type = 'question'的类型存入评论数据库。但现在后台评论页会同时显示普通商品评论和这类自定义问答评论,需要让后台评论页排除question类型的评论,后续会为问答单独做专属后台页面。
现有代码
function ask_question() { ?> <form method="post"> <?php wp_nonce_field( name:'ask-question_wpnonce' ); ?> <!-- 注意:这里input type="textarea"是错误的,应该用textarea标签 --> <input type= "textarea" name= "question_form" id= "question_form" > <label for= "question_form" > <?php _e('Ask a question')?> </label> <button type="submit" class="button" name="ask_question">Submit</button> </form> <?php } function save_question() { if ( isset($_POST['ask_question']) && isset($_POST['question_form']) ) { global $post; $question = $_POST['question_form']; $commentdata = [ 'comment_author' => '', 'comment_author_email' => '', 'comment_author_url' => '', 'comment_content' => $question, 'comment_date' => '', 'comment_type' => 'question', 'comment_parent' => 0, 'comment_post_ID' => $post->ID, 'user_id' => '', ]; wp_new_comment( $commentdata ); } }
解决方案:使用pre_get_comments过滤器
WordPress提供了pre_get_comments过滤器,可以在评论查询执行前修改查询参数,从而排除指定类型的评论。
实现代码
// 后台评论列表排除question类型的评论 add_action('pre_get_comments', 'exclude_question_comments_from_admin'); function exclude_question_comments_from_admin($query) { // 仅在后台评论主查询中生效 if (is_admin() && $query->is_main_query()) { // 排除comment_type为question的评论 $query->set('comment_type__not_in', ['question']); } return $query; }
代码说明
pre_get_comments钩子会拦截评论查询请求,在查询执行前修改参数is_admin()确保代码只在后台生效,避免影响前端评论展示$query->is_main_query()保证只修改后台评论页面的主查询,不干扰其他评论相关的查询comment_type__not_in参数直接指定要排除的评论类型,比列出所有要保留的类型更灵活,后续新增其他自定义评论类型时无需修改此代码
额外修正:表单输入框错误
现有代码中把<textarea>写成了<input type="textarea">,这是HTML语法错误,会导致输入框无法正常渲染,修正后的代码如下:
<textarea name="question_form" id="question_form" rows="4" cols="50" ></textarea>
内容的提问来源于stack exchange,提问作者HighTechLab
相关产品推荐
相关产品推荐

