子比主题美化 – 添加用户封禁功能小黑屋模块

效果图

图片[1]-子比主题美化 – 添加用户封禁功能小黑屋模块-易幻云网络

由于本站的用户越来越多,有些用户真的没有一点素质,有些用户在评论区肆无忌惮,更有些甚至直接说脏话、谩骂等,故添加了wordpress的用户封禁小黑屋功能,在此记录添加小黑屋功能的方法,方便以后查看。

教程
在主题目录下新建一个xy_block.php文件,我用的是子比主题,文件路径为:网站->wp-content->themes->zibll

把下面代码复制到xy_block.php文件中

<?php

add_action('widgets_init', 'widget_block_top');
function widget_block_top()
{
    register_widget('widget_ui_block');
}

/////用户列表-----
class widget_ui_block extends WP_Widget
{
    public function __construct()
    {
        $widget = array(
            'w_id'        => 'widget_ui_block',
            'w_name'      => _name('用户封禁情况'),
            'classname'   => '',
            'description' => '显示网站用户被封禁情况,建议侧边栏显示。',
        );
        parent::__construct($widget['w_id'], $widget['w_name'], $widget);
    }
    public function widget($args, $instance)
    {
        extract($args);
        echo "<style>
            .font-hidden{overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}
            .xy_tc_mb-5{text-align:center;margin-bottom: -5px;}
            .xy-widget-title {position: relative;padding: 0 0 14px 20px !important;margin-top: 5px;border-bottom: 1px solid #f5f6f7;font-size: 16px;font-weight: 600;color: #18191a;width: 100%;}
            .xy-widget-title:after {left: 12px !important;}
            .xy-widget-title:before, .xy-widget-title:after {position: absolute;transform: skewX(-15deg);content: '';width: 3px;height: 16px;background: var(--theme-color);top: 0;left: 4px;bottom: 10%;transition: .4s;}
        </style>";
        $defaults = array(
            'title'        => '',
            'mini_title'   => '',
            'more_but'     => '<i class="fa fa-angle-right fa-fw"></i>更多',
            'more_but_url' => '',
            'in_affix'     => '',
            'include'      => '',
            'exclude'      => '',
            'hide_box'     => false,
            'number'       => 10,
            'orderby'      => 'block',
            'order'        => 'DESC',
        );
        $instance   = wp_parse_args((array) $instance, $defaults);
        $mini_title = $instance['mini_title'];
        if ($mini_title) {
            $mini_title = '<small class="ml10">' . $mini_title . '</small>';
        }
        $title    = $instance['title'];
        $more_but = '';
        if ($instance['more_but'] && $instance['more_but_url']) {
            $more_but = '<div class="pull-right em09 mt3"><a href="' . $instance['more_but_url'] . '" class="muted-2-color">' . $instance['more_but'] . '</a></div>';
        }
        $mini_title .= $more_but;
        /*if ($title) {
            $title = '<div class="box-body notop"><div class="title-theme">' . $title . $mini_title . '</div></div>';
        }*/
        $in_affix = $instance['in_affix'] ? ' data-affix="true"' : '';

        $class = !$instance['hide_box'] ? ' zib-widget' : '';
        echo '<div' . $in_affix . ' class="theme-box">';

        echo '<div class="user_lists' . $class . '">';
        $shu = $instance['number'];
        $orderby = $instance['orderby'];
        $isorderby = '拉黑名单';
        $order = $instance['order'];
         global $wpdb;
        $used =  $wpdb->get_results("SELECT meta_value,user_id,meta_key FROM {$wpdb->usermeta} WHERE meta_key='$orderby' AND meta_value !='0' ORDER BY user_id $order LIMIT $shu");
        
        if ($title) {
            if($instance['mini_title']){
                $xbt = '<small class="ml10">'.$instance['mini_title'].'</small>';
            }
            echo '<h2 class="xy-widget-title font-hidden">'.$instance['title'].''.$xbt.'</h2>';
        }
        
        foreach ($used as $k){
            $user = zib_get_user_name_link($k->user_id);
            $is_ban = zib_get_user_ban_info($k->user_id);
            $userimg = zib_get_avatar_box($k->user_id, 'avatar-img forum-avatar');
            
            $time = $is_ban['time'];
            $datetime    = date("jS H:i",strtotime("$time"));;
            
            $html = '<div class="posts-mini border-bottom  relative ">';
            $html .= $userimg;
            $html .='<div class="posts-mini-con em09 ml10 flex xx jsb"> <p class="flex jsb">';
            $html .= '<span class="flex1 flex"><name class="inflex ac relative-h"><a href="' . zib_get_user_home_url($k->user_id) . '">' . $user . '</a></name><span class="flex0 icon-spot muted-3-color" title="封禁时间:' . ($is_ban['banned_time'] ? $is_ban['banned_time'] : '永久') . '">' . $datetime. '</span></p>';
            $html .= '<div class="flex jsb muted-2-color font-hidden">'.$is_ban['reason'].'</div></div> ';
            $html .= '<div class="flex jsb xx text-right flex0 ml10"><div class="text-right em5"><span class="badge pull-right cursor" title="封禁状态">' . (2 == $is_ban['type'] ? '禁封中' : '小黑屋') . '</span></div></div></div>';
            echo $html;
        }
        if($used){
            echo '<div class="mt10 xy_tc_mb-5"><a href="'.$instance['more_but_url'].'" class="muted-2-color c-blue">'.$instance['more_but'].'</a></div>';
        }else{
            echo zib_get_ajax_null('暂无'.$instance['title'].'成员', 0);
        }
        echo '</div></div>';
    }

    public function form($instance)
    {
        $defaults = array(
            'title'        => '',
            'mini_title'   => '',
            'more_but'     => '<i class="fa fa-angle-right fa-fw"></i>更多',
            'more_but_url' => '',
            'in_affix'     => '',
            'include'      => '',
            'exclude'      => '',
            'number'       => 10,
            'hide_box'     => '',
            'orderby'      => 'points',
            'order'        => 'DESC',
        );

        $instance = wp_parse_args((array) $instance, $defaults);

        $page_input[] = array(
            'name'  => __('标题:', 'zib_language'),
            'id'    => $this->get_field_name('title'),
            'std'   => $instance['title'],
            'style' => 'margin: 10px auto;',
            'type'  => 'text',
        );
        $page_input[] = array(
            'name'  => __('副标题:', 'zib_language'),
            'id'    => $this->get_field_name('mini_title'),
            'std'   => $instance['mini_title'],
            'style' => 'margin: 10px auto;',
            'type'  => 'text',
        );
        $page_input[] = array(
            'name'  => __('跳转页面->文案:', 'zib_language'),
            'id'    => $this->get_field_name('more_but'),
            'std'   => $instance['more_but'],
            'style' => 'margin: 10px auto;',
            'type'  => 'text',
        );
        $page_input[] = array(
            'name'  => __('跳转页面->链接:', 'zib_language'),
            'id'    => $this->get_field_name('more_but_url'),
            'std'   => $instance['more_but_url'],
            'desc'  => '设置为任意链接',
            'style' => 'margin: 10px auto;',
            'type'  => 'text',
        );
        $page_input[] = array(
            //    'name'  => __('显示背景盒子', 'zib_language'),
            'id'    => $this->get_field_name('hide_box'),
            'std'   => $instance['hide_box'],
            'desc'  => '不显示背景盒子',
            'style' => 'margin: 10px auto;',
            'type'  => 'checkbox',
        );

        echo zib_edit_input_construct($page_input);
        ?>

    <p>
      <label>
        <input style="vertical-align:-3px;margin-right:4px;" class="checkbox" type="checkbox" <?php checked($instance['in_affix'], 'on');?> id="<?php echo $this->get_field_id('in_affix'); ?>" name="<?php echo $this->get_field_name('in_affix'); ?>"> 侧栏随动(仅在侧边栏有效)
      </label>
    </p>
    <p>
      <label>
        显示数目:
        <input style="width:100%;" id="<?php echo $this->get_field_id('number');
        ?>" name="<?php echo $this->get_field_name('number');
        ?>" type="number" value="<?php echo $instance['number'];
        ?>" size="24" />
      </label>
    </p>
    <p>
      <label>
        显示类型:
        <select style="width:100%;" id="<?php echo $this->get_field_id('orderby');
        ?>" name="<?php echo $this->get_field_name('orderby');
        ?>">
          <option value="banned" <?php selected('banned', $instance['orderby']);
        ?>>黑名单</option>
        </select>
      </label>
    </p>
    <p>
      <label>
        排序顺序:
        <select style="width:100%;" id="<?php echo $this->get_field_id('order');
        ?>" name="<?php echo $this->get_field_name('order');
        ?>">
          <option value="ASC" <?php selected('ASC', $instance['order']);
        ?>>升序</option>
          <option value="DESC" <?php selected('DESC', $instance['order']);
        ?>>降序</option>
        </select>
      </label>
    </p>

  <?php
}
}

在主题的pages目录里新建block_banned.php文件,文件路径例如:网站->wp-content->themes->zibll->pages

<?php
/**
 * Template name: 用户封禁
 * Description:   block page
 */
get_header();

global $wpdb;
$total = $wpdb->get_var( "SELECT COUNT(`meta_value`) FROM $wpdb->usermeta WHERE meta_key='banned' AND meta_value !='0'" );

function block_banned(){
    $instance   = wp_parse_args((array) $instance, $defaults);
    global $wpdb;
    
    //获取分页数据 :每页显示的数量 默认为50
    $limit = 20;
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    
    //计算每一页第一条记录的显示偏移量
    //偏移量 = (页码 -1) \* 每页的显示数量
    
    $offset = ( $paged - 1 ) * $limit;
    $total = $wpdb->get_var( "SELECT COUNT(`meta_value`) FROM $wpdb->usermeta WHERE meta_key='banned' AND meta_value !='0'" );
    $pages = ceil( $total / $limit );
    
    //调用
    $banned =  $wpdb->get_results("SELECT meta_value,user_id,meta_key FROM {$wpdb->usermeta} WHERE meta_key='banned' AND meta_value !='0' ORDER BY user_id DESC LIMIT $limit OFFSET {$offset}");
    
    $html = '
        <div class="zib-widget">
            <div class="xypro_describe"> 
                <div class="xypro_describe_title">
                    封禁列表('.$total.'名成员)
                </div> 
                <div id="xy_hide" class="xypro_describe_content xy_height_hide">
                    <table class="yq">
                        <thead>
                            <tr>
                                <th align="center" width="5%"><strong>用户名</strong></th>
                                <th align="center" width="5%"><strong>封禁时间</strong></th>
                                <th align="center" width="5%"><strong>封禁类型</strong></th>
                                <th align="center" width="5%"><strong>封禁时长</strong></th>
                                <th align="center" width="5%"><strong>封禁原因</strong></th>
                                <th align="center" width="5%"><strong>备注</strong></th>
                            </tr>
                        </thead>';
    $html .= '          <tbody class="link-list">';
    
    foreach ($banned as $k => $v){
        $is_ban = zib_get_user_ban_info($v->user_id);
        $name = zib_get_user_name_link($v->user_id);
        $time = strtotime($is_ban['banned_time']) - strtotime($is_ban['time']);
        $time = $time / 86400 .'天';
        $no_appeal = !empty($is_ban['no_appeal']); //禁止申诉 不能申诉
        if($no_appeal){
            $no_appeal = '(不可申诉)';
        }else{
            $no_appeal = '(可申诉)';
        }
        
        $html .= '<tr class="yq_link">
                    <td>'.$name.'</td>
                    <td>'.$is_ban['time'].'</td>
                    <td>'.(2 == $is_ban['type'] ? '禁封中' : '小黑屋') .'</td>
                    <td>'.($is_ban['banned_time'] ? $time : '永久') .'<span style="color:var(--theme-color);">'.$no_appeal.'</span></td>
                    <td>'.$is_ban['reason'] .'</td>
                    <td>'.$is_ban['desc'].'</td>
                </tr>';
    }
    
    $html .= '</tbody></table>';
    $html .= $banned ? xy2_pages($pages,$paged) : '<div class="text-center ajax-item "><img style="width:280px;opacity: .7;border: none;" src="'.ZIB_TEMPLATE_DIRECTORY_URI.'/img/null.svg"><p class="em09 muted-3-color separator">暂无封禁用户</p></div>';
    $html .= '</div></div></div>';
    return $html;
}
/**
* 数字分页函数
* 因为wordpress默认仅仅提供简单分页
* 所以要实现数字分页,需要自定义函数      
*/
function xy2_pages($max_page,$paged) {
    $html = '';
    $html.= '<style>
        .pagination{margin:0;text-align:center;font-size:12px;display:block;border-radius:0}
        .excerpts .pagination{margin-bottom: 10px;}
        .pagination ul{display:inline-block !important;margin-left:0;margin-bottom:0;padding:0}
        .pagination ul > li{display:inline}
        .pagination ul > li > a,.pagination ul > li > span{margin:0 2px;padding:8px 12px;background-color:#ddd;color:#666;border-radius:2px;opacity:.88}
        .pagination ul > li > a:hover,.pagination ul > li > a:focus{opacity:1}
        .pagination ul > .active > a,.pagination ul > .active > span{background-color:#000;color:#fff}
        .pagination ul > .active > a,.pagination ul > .active > span{cursor:default}
        .pagination ul > li > span,.pagination ul > .disabled > span,.pagination ul > .disabled > a,.pagination ul > .disabled > a:hover,.pagination ul > .disabled > a:focus{color:#999999;background-color:transparent;cursor:default}
    </style>';
    
    $p = 2;
    if ( $max_page == 1 ) {
        return;
    }
    $html.= '<span class="pagination"><ul>';
    $paged = !empty( $paged ) ? $paged : 1;
    
    if ( $paged > 1 ) {
        $html.= '<li><a href="'.esc_html( get_pagenum_link( 1 ) ).'">首页</a></li>';
    }
    
    $html.= '<li class="prev-page">';
    $html.= '</li>';
    for ( $i = $paged - $p; $i <= $paged + $p; $i++ ) {
        if ( $i > 0 && $i <= $max_page ) {
            if($i == $paged){
                $html.= "<li class=\"active\"><span>{$i}</span></li>";
            }else{
                $html.= '<li><a href="'.esc_html( get_pagenum_link( $i ) ).'">'. $i .'</a></li>';
            }
        }
    }
    $html.= '<li class="next-page">';
    $html.= '</li>';
    $html.= '<li><a href="'.esc_html( get_pagenum_link( $max_page ) ).'">尾页</a></li>';
    //$html.= '<li><span>共 '.$max_page.' 页</span></li>';
    $html.= '</ul></span>';
    return $html;
}
?>
<style>
.wp-posts-content p{margin: 0 0 10px;}
.xypro_describe {position: relative;border: 1px dashed #dcdfe6;line-height: 26px;margin-top: 10px;}
.xypro_describe_title {position: absolute;top: 0;left: 8px;-webkit-transform: translateY(-50%);transform: translateY(-50%);background:var(--main-bg-color);padding: 0 5px;font-weight: 500;max-width: 200px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}
.xypro_describe_content{color: #606266;padding: 18px 15px 0;width: 100%;text-overflow: ellipsis;white-space: nowrap;overflow: hidden;overflow-x: scroll;}
.yq{max-width: 100%;table-layout: fixed;color: #909399;margin-bottom: 18px;border-top: 1px solid #ebeef5;border-left: 1px solid #ebeef5;}
#xy_hide::-webkit-scrollbar {
    display: none;
}
.yq thead th {font-weight: 500;background: #ebeef5;text-align: center;padding: 8px;border-bottom: 1px solid #ebeef5;border-right: 1px solid #ebeef5;}
.yq_link td {text-align: center;padding: 8px;border-bottom: 1px solid #ebeef5;border-right: 1px solid #ebeef5;text-overflow: ellipsis;
    white-space: nowrap;overflow: hidden;}
@media screen and (max-width: 700px){
    .yq{width: 600px !important;}
}
</style>
<main class="container">
    <div class="content-wrap">
        <div class="content-layout xy-article">
            <div class="nopw-sm box-body theme-box radius8 main-bg main-shadow">
                <article class="article wp-posts-content">
                    <div class="wp-block-zibllblock-quote">
                        <div class="quote_q" data-color="#fb2121" style="--quote-color:#fb2121">
                            <i class="fa fa-quote-left"></i>
                            <p>本网站严禁发布违法违规以及发布毫无意义的评论等内容,如有违反,封禁处理,以下是本站封禁用户列表,请大家珍惜自己的账户!</p>
                            </div>
                        </div>
                        <div style="padding: 0 20px;margin-bottom: 20px;">
                            <p><strong>封禁类型说明:</strong></p>
                            <p>1.小黑屋:用户拉入小黑屋后,用户将失去所有的发布权限及大部分的操作权限,例如发帖、评论、下载等;</p>
                            <p>2.封号:禁封的用户将不能登录,将失去全部权限;</p>
                            <p class="mb10-sm" style="color:#fb2121;">累计封禁用户:<?php echo $total ? $total : 0;?>个 数据截止日期:<?php echo date("Y-m-d", time()+8*60*60);?></p>
                        </div>
                        <?php echo block_banned();?>
                        <div style="text-align:center;color:var(--theme-color);">
                        - - - 善语结善缘,恶语伤人心 - - -
                    </div>
                    </div>
                    
                </article>
            </div>
        </div>
    </div>
</main>
<?php
get_footer();

在functions.php文件中添加如下代码:

if (file_exists(get_theme_file_path('/xy_block.php'))) {
    require_once get_theme_file_path('/xy_block.php');
}


然后在网站后台新建页面,在默认模板里找到 用户封禁 然后发布

小工具找到 Zibll用户封禁情况 然后填写信息 发布(这里推荐放在侧边栏)

供学习和研究使用,禁止商业用途
购买前可以联系作者确认资源信息,防止交易矛盾
© 版权声明
THE END
喜欢就支持一下吧
点赞11
评论 抢沙发

请登录后发表评论

    暂无评论内容