web-dev-qa-db-ja.com

カスタムユーザー管理ページの変更

'sers'の下にサブメニューページを作成しようとしていますが、これは 'All Users'ページに似ていますが、特定の役割のユーザーのみを一覧表示する場合です。このサブメニューページを'Customer'と呼びましょう。

これまで、独自の列を使用して列を作成することができましたが、内容をより関連性のあるものにするを変更することができなかったことがまだいくつかあります。

Custom User Page

これが私がする必要があることです:

  1. サブメニュー名を反映するためにページタイトルを変更するにはどうすればよいですか。この場合は 'Customer'です。
  2. (a)リストの上のリンクをフィルタして、 'All'、 'Subscriber'、および 'Pending'のみを変更するにはどうすればよいですか。 (b)また、'ロールを..に変更'ドロップダウンメニュー _?
  3. フィルタリンク'All'から 'Customer'ページへの移動 _(カスタムユーザーページ)を変更する方法を教えてください。
  4. 表示されている現在のページを示すために'Customer'サブメニューからhiliteへのリンクを作成するにはどうすればよいですか?

注意:
したがって、デフォルトの 'All Users'ページは、フィルタリンクの観点から、このページの反対側になります。

上記のページを作成した方法は、おおまかに次のとおりです。

/* Create new user submenu with custom parameter in slug */
add_action('admin_menu', 'my_custom_user_submenu');
function my_custom_user_submenu() {
    add_users_page(
        'Customer',
        'Customer',
        list_users,
        'users.php?user=custom'
    );
}

/* Filter users according to the users list page */
add_action('pre_user_query','my_user_customer_list');
function my_user_customer_list($user_search) {

    $user = $_GET['custom'];
    $role = $_GET['role'];

    if ( $user == 'custom' OR $role == 'subscriber' OR $role == 'pending' ) {

        global $wpdb;

        /* For Customers Page:
         * Get only 'Subscriber' & 'Pending' users
         * */
        $user_search->query_where = 
        str_replace('WHERE 1=1', 
                "WHERE 1=1 AND {$wpdb->users}.ID IN (
                    SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                        WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}user_level' 
                        AND {$wpdb->usermeta}.meta_value = 0)", 
                $user_search->query_where
        );

    } else {

        global $wpdb;

        /* For User Admin Page:
         * Get all apart from 'Subscriber' & 'Pending' users
         * */
        $user_search->query_where = 
        str_replace('WHERE 1=1', 
                "WHERE 1=1 AND {$wpdb->users}.ID IN (
                    SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                        WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}user_level' 
                        AND {$wpdb->usermeta}.meta_value >= 1)", 
                $user_search->query_where
        );

    }
}
3
Giraldi

これが私がどうやってページを修正したかです。 サブメニューを強調表示するのために、私はそれを理解することができなかったので、私はjQueryに頼ります.

これがコードです:

/* - Set user filter links according to users pages
 * - Set Role Change dropdown menu
 * */
function custom_user_filter_links( $views ) {

  global $wp_roles; // For Role Change dropdown menu

  $amt       = count_users();
  $amtCustom = $amt['avail_roles']['subscriber'] + $amt['avail_roles']['pending']; // Count custom users

  if ( $_GET['user'] == 'custom' || $_GET['role'] == 'subscriber' || $_GET['role'] == 'pending' ) {

    /* For Customers Page: */

    /* Modify url & users count for the 'All' link */
    $all = preg_replace( '/(.*\.php)(.*\().*(\).*)/', '$1?user=custom${2}'.$amtCustom.'$3', $views['all'] );

    /* Show only 'Subscriber' & 'Pending' user links */
    $arr = array();
      $arr['all']          = $all;
      if ($views['subscriber'])
        $arr['subscriber'] = $views['subscriber'];
      if ($views['pending'])
        $arr['pending']    = $views['pending'];
    $views = $arr;

    /* Modify Role Change dropdown menu */
    $arr = array();
      $arr['subscriber'] = $wp_roles->roles['subscriber'];
      $arr['pending']    = $wp_roles->roles['pending'];
    $wp_roles->roles = $arr;

  } else {

    /* For User Admin Page: */

    /* Modify users count for the 'All' link*/
    $views['all'] = preg_replace( '/(.*\().*(\).*)/', '${1}'.($amt['total_users'] - $amtCustom).'$2', $views['all'] );

    /* Remove 'Subscriber' & 'Pending' user links  */
    unset($views['subscriber']);
    unset($views['pending']);

    /* Modify Role Change dropdown menu */
    unset ( $wp_roles->roles['subscriber'] );
    unset ( $wp_roles->roles['pending'] );

  }

  return $views;
}
add_filter( 'views_users', 'custom_user_filter_links' );


/* - Highlight custom submenu
 * - Change titles of custom Users Manage & Edit pages
 * */
function submenu_hilite_n_rename_title() {

  global $current_screen;

  // If not in specified pages than discontinue
  if( !($current_screen->base == 'users' || $current_screen->base == 'user-edit') )
      return;

  global $title;

  if ($current_screen->base == 'user-edit') {
    /* For Edit User page */
    $user  = get_user_by('id', $_GET['user_id']);
    $role  = $user->roles[0];
    $title = 'Edit Customer'; /* Change page title */
  } else {
    /* For Manage Users page */
    $role  = $_GET['role'];
    $title = 'Customers'; /* Change page title */
  }

  switch (true) {
    case $_GET['user'] == 'custom'      :
    case $role         == 'subscriber'  :
    case $role         == 'pending'     :
      ?>
      <script type="text/javascript">
        jQuery(document).ready( function($) {
          var reference = $('a[href$="user=custom"]').parent();

          // Highlight custom submenu
          reference.addClass('current');

          // Remove highlight from default menu
          reference.parent().find('li:first').removeClass('current');             
        });     
      </script>
      <?php
      break;
  }

}
add_action('admin_head', submenu_hilite_n_rename_title);
3
Giraldi