Сортировка пользовательских типов сообщений по фамилии в бэкэнд

У меня есть пользовательский тип сообщения, называемый speakers , где заголовок сообщения – это имя первого и последнего ораторов. Я создал его с помощью этого кода:

 add_action( 'init', 'create_post_type' ); function create_post_type() { register_post_type( 'speaker', array( 'labels' => array( 'name' => __( 'Speakers' ), 'singular_name' => __( 'Speaker' ) ), 'public' => true, 'has_archive' => true, 'supports' => array('title','editor','thumbnail'), ) ); } 

Мне удалось успешно отсортировать их в моей wp_query с помощью @birgire, добавив это в мои functions.php Php:

 function posts_orderby_lastname ($orderby_statement) { $orderby_statement = "RIGHT(post_title, LOCATE(' ', REVERSE(post_title)) - 1) ASC"; return $orderby_statement; } 

и затем добавление фильтра перед моим запросом.

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

Я попробовал это:

 function set_custom_post_types_admin_order($wp_query) { if (is_admin()) { // Get the post type from the query $post_type = $wp_query->query['post_type']; if ( $post_type == 'speaker') { if (!isset($_GET['orderby'])) { // 'orderby' value can be any column name $wp_query->set('orderby', 'title'); // 'order' value can be ASC or DESC $wp_query->set('order', 'ASC'); } } } } add_filter('pre_get_posts', 'set_custom_post_types_admin_order'); 

который сортируется по типу post вместо даты создания, но я не знаю, как он мог сортироваться по фамилии …

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

 /** * Override default- and title ordering in the backend, for the 'speaker' custom post type. * * @link https://wordpress.stackexchange.com/a/202154/26350 */ add_action( 'pre_get_posts', function( \WP_Query $q ) { if ( is_admin() && $q->is_main_query() && 'edit-speaker' === get_current_screen()->id && ( '' === $q->get( 'orderby' ) || 'title' === $q->get( 'orderby' ) ) ) { $q->set( 'orderby', 'wpse_last_word' ); $q->set( 'order', '' !== $q->get( 'order' ) ? $q->get( 'order' ) : 'ASC' ); } } ); 

где мы используем плагин из нашего последнего ответа для поддержки порядка wpse_last_word .