ユーザーパネル(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 Singh 2017

回答:


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の出力は、次のとおりです。 BY user_login ASC [query_limit] => LIMIT 20 [query_vars] => Array([blog_id] => 1 [role] => [meta_key] => [meta_value] => [meta_compare] => [include] => Array( )[exclude] =>配列()[search] => [orderby] => Company [order] => ASC [offset] => 0 [number] => 20 [count_total] => 1 [fields] => all_with_meta [誰] =>))。このクエリをどのように変更しますか(dbテーブルへの結合など)。
FredHead、2009

@FredHead、大量のコードを投稿する場合は、pastebin、snipplr、または類似のコードの使用を検討してください。
Jeremy Jared

@FredHead-正直なところ、わかりません。私は後でそれを使ってハックしようとするか、うまくいけば、より経験豊富なユーザーがそれに光を当てることができます。
Milo、2011

申し訳ありませんが、返信しようとしましたが、Chrome、Firefoxでコメント関連の不可解なエラーメッセージが表示され、Th / Friでの送信ができませんでした。
FredHead、2011

もう一度試してみましょう。ミロ、あなたの答えは少なくとも私を野球場に連れて行ってくれます。ありがとう。ここで、userqueryを適合させるかどうか、またはどのように適合させるかを理解する必要があります。多分誰かが問題のその部分を理解するのを手伝ってくれる?ジェレミー、このコメントインターフェイスは使いにくい(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値のないユーザーを除外するユーザーリストを生成します。

ただし、修正は簡単です。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')";


-1

'request'フィルターを使用せず、追加の 'orderby'関数も必要なかった場合を除いて、投稿したコードとフックを使用してカスタム列のユーザーソートを実現できました。Wordpressは、私の場合、「manage_users_custom_column」アクションコールバックで返す数値によって、カスタム列のデータを適切にソートします。


涼しい。更新されたコードを私/全員に投稿していただけませんか?ありがとうございました!
FredHead
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.