Wordpress: сортировка по умолчанию по столбцу пользовательского типа сообщения

У меня есть настраиваемый тип сообщения, называемый Contact, с настраиваемыми полями, такими как имя, фамилия, номер телефона и т.д.

В разделе admin они отсортированы в хронологическом порядке, я думаю, но мне нужно, чтобы они сортировались по фамилии по умолчанию.

Я прочитал здесь все другие решения, и никто из них не работает, в том числе:

function set_post_order_in_admin( $wp_query ) {
global $pagenow;
  if ( is_admin() && 'edit.php' == $pagenow && !isset($_GET['orderby'])) {
    $wp_query->set( 'orderby', 'surname' );
    $wp_query->set( 'order', 'ASC' );
  }
}
add_filter('pre_get_posts', 'set_post_order_in_admin' );

Но в любом поле, которое я пытаюсь сортировать, ничего не меняется, кроме переключения ASC/DESC, похоже, меняется на обратное хронологическое упорядочение.

Что я делаю неправильно?

Ответ 1

См. ниже решения,

function wpa84258_admin_posts_sort_last_name( $query ){
    global $pagenow;
    if( is_admin()
        && 'edit.php' == $pagenow
        && !isset( $_GET['orderby'] )
        && !isset( $_GET['post_type'] ) ){
            $query->set( 'meta_key', 'last_name' );
            $query->set( 'orderby', 'meta_value' );
            $query->set( 'order', 'ASC' );
    }
}
add_action( 'pre_get_posts', 'wpa84258_admin_posts_sort_last_name' );

ИЛИ отправьте это решение

Ответ 2

Заменить

 $wp_query->set( 'orderby', 'surname' );
 $wp_query->set( 'order', 'ASC' );

С

$query->set( 'meta_key', 'surname' ); // name of your post meta key
$query->set( 'orderby',  'meta_value'); // meta_value since it is a string

Это может помочь

Ответ 3

Я разработчик drupal и не имею возможности играть с WordPress. У нас была та же проблема, и именно так мы ее исправили.

Получите данные пользовательского типа контента (либо WP default api, либо пользовательский запрос), это будет массив объектов. Сортируйте их, используя функцию ниже. Возвращает отсортированный массив сообщений. Не уверен, в каком увлечении вам нужно реализовать это в wordpress.

/**
 *  Function to sort array by key
 *  sortArrayByKey($yourArray,"name",true); //String sort (ascending order)
 *  sortArrayByKey($yourArray,"name",true,false); //String sort (descending order)
 *  sortArrayByKey($yourArray,"id"); //number sort (ascending order)
 *  sortArrayByKey($yourArray,"count",false,false); //number sort (descending order)
 */

function sortArrayByKey(&$array, $key, $string = false, $asc = true)
{
    if ($string) {
        usort($array, function ($a, $b) use (&$key, &$asc) {
            if ($asc) return strcmp(strtolower($a{$key}), strtolower($b{$key}));
            else        return strcmp(strtolower($b{$key}), strtolower($a{$key}));
        });
    } else {
        usort($array, function ($a, $b) use (&$key, &$asc) {
            if ($a[$key] == $b{$key}) {
                return 0;
            }
            if ($asc) return ($a{$key} < $b{$key}) ? -1 : 1;
            else     return ($a{$key} > $b{$key}) ? -1 : 1;

        });
    }
}

а затем в вашем крюке вы можете вызвать эту функцию

 return $this->sortArrayByKey($posts, "surname");

Функция, скопированная из этого ответа: fooobar.com/info/18951/...