Как отсортировать немета-поле в панели администрации пользователей?

Вопрос или проблема

Я застрял и не смог найти ответ после долгих поисков.

Мне нужно изменить панель администратора пользователей, отображающую список пользователей и количество постов. У меня есть пользовательские посты (type=”articles”), поэтому по умолчанию ‘посты’ отображают только ноль.

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

Я могу заполнить мой новый столбец правильным количеством статей. У меня также есть это число, связанное со списком статей этого автора.

Единственное, что я не могу понять, это как отсортировать столбец. Я пробовал все способы, которые мог найти или придумать. Я просто не так глубоко разбираюсь в WordPress или SQL.

Я использую следующие фильтры.

// добавляем новый столбец
add_filter( 'manage_users_columns', 'my_users_articles_column' );
function my_users_articles_column( $columns ) {
  $columns['articles_count'] = 'Количество';
  return $columns;
}

// получаем значение для каждой строки
add_filter( 'manage_users_custom_column', 'my_users_articles_column_value', 10, 3 );
function my_users_articles_column_value( $value, $column_name, $id ) {
  if ( $column_name == 'articles_count' ) {
    $count = count_user_posts($id, 'articles');
    $link = '<a href="/wp-admin/edit.php?post_type=articles&author=" . $id . "">' . $count . '</a>';
    $return = ($count > 0) ? $link : $count;
    return $return;
  }
}

// делаем столбец сортируемым
add_filter( 'manage_users_sortable_columns', 'my_articles_count_column_sortable' );
function my_articles_count_column_sortable( $columns ) {
    $columns['articles_count'] = 'articles_count';
    return $columns;
}

Итак, после основного кода выше, у меня есть новый столбец для количества всех статей для каждого автора. И он кликабельный для сортировки, но сортировка происходит по имени автора (первый столбец), а не по моему количеству статей.

Я не могу найти способ, чтобы этот столбец сортировался. Фильтры/хуки, которые я пробовал, включают ‘pre_get_users’, ‘pre_user_query’, ‘request’ и другие. Не уверен, какой из них правильный фильтр. Но я не думаю, что у меня правильный способ сортировки в любом случае.

Столбец не является мета-полем. Он заполнен из запроса. Я попробовал что-то типичное, как ниже, но это не работает.

add_filter('pre_get_users', 'my_pre_get_users');
function my_pre_get_users( $vars ) {
    if ( 'article_count' == $vars['orderby'] ) {
        $vars['meta_key'] = 'article_count';
        $vars['orderby'] = 'meta_value_num';
    }
    return $vars;
}

На данный момент я могу только догадываться, что мне нужно объединять таблицы, но это выходит за пределы моих навыков программирования. Я мог бы продолжать “взламывать” это бесконечно на этом этапе.

Я следил за ответами в нескольких статьях, таких как:

WP_User_Query::parse_orderby() на самом деле поддерживает сортировку по количеству постов, но поскольку WP_User_Query::parse_orderby() ограничивает то, по каким пользователям можно сортировать, осуществить пользовательскую сортировку – это немного хака.

Вот обходной путь, который я создал (полу-тестированный):

add_filter( 'manage_users_sortable_columns', static function ( $columns ) {
    $columns['articles_count'] = array(
        'articles_count',
        false,
        __( 'Статьи' ),
        __( 'Таблица упорядочена по количеству статей.' ),
    );

    return $columns;
} );

/**
 * Поскольку `parse_orderby()` отбросит 'articles_count',
 * установите его на `post_count` и создайте переменную пользовательского запроса для
 * обратной ссылки позже.
 */
add_action( 'pre_get_users', static function ( $query ) {
    if ( 'articles_count' !== $query->get( 'orderby' ) ) {
        return;
    }

    $query->set( 'orderby', 'post_count' );
    $query->set( 'sort_articles_count', true );
} );

/**
 * Проверяем нашу пользовательскую переменную запроса и изменяем SQL
 * для сортировки пользователей.
 */
add_action( 'pre_user_query', static function ( $query ) {
    if ( ! $query->get( 'sort_articles_count' ) ) {
        return;
    }

    $search  = get_posts_by_author_sql( 'post' );
    $replace = get_posts_by_author_sql( 'articles' );

    $query->query_from = str_replace( $search, $replace, $query->query_from );
} );

Ответ или решение

Для того чтобы сортировать колонку, содержащую количество статей пользователей в админ-панели WordPress, вам нужно будет внести некоторые изменения в код, который вы уже написали. Приведу полный пример кода на PHP, который поможет решить вашу задачу. Обратите внимание, что для выполнения сортировки по количеству статей необходимо подменить SQL-запрос в функции pre_user_query.

Вот шаги, которые вам нужно выполнить:

  1. Добавление колонки для количества статей:
add_filter( 'manage_users_columns', 'my_users_articles_column' );
function my_users_articles_column( $columns ) {
    $columns['articles_count'] = 'Count';
    return $columns;
}
  1. Заполнение колонки значениями:
add_filter( 'manage_users_custom_column', 'my_users_articles_column_value', 10, 3 );
function my_users_articles_column_value( $value, $column_name, $id ) {
    if ( $column_name == 'articles_count' ) {
        $count = count_user_posts($id, 'articles');
        $link = '<a href="/wp-admin/edit.php?post_type=articles&amp;author=' . $id . '">' . $count . '</a>';
        return ($count > 0) ? $link : $count;
    }
    return $value;
}
  1. Сделать колонку сортируемой:
add_filter( 'manage_users_sortable_columns', 'my_articles_count_column_sortable' );
function my_articles_count_column_sortable( $columns ) {
    $columns['articles_count'] = 'articles_count';
    return $columns;
}
  1. Настройка сортировки:
add_action( 'pre_get_users', 'my_pre_get_users' );
function my_pre_get_users( $query ) {
    if ( 'articles_count' === $query->get('orderby') ) {
        $query->set('orderby', 'post_count'); // Сортируем по количеству постов
        $query->set('sort_articles_count', true); // Устанавливаем пользовательскую переменную
    }
}
  1. Изменение SQL-запроса для сортировки:
add_action( 'pre_user_query', 'my_pre_user_query' );
function my_pre_user_query( $query ) {
    if ( !$query->get('sort_articles_count') ) {
        return;
    }

    // Получаем SQL-выражение для постов
    $search  = get_posts_by_author_sql( 'post' );
    $replace = get_posts_by_author_sql( 'articles' );

    // Меняем внутренний SQL-запрос, чтобы он сортировал по количеству статей
    $query->query_from = str_replace( $search, $replace, $query->query_from );
}

Объяснение:

  • Мы добавили новый столбец в админ-панели пользователей и заполнили его количеством статей.
  • Сделали столбец сортируемым, добавив его в массив сортируемых столбцов.
  • Затем, в функции pre_get_users, если запрашивается сортировка по количеству статей, мы перенаправляем сортировку на стандартный подсчет постов.
  • Наконец, в функции pre_user_query мы подменяем SQL-запрос, чтобы вместо стандартного post использовать articles, тем самым обеспечивая сортировку по количеству статей каждого пользователя.

Заключение:

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

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

Капча загружается...