Сортировка таблицы списков типов сообщений по отображаемому имени идентификатора пользователя, хранящегося в качестве значения посылки

У меня есть пользовательский тип сообщения с именем domicile . Каждый пост (домициль) имеет владельца (а не автора ). Владельцы – это пользовательская роль. Я сохраняю идентификатор пользователя как мета-значение сообщения ( dmb_owner ) для типа почтового dmb_owner .

Как сортировать таблицу списка ( wp-admin/edit.php?post_type=domicile ) с помощью отображаемых имен владельцев?

Соответствующий код из моего класса, setup_columns() вызывается в init :

 /** * Manage columns for List Table. * * @wp-hook init * @return void */ protected function setup_columns() { add_filter( "manage_edit-{$this->post_type}_columns", array ( $this, 'set_column_header' ) ); add_action( "manage_{$this->post_type}_posts_custom_column", array ( $this, 'render_columns' ), 10, 2 ); add_filter( "manage_edit-{$this->post_type}_sortable_columns", array ( $this, 'set_sortable_columns' ) ); add_filter( 'request', array ( $this, 'prepare_orderby' ) ); } /** * Register column headers. * * @wp-hook manage_edit-{$this->post_type}_columns * @param array $columns * @return array */ public function set_column_header( $columns ) { unset ( $columns['author'], $columns['comments'], $columns['date'] ); $columns['owner'] = __( 'Owner', 't5_domicile_manager' ); return $columns; } /** * Display cell content. * * @wp-hook manage_{$this->post_type}_posts_custom_column * @param string $column_name * @param int $post_id * @return void */ public function render_columns( $column_name, $post_id = 0 ) { if ( 'owner' === $column_name ) { $owner_id = get_post_meta( $post_id, 'dmb_owner', TRUE ); if ( $owner_id ) { $owner = get_user_by( 'id', $owner_id ); print $owner ? $owner->display_name : '<i>not set</i>'; } } } /** * Register sortable columns * * @wp-hook manage_edit-{$this->post_type}_sortable_columns * @param array $columns * @return array */ public function set_sortable_columns( $columns ) { $columns['owner'] = 'owner'; return $columns; } /** * Set custom sort order. * * @wp-hook request * @param array $vars * @return array */ public function prepare_orderby( $vars ) { if ( isset ( $vars['orderby'] ) && 'owner' == $vars['orderby'] ) { $vars = array_merge( $vars, array ( 'meta_key' => 'dmb_owner', 'orderby' => 'meta_value_num' ) ); } return $vars; } 

Это … работает, но это явно неправильно, потому что он сортируется по сохраненному идентификатору. Мне нужно отфильтровать запрос, но я не уверен, как именно я должен это делать.

Извините за заголовок, но я хочу убедиться, что это будет найдено. Я искал очень тяжело и не нашел ничего полезного.

«Легкое», но не очень хорошее решение – хранить отображаемое имя пользователя, а также идентификатор, и сортировать по нему. Очевидно, что обновление отображаемого имени пользователя предложит обновление всего места жительства, которое принадлежит пользователю.

В качестве альтернативы нижеследующее представляет собой схему (непроверенную) того, что должно работать. Идея состоит в том, чтобы сообщить WordPress о необходимости сортировать по мета-значению (чтобы WordPress присоединился к post_clauses post), а затем ее можно использовать фильтр post_clauses для присоединения к таблице users и сортировки по отображаемому имени:

 add_filter('posts_clauses', 'wpse58638_post_clauses',10,2); function wpse58638_post_clauses( $clauses, $query ) { global $wpdb; if ( ! $query->is_main_query() || ! is_admin() || ! $query->get('post_type') == 'domicile' || ! $query->get('meta_key') == 'dmb_owner' || ! $query->get('orderby') == 'meta_value_num' ){ return $clauses; } //Get sort order $order_dir = $query->get('order'); $order_dir = ('asc' == $order_dir ? 'ASC' : 'DESC'); //Join user table onto the postmeta table $clauses['join'] .= " LEFT JOIN {$wpdb->users} ON {$wpdb->prefix}postmeta.meta_value={$wpdb->users}.ID"; //Replace orderby $clauses['orderby'] = " {$wpdb->users}.display_name $order_dir"; return $clauses; } 

Вы можете добавить настраиваемое поле dmb_owner к запросу в бэкэнд, а затем вы можете фильтровать об этом со стандартными фильтрами.

 add_filter( 'query_vars', 'fb_query_vars_admin' ); /** * If needed: Allow meta queries in the admin */ function fb_query_vars_admin( $query_vars ) { // break off, if not in admin area if ( ! is_admin() ) return $query_vars; $query_vars[] = 'dmb_owner'; // my key of custom field //$query_vars[] = 'meta_value'; // my value of custom field return $query_vars; } 

Теперь это настраиваемое поле внутри $query_vars и может использоваться, например, ваш метод prepare_orderby() .