I am displaying one custom column called company name
in default user listing page. Now i want to filter that user listing page by that column name company name
. How i can add my custom filter (one of meta_key
) to filter default listing of user by using my column. Please find image for more clarity -
//Code to filter user list by Status
function admin_users_filter( $query ){
global $pagenow,$wp_query;
if ( is_admin() && $pagenow=='users.php' && isset($_GET['abc']) && $_GET['abc'] != '') {
$query->search_term = urldecode($_GET['abc']);
global $wpdb;
if (!is_null($query->search_term)) {
$query = $wpdb->get_results( " SELECT DISTINCT account_status FROM wp_custom_user_details ORDER BY account_status ASC " );
}
}
}
add_filter( 'pre_user_query', 'admin_users_filter' );
add_action( 'restrict_manage_users', 'restrict_abc_manage_list' );
function restrict_abc_manage_list()
{
?>
<select name="abc" style="float: none;">
<option value=""><?php _e('Filter By Status', 'baapf'); ?></option>
<option value="1">Active</option>
<option value="2">Inactive</option>
</select>
<input id="post-query-submit" class="button" type="submit" value="Filter" name="">
<?php
}
I am using the admin_init hook to load a function that creates a class for adding a sorting columns in the admin :) Drop it in functions.php in your theme file.
if(!function_exists("load_sortable_user_meta_columns")){
add_action('admin_init', 'load_sortable_user_meta_columns');
function load_sortable_user_meta_columns(){
//THIS IS WHERE YOU ADD THE meta_key => display-title values, you can add multiple args, ex: array('company'=>'Company', 'user_registered'=>'Date Registered');
$args = array('company'=>'Company');
new sortable_user_meta_columns($args);
}
}
if(!class_exists("sortable_user_meta_columns")):
class sortable_user_meta_columns{
var $defaults = array('nicename', 'email', 'url', 'registered','user_nicename', 'user_email', 'user_url', 'user_registered','display_name','name','post_count','ID','id','user_login');
//By things in user_meta
function __construct($args){
$this->args = $args;
add_action('pre_user_query', array(&$this, 'query'));
add_action('manage_users_custom_column', array(&$this, 'content'), 10, 3);
add_filter('manage_users_columns', array(&$this, 'columns'));
add_filter( 'manage_users_sortable_columns', array(&$this, 'sortable') );
}
function query($query){
$vars = $query->query_vars;
if(in_array($vars['orderby'], $this->defaults)) return;
$title = $this->args[$vars['orderby']];
if(!empty($title)){
$query->query_from .= " LEFT JOIN bib_usermeta m ON (bib_users.ID = m.user_id AND m.meta_key = '$vars[orderby]')";
$query->query_orderby = "ORDER BY m.meta_value ".$vars['order'];
}
}
function columns($columns) {
foreach($this->args as $key=>$value){
$columns[$key] = $value;
}
return $columns;
}
function sortable($columns){
foreach($this->args as $key=>$value){
$columns[$key] = $key;
}
return $columns;
}
function content($value, $column_name, $user_id) {
$user = get_userdata( $user_id ); //Get the content of the custom meta
return $user->$column_name; //Get the custom meta. Eg: Company
}
}
endif;
This example will work if you meta_key is 'company' if it's 'company_name' you'll have to change it in $args. eg: $args = array('company_name' => 'Company Name');
:)
Mr. Eek have given the solution to add custom column in users list. so i am giving how to add filter for 'Company' option .the code is given
function admin_users_filter( $query ){
global $pagenow,$wp_query;
if ( is_admin() && $pagenow=='users.php' && isset($_GET['abc']) && $_GET['abc'] != '') {
$query->search_term = urldecode($_GET['abc']);
global $wpdb;
if (!is_null($query->search_term)) {
$query->query_from .= " INNER JOIN {$wpdb->usermeta} ON " .
"{$wpdb->users}.ID={$wpdb->usermeta}.user_id AND " .
"{$wpdb->usermeta}.meta_key='meta_key_name_here' AND "."{$wpdb->usermeta}.meta_value LIKE '%{$query->search_term}%'";
}
}
}
add_filter( 'pre_user_query', 'admin_users_filter' );
add_action( 'restrict_manage_users', 'restrict_abc_manage_list' );
function restrict_abc_manage_list()
{
?>
<select name="abc" style="float: none;">
<option value=""><?php _e('Filter By College', 'baapf'); ?></option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<input id="post-query-submit" class="button" type="submit" value="Filter" name="">
<?php
}
find any doubt then ask...thxs
Be careful. "restrict_manage_users" hook doesn't work properly in WordPress4.4 or above. (There's the same issue in latest 4.8)
The solution is bellow. http://www.linsoftware.com/using-the-restrict_manage_users-action-hook-in-wordpress-4-4/