用户面板(users.php)中可排序的自定义列?


8

我正在使用Register Plus Redux插件来添加具有自定义元数据字段的注册表单。这些字段显示在每个用户记录详细信息页面的底部,可以使用get_the_author_meta进行检索。

另外,我能够在“用户”面板(列表视图)中创建列,并使这些列可排序。问题是,当我单击自定义列标题时,URL中的orderby =值似乎被忽略了。换句话说,似乎生成用户列表视图的查询不包括自定义元数据(例如,如果元数据不在用户数据的通常位置,则可能需要加入语句)。感觉我错过了一步。

这是我创建自定义列的代码:

//add columns to User panel list page
function add_user_columns( $defaults ) {
     $defaults['company'] = __('Company', 'user-column');
     $defaults['title'] = __('Title', 'user-column');
     return $defaults;
}
function add_custom_user_columns($value, $column_name, $id) {
      if( $column_name == 'company' ) {
        return get_the_author_meta( 'company_name', $id );
      }
      if( $column_name == 'title' ) {
        return get_the_author_meta( 'titlefunction', $id );
      }
}
add_action('manage_users_custom_column', 'add_custom_user_columns', 15, 3);
add_filter('manage_users_columns', 'add_user_columns', 15, 1);`

这是使这些列可排序的代码:

function user_sortable_columns( $columns ) {
    $columns['company'] = 'Company';
    return $columns;
}
add_filter( 'manage_users_sortable_columns', 'user_sortable_columns' );

function user_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'company' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => 'company',
            'orderby' => 'meta_value',
            'order'     => 'asc'
        ) );
    }
    return $vars;
}
add_filter( 'request', 'user_column_orderby' );`

有什么想法可以更新生成用户列表的查询,使其包括按我的自定义字段进行排序?或者,如果这不是问题,那么如何使自定义列标题在单击时对用户列表进行排序?

谢谢。


见博客tekina.info/...详细解释
Aniket辛格

Answers:


6

我的第一个答案是完全不合时宜的,我正在完全重写它...

但是由于Milo的提示,我在这里找到了解决方案:http :
//wordpress.mcdspot.com/2011/05/24/search-admin-user-list-on-first-and-last-names/

修改后,它对我来说适用于'facebook'和'twitter' author_meta

add_action('pre_user_query','wpse_27518_pre_user_query');
function wpse_27518_pre_user_query($user_search) {
    global $wpdb,$current_screen;

    if ( 'users' != $current_screen->id ) 
        return;

    $vars = $user_search->query_vars;

    if('facebook' == $vars['orderby']) 
    {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
    } 

    elseif ('twitter' == $vars['orderby']) 
    {
        $user_search->query_from .= " INNER JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='twitter')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
   }
}

1

我不确定是否可以,可能是通过修改查询pre_user_query。这是查看其内容的快速而肮脏的功能:

add_action('pre_user_query', 'my_user_query');
function my_user_query($userquery){
    print_r($userquery);
    die();
}

pre_user_query输出为:WP_User_Query对象([结果] => [总用户] => 0 [query_fields] => SQL_CALC_FOUND_ROWS wp_users.ID [query_from] => FROM wp_users [query_where] => WHERE 1 = 1 [query_orderby] => ORDER通过user_login ASC [query_limit] => LIMIT 20 [query_vars] =>数组([blog_id] => 1 [role] => [meta_key] => [meta_value] => [meta_compare] => [include] => Array( )[排除] =>数组()[搜索] => [orderby] =>公司[order] => ASC [offset] => 0 [number] => 20 [count_total] => 1 [fields] => all_with_meta [谁=>))。我将如何修改此查询,例如加入数据库表?
FredHead 2011年

@FredHead,如果要发布很多代码,则可以考虑使用pastebin,snipplr或类似的东西。
杰里米·贾里德

@FredHead-老实说,我不知道。我可以稍后尝试修改它,或者希望一些更有经验的用户可以对此有所了解。
米洛(Milo)

抱歉,尝试响应,但在Firefox中阻止了在Th / Fri上提交,却收到了难以理解的与评论相关的错误消息。
FredHead 2011年

让我们再试一次:Milo,您的回答至少使我陷入了困境,谢谢。现在,我需要了解是否/如何适应用户查询。也许有人可以帮助我理解问题的那一部分?杰里米,我发现此评论界面难以使用(按Enter键=提交评论),否则我会将输出代码移到其他地方。抱歉。
FredHead 2011年

1

我认为最简单的方法是:

<?php

/**
 * Sorting logic for custom columns on WP user table
 */
add_action('pre_user_query', function(WP_User_Query $query) {
  global $wpdb, $current_screen;

  // Bail if viewing anything other than user list in WP Admin
  if ( 'users' != $current_screen->id ) {
    return;
  }

  if ( 'company' === $query->query_vars['orderby'] ) {
    $query->orderby = 'meta_value';
    $query->meta_key = 'company_name';
  }

  else if ( 'title' === $query->query_vars['orderby'] ) {
    $query->orderby = 'meta_value';
    $query->meta_key = 'titlefunction';
  }

}, 10, 1);

1

如果您的元值未完全填充(具有null),则@brasofilo的出色答案将生成一个用户列表,该列表将忽略缺少meta_values值的用户。

修复很容易。只要做一个左加入

add_action('pre_user_query','wpse_27518_pre_user_query');
function wpse_27518_pre_user_query($user_search) {
    global $wpdb,$current_screen;

    if ( 'users' != $current_screen->id ) 
        return;

    $vars = $user_search->query_vars;

    if('facebook' == $vars['orderby']) 
    {
        $user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
    } 

    elseif ('twitter' == $vars['orderby']) 
    {
        $user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='twitter')"; 
        $user_search->query_orderby = ' ORDER BY UPPER(m1.meta_value) '. $vars['order'];
   }
}

$user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='facebook')";


-1

我可以使用您发布的代码和钩子来实现用户对自定义列的排序,除了我不使用“请求”过滤器,也不需要额外的“ orderby”功能。在我的情况下,WordPress会根据我在'manage_users_custom_column'操作回调中返回的数值,对自定义列中的数据进行正确排序。


凉。您能为我/每个人发布更新的代码吗?谢谢!
FredHead
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.