Создание колонки с произвольным полем и сортировка записей по его значению

На скриншоте ниже наглядный пример того, что у нас должно будет в результате получиться.

Сортируем записи по произвольному полю в админке WP

В качестве произвольного поля я взял количество просмотров записи, ну, и если вы кликнете по заголовку таблицы «Просмотры», то посты соответственно будут сортироваться по возрастанию или убыванию просмотров (если кликнуть второй раз).

Другие фильтры записей при этом будут работать как и полагается (в моём случае это фильтр по месяцам, рубрикам + постраничная навигация, когда записей станет много).

В этой статье я хочу разобрать всё ну очень подробно, поэтому если что-то вам кажется пустяковым — просто переходите к следующей главе.

Создание произвольного поля

Тут есть два варианта.

  1. Если вы создаёте что-то с нуля, то вы можете добавить просмотры при помощи стандартного метабокса «Произвольные поля».
    Добавление произвольного поля в WordPress
  2. Либо для удобства вы можете добавить свой собственный метабокс, в котором можно указать просмотры, про метабоксы подробно тут.

Добавление колонки

Про колонки уже подробно было рассмотрено здесь, поэтому сейчас вкратце. Вставляете этот код в ваш functions.php, после чего колонка должна будет появиться (но пока что без возможности сортировки).

add_filter( 'manage_edit-post_columns', 'true_add_post_columns_2', 10, 1 ); // manage_edit-{тип поста}_columns, то есть вы можете добавлять колонку не только для записей
add_action( 'manage_posts_custom_column', 'true_fill_post_columns_2', 10, 1 );
 
/* добавление колонки */
function true_add_post_columns_2( $my_columns ){
    $my_columns['prosmort'] = 'Просмотры';
    return $my_columns;
}
 
/* заполнение колонки */
function true_fill_post_columns_2( $column ) {
    global $post;
    switch ( $column ) {
        case 'prosmort':
            echo ( $x = get_post_meta($post->ID, 'prosmort', true) ) ? $x : 0; // это простое условие, если произвольного поля не существует, то выводим 0
            break;
    }
}

В результате у меня получилось:

Добавление колонки с просмотрами к записям.

Посты пока что не сортируются, но мы это сейчас поправим.

Сортировка по произвольному полю

Отправляем следом в functions.php код:

add_filter( 'manage_edit-post_sortable_columns', 'true_sort_prosmotr' ); // manage_edit-{тип поста}_sortable_columns
add_action( 'pre_get_posts', 'true_orderby_prosmotr' );
 
function true_sort_prosmotr( $columns ) {
    $columns['prosmort'] = 'views'; //  $columns['ID колонки'] = 'Значение параметра orderby'
 
    //Кстати, здесь вы также можете сделать любую колонку несортируемой, просто удалите её из массива
    //unset($columns['date']);
 
    return $columns;
}
 
function true_orderby_prosmotr( $query ) {
 
    // так как сортировка будет осуществляться только в админке
    if( ! is_admin() )
        return;
 
    $orderby = $query->get( 'orderby');
 
    if( 'views' == $orderby ) { // 'views' - параметр в GET-запросе
        $query->set('meta_key','prosmort'); // 'prosmort' - название произвольного поля
        $query->set('orderby','meta_value_num'); // если сортировка не по числовому значению, а по алфавиту, замените на 'meta_value'
    }
}

И результат:

Сортируем записи по произвольному полю в админке WP

Источник: misha.blog

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: