在管理员评论屏幕上查询具有非空‘Author_url’值的评论

时间:2017-09-01 作者:Elias

在WordPress的管理评论屏幕上,当搜索评论时,我想选择只返回作者在可选URL/网站字段中输入内容的评论。我不是在寻找一种在URL字段中搜索的方法,而是一种从我的常规评论搜索中排除带有空URL字段的评论的方法。

我提出了以下可行的解决方案,可以在搜索查询中包含“has:url”,以实现我的目标:

add_filter(\'pre_get_comments\',\'set_has_url_flag\');
function set_has_url_flag($query){
    global $pagenow;
    global $onlyhasurl;

    if($pagenow == \'edit-comments.php\' && strpos($query->query_vars[\'search\'],"has:url")!==FALSE){
        $query->query_vars[\'search\'] = trim(preg_replace(\'!\\s+!\', \' \', str_replace("has:url","",$query->query_vars[\'search\'])));
        $onlyhasurl = TRUE;
        return $query;
    }
    return $query;
}

add_filter(\'the_comments\', \'filter_comments_for_has_url_flag\');
function filter_comments_for_has_url_flag($comments){
    global $pagenow;
    global $onlyhasurl;

    if($pagenow == \'edit-comments.php\' && isset($onlyhasurl) && $onlyhasurl===TRUE){
        foreach($comments as $key => $value){
            if(empty($value->comment_author_url)){ 
                unset($comments[$key]);
                continue;
            }
        }
    }
    return $comments;
}
我的解决方案的问题是,它删除了带有空URL字段的注释AFTER 执行查询时,注释屏幕的每页上显示的注释数会因删除了多少注释而有所不同,因为它们的“author\\u url”值为空。

有没有人能想出一种更好的方法来做到这一点,即在进行查询之前过滤注释,以便正确地分页注释?

1 个回复
SO网友:birgire

我们可以设置author_url 的参数WP_Comment_Querynull (空字符串无效)搜索没有作者url的评论。目前(4.8.1版)has_author_url 不支持。

使用子查询排除这些注释,没有author_url, 使用comment__not_in, 应该有效,但可能无法很好地扩展。背景fieldsids 将减少查询数据。

或者,我们可以创建一个像这样的助手插件,以支持_has_author_url 的输入参数WP_Comment_Query:

<?php
/**
 * Plugin Name: WPSE-278861: Support for the _has_author_url WP_Comment_Query argument
 */
add_filter( \'comments_clauses\', function( Array $clauses, \\WP_Comment_Query $query ) use ( &$wpdb ) 
{
    if(    isset( $query->query_vars[\'_has_author_url\'] ) 
        && true === $query->query_vars[\'_has_author_url\'] 
    )
        $clauses[\'where\'] = " {$wpdb->comments}.comment_author_url != \'\' ";

    return $clauses;

}, 10, 2 );
然后用它来支持has:url comments搜索参数,位于edit-comments.php 屏幕:

add_action( \'pre_get_comments\', function ( \\WP_Comment_Query $query )
{
    // Only target the `edit-comments.php` screen
    if( ! did_action( \'load-edit-comments.php\' ) )
        return;

    // Only target the search comment\'s query
    if( ! isset( $query->query_vars[\'search\'] ) )
        return;

    // Only target \'has:url\' searches
    if( false === strpos( $query->query_vars[\'search\'], \'has:url\' ) )
        return;

    // strip \'has:url\' (I leave it as is from the OP)
    $query->query_vars[\'search\'] = trim( 
        preg_replace(
            \'!\\s+!\', \' \', 
            str_replace( \'has:url\', \'\', $query->query_vars[\'search\'] )
        )
    );

    // Query for comments with an author url    
    $query->query_vars[\'_has_author_url\'] = true;

}, 10, 2 );
注意,我们去掉了全局变量$onlyhasurl$pagenow.

这是未经测试的,但希望您可以根据自己的需要进行调整!

结束

相关推荐

Wp-admin登录后检查GET_POST值

我想在登录到wp admin后检查get\\u选项值。我已将日期保存在get\\u选项中。我想检查get\\u选项中的值是否与wp admin登录后的当前日期相同。如果相同,那么我想显示管理员通知。每次我登录到wp admin时,它都会检查get\\u选项值。这是我的管理员通知代码。I have no idea how can i check the get_option value after wp-admin login. function sample_admin_notice__success()