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

时间:2011-09-02 作者:FredHead

我正在使用Register Plus Redux插件用自定义元数据字段扩充注册表。这些字段显示在每个用户记录详细信息页面的底部,可以使用get\\u the\\u author\\u meta检索这些字段。

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

以下是创建自定义列的代码:

//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\' );`
有什么想法可以更新生成用户列表的查询,使其包含按自定义字段排序的内容吗?或者,如果这不是问题所在,那么如何使自定义列标题在单击时对用户列表进行排序?

非常感谢。

5 个回复
SO网友:brasofilo

我的第一个答案完全不符合要求,我正在重写它。。。

但多亏了米洛的提示,我在这里找到了解决方案:
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\'];
   }
}

SO网友:Milo

我不确定这是否可能,也许可以通过以下方式修改查询pre_user_query. 这里有一个快速而脏的函数来查看其内容:

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

SO网友:Ahrengot

在我看来,最简单的方法是:

<?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);

SO网友:David Roth

如果您的meta值没有完全填充(有空值),@brasofilo的优秀答案将生成一个用户列表,其中会忽略缺少meta\\u值的用户。

然而,修复很容易。只要做一个LEFT JOIN:

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\')";

SO网友:ricosrealm

我能够使用您发布的代码和挂钩实现自定义列的用户排序,但我没有使用“请求”过滤器,也不需要额外的“orderby”函数。Wordpress根据我在“manage\\u users\\u custom\\u column”操作回调中返回的数值对自定义列中的数据进行正确排序。

结束

相关推荐