Поле сортировки для произвольного типа записей
Есть ли способ добавить поле "order" (порядок), которое доступно для страниц, в произвольный тип записей?
Существует ли встроенная логика, которая предотвращает дублирование значений в поле "order"?
Идея заключается в том, чтобы иметь возможность сортировать записи произвольного типа сначала по порядку, заданному пользователем, а затем по алфавиту на основе строкового произвольного поля.

При объявлении вашего пользовательского типа записи с помощью функции register_post_type, необходимо добавить 'page-attributes' в поле supports, как в следующем примере:
register_post_type('myposttype', array(
'supports' => array('title', 'editor', 'page-attributes'),
'hierarchical' => false
));
Вам также нужно добавить любые другие поддерживаемые метабоксы в поле 'supports'. Подробнее о полях register_post_type можно узнать по ссылке: https://developer.wordpress.org/reference/functions/register_post_type/.
Насколько мне известно, не существует встроенного способа предотвратить дублирование порядка. Это связано с тем, что вы можете создавать под-упорядочивание на основе иерархии (таким образом, одна группа дочерних страниц может иметь порядок, отличный от другой).

использование page-attributes
отображает как поле order
, так и поле parent
. Как мне убрать поле parent
?

Моя ошибка, не понял, что вы также не хотите видеть родительские страницы. Обновлю свой ответ, чтобы исключить это.

Привет. У меня есть этот код, но я ничего не вижу:
```
// Пользовательский тип записи "Услуга" add_action( 'init', 'create_post_type' ); function create_post_type() {
$supports_args = array( 'title', 'editor', 'page-attributes' ); register_post_type( 'service', array( 'labels' => array( 'name' => ( 'Услуги' ), 'singular_name' => ( 'Услуга' ), 'supports' => $supports_args, 'hierarchical' => false ), 'public' => true, 'has_archive' => true, //'menu_position' => 2 ) ); }
```

@Sylar Понимаю, что очень поздно, но мне кажется, что 'supports' => $supports_args, 'hierarchical' => false находятся в неправильной части массива. В вашем примере они вложены в массив labels, а должны быть в основном массиве, на том же уровне, что и 'public' => true

В дополнение к ответу @Dave-Hunt вы также можете добавить фильтр, например следующий, чтобы определить пользовательский порядок — в данном случае алфавитный по заголовку. (Код предоставлен в блоге Марка Леонга.) Удалите проверку is_admin()
, если хотите применить ваш пользовательский order_by и на фронтенде.
function set_custom_post_types_admin_order($wp_query) { if (is_admin()) { // Получаем тип записи из запроса $post_type = $wp_query->query['post_type']; if ( $post_type == 'POST_TYPE') { // Значение 'orderby' может быть любым именем столбца $wp_query->set('orderby', 'title'); // Значение 'order' может быть ASC или DESC $wp_query->set('order', 'ASC'); } } } add_action('pre_get_posts', 'set_custom_post_types_admin_order');
Обновление
Для предварительной проверки перед сохранением см. этот ответ: https://wordpress.stackexchange.com/a/40095/4645, где обсуждаются ваши варианты. В основном всё сводится к использованию пользовательского jQuery, так как в WordPress нет хуков для предварительного сохранения.
Также (повторяю свой предыдущий комментарий здесь для дальнейшего использования) вот как можно сделать поле 'menu order' доступным для редактирования в админке, как это сделано для страниц: Добавление колонки 'menu order' к экрану администрирования пользовательского типа записи
