【问题标题】:WordPress users in Datatables with shorting , searching and paginate具有排序、搜索和分页功能的数据表中的 WordPress 用户
【发布时间】:2019-02-22 07:03:28
【问题描述】:

我正在制作一个插件来在DataTables 中显示所有用户信息,但我未能实现搜索、过滤和分页。我有大约 20k 个用户。请帮帮我。

可能我需要更改我的查询以加入 wp_userswp_usermeta 并获得我的案例的结果。我发现了一个问题 here 和一个类似的 tutorial here 。我不擅长编写 MySQL 查询。请帮我解决一下这个。

我得到像

这样的 ajax 响应
{
  "draw": 1,
  "recordsTotal": 1,
  "recordsFiltered": 1,
  "data": [
    [
      "example@mail.com",
      "Some Name",
      "",
      "admin",
      ""
    ]
  ]
}

这是我的表结构

 <table id="user_table" class="display table table-striped table-bordered dataTable" style="width:100%">
        <thead class="user-table">
            <tr>
            <th>Email</th>
            <th>Name </th>
            <th>Url</th>
            <th>nickname</th>
            <th>description</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>

我的脚本

jQuery(document).ready(function($){
    $(window).on('load', function () {
      setTimeout(loadtable, 200);
    });
    function loadtable(){
        var ajaxurl =  USERAjax.wpajaxusersearch;
        var dataTable = $('#user_table').DataTable({  
           "processing":true,  
           "serverSide": true,  
           "order":[],  
           "pageLength": 10,
           "ajax":{  
                url: ajaxurl,  
                type:"POST"         
           },   
      });
    }
});

还添加了本地化脚本,如

function users_assets_scripts(){

    wp_register_script( 'jquery_datatables_js',  plugins_url( 'asset/js/datatables.min.js' , __FILE__ ), array(),null,true );
    wp_enqueue_script( 'jquery_datatables_js' );

    wp_register_style( 'jquery_datatables_css',  plugins_url( 'asset/css/datatables.min.css' , __FILE__ ));
    wp_enqueue_style( 'jquery_datatables_css' );

    wp_localize_script( 'jquery', 'USERAjax', array('wpajaxusersearch' => admin_url( 'admin-ajax.php?action=wpajaxusersearch' )) );
}

add_action('wp_enqueue_scripts', 'users_assets_scripts');

还有我的 ajax 响应数据获取函数

<?php 
function wpajaxusersearch(){ 

    $request=$_REQUEST;

    global $wpdb;
    $sort= "user_registered";

    //Build the custom database query to fetch all user IDs
    $all_users_id = $wpdb->get_results("SELECT $wpdb->users.ID FROM $wpdb->users ORDER BY $sort ASC LIMIT ".$request['start'].",".$request['length']." " );

    $totalData=$wpdb->num_rows;

    $data=array();
    foreach ( $all_users_id as $i_users_id ) {

            $user = get_userdata( $i_users_id->ID);

            $email              =$user->user_email;
            $user_fullname      =$user->first_name . ' ' . $user->last_name;
            $user_url           =$user->user_url;
            $user_nickname      =$user->nickname;
            $user_profile       =$user->description;
                $sub_array = array();  
                    $sub_array[] = $email;  
                    $sub_array[] = $user_fullname;  
                    $sub_array[] = $user_url;  
                    $sub_array[] = $user_nickname;   
                    $sub_array[] = $user_profile;    
               $data[] = $sub_array; 
    }

    $json_data=array(
        "draw"              =>  (isset($request["draw"]) ? $request["draw"] : 0),  
        "recordsTotal"      =>  intval($totalData),
        "recordsFiltered"   =>  intval($totalData),
        "data"              =>  $data
    );

    echo json_encode($json_data);
    wp_die(); //to remove that 0 response
}
add_action( 'wp_ajax_wpajaxusersearch', 'wpajaxusersearch' );
add_action( 'wp_ajax_nopriv_wpajaxusersearch', 'wpajaxusersearch' );

【问题讨论】:

  • 为什么在这里使用 AJAX? DataTables 本身不会处理分页和搜索吗?
  • habdle 但它加载时间很慢并且加载所有数据或者我不知道?你能帮我吗?还是有更好的主意?但我需要实时过滤器
  • 您的代码有什么问题?它只返回单个数据吗?
  • 它只加载下拉选择的数据。但搜索和过滤不起作用
  • 我看不懂,你能在这里分享你的网址吗?

标签: php mysql wordpress datatable


【解决方案1】:

