Итак, в первую очередь найдём WordPress hook, который отвечает за колонки в списках постов. Им будет 'manage_edit-{post_type}_columns'
. Вместо {post_type}
встявляем нужный нам Post Type. Это может быть как один из стандартных post, page
, так и любой другой пользовательский Post Type.
Hook мы уже знаем, остаётся навесить на него наш регистратор новой колонки, пока что обычной, не сортируемой. Возьмём post
для примера:
function my_column_register( $columns ) { $columns['my_column'] = __( 'My Column', 'my-plugin' ); return $columns; } add_filter( 'manage_edit-post_columns', 'my_column_register' );
Следующим шагом зарегистрируем новую колонку в WordPress как сортируемую. Для этого существует похожий hook 'manage_edit-{post_type}_sortable_columns'
:
function my_column_register_sortable( $columns ) { $columns['my_column'] = 'my_column'; return $columns; } add_filter( 'manage_edit-post_sortable_columns', 'my_column_register_sortable' );
Теперь наш WordPress знает о существовании новой колонки и о том, что она должна быть сортируемой и что принадлежит списку постов (post). Осталось научить WordPress отображать в этой колонке данные нужные нам и сортировать по этим данным.
Отобразим в колонке данные из мета-данных текущего поста:
function my_column_display( $column_name, $post_id ) { if ( 'my_column' != $column_name ) return; $data = get_post_meta($post_id, 'my_column', true); if ( !$data ) $data = '<em>' . __( 'No Data', 'my-plugin' ) . '</em>'; echo $data; } add_action( 'manage_posts_custom_column', 'my_column_display', 10, 2 );
Указываем системе как нужно сортировать эту колонку с помощью WordPress hook 'request'
:
function my_column_orderby( $vars ) { if ( isset( $vars['orderby'] ) && 'my_column' == $vars['orderby'] ) { $vars = array_merge( $vars, array( 'meta_key' => 'my_column', 'orderby' => 'meta_value' // Может быть meta_value_num если данные в поле являются числовыми. //Возможны и другие значения в зависимости от типа данных. Подробнее в сносках. ) ); } return $vars; } add_filter( 'request', 'my_column_orderby' );
Пример работоспособен, но для специфических задач, естественно, нужно шаманить.