将这些添加到您主题的“functions.php”中,一切都会好起来的。

// change user query to treat meta result as OR part
add_action( 'pre_user_query', 'user_meta_OR_search');
function user_meta_OR_search($q){   
    if ($search = $q->get('_meta_or_search')){
        add_filter( 'get_meta_sql', function( $sql ) use ( $search ){
            global $wpdb;

            // run once
            static $nr = 0; 
            if( 0 != $nr++ ) return $sql;

            // modify WHERE
            $where = sprintf(
                " AND ( %s OR %s OR %s ) ",
                $wpdb->prepare( "{$wpdb->users}.user_email like '%%%s%%'", $search),
                $wpdb->prepare( "{$wpdb->users}.user_url like '%%%s%%'", $search),
                mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) )
            );

            $sql['where'] = $where;

            return $sql;
        });
    }
}

function wpajaxusersearch()
{               
    $request = $_REQUEST;
    $columns = array('user_email','first_name','user_url','nickname','description');
    $search = esc_attr( trim( $request['search']['value'] ) );

    $args = array();
    $limit_args = array( 'number' => $request['length'], 'offset' => $request['start'] );   
    $order_args = array();
    $search_args = array();

    if ( isset($request['order']) && count($request['order']) )     
    {
        $sort_column = $request['order'][0]['column'];          
        $sort_column_name = $columns[$sort_column];
        $sort_dir = $request['order'][0]['dir'];

        if( stristr( $sort_column_name,'user_' ))
            $order_args = array( 'orderby' => $sort_column_name, 'order' => $sort_dir );                
        else
            $order_args = array( 'meta_key' => $sort_column_name, 'orderby' => 'meta_value', 'order' => $sort_dir );
    }
    else
        $order_args = array( 'orderby' => 'user_registered', 'order' => 'ASC' );

    $args = $order_args;

    if(isset($search) && $search != "") 
    {
        $search_args = array(               
            '_meta_or_search' => "*{$search}*",    
            'meta_query' => array(
                'relation' => 'OR',
                array(
                    'key'     => 'first_name',
                    'value'   => $search,
                    'compare' => 'LIKE'
                ),
                array(
                    'key'     => 'last_name',
                    'value'   => $search,
                    'compare' => 'LIKE'
                ),
                array(
                    'key'     => 'nickname',
                    'value'   => $search,
                    'compare' => 'LIKE'
                ),
                array(
                    'key'     => 'description',
                    'value'   => $search,
                    'compare' => 'LIKE'
                )
            )
        );                          
    }       

    $all_users = new WP_User_Query( $args );
    $total_users = count($all_users->get_results());
    $filtered_users = count($all_users->get_results());

    if(isset($search) && $search != "") 
    {
        $args = array_merge($args, $search_args);
        $all_users = new WP_User_Query( $args );
        $filtered_users = count($all_users->get_results());
    }

    $args = array_merge($args, $limit_args);
    $all_users = new WP_User_Query( $args );        

    foreach ( $all_users->get_results() as $user ) {
        $email = $user->user_email;
        $user_fullname = $user->first_name . ' ' . $user->last_name;
        $user_url = $user->user_url;
        $user_nickname = $user->nickname;
        $user_profile = $user->description;
        $sub_data = array();  
        $sub_data[] = $email;  
        $sub_data[] = $user_fullname;  
        $sub_data[] = $user_url;  
        $sub_data[] = $user_nickname;   
        $sub_data[] = $user_profile;    
        $data[] = $sub_data; 
    }

    $json_data=array(
        "draw"              =>  (isset($request["draw"]) ? $request["draw"] : 0),  
        "recordsTotal"      =>  intval($total_users),
        "recordsFiltered"   =>  intval($filtered_users),
        "data"              =>  $data
    );

    echo json_encode($json_data);
    wp_die();
}
add_action( 'wp_ajax_wpajaxusersearch', 'wpajaxusersearch' );
add_action( 'wp_ajax_nopriv_wpajaxusersearch', 'wpajaxusersearch' );

【讨论】:

  • 是的,搜索正在工作并且短路,例如,如果桌子上的时钟听到他们应该像订单一样被枪杀
  • 搜索不工作,也没有从所有数据中显示订单,但它订购了当前页面数据
  • 很高兴看到我的回答 here 在这里有点帮助 :-)
  • 好的,让我看看,只是加载时间问题给你?
  • 另外,你能把我们上次讨论的网址贴出来吗?
猜你喜欢
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
相关资源
最近更新 更多