Поле сортировки для произвольного типа записей

18 сент. 2012 г., 16:50:22
Просмотры: 50.8K
Голосов: 21

Есть ли способ добавить поле "order" (порядок), которое доступно для страниц, в произвольный тип записей?

Существует ли встроенная логика, которая предотвращает дублирование значений в поле "order"?

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

1
Комментарии
Все ответы на вопрос 2
5
38

При объявлении вашего пользовательского типа записи с помощью функции 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/.

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

18 сент. 2012 г. 16:58:39
Комментарии

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

Force Flow Force Flow
19 сент. 2012 г. 22:21:07

Неважно. Установка параметра hierarchical в false убирает его.

Force Flow Force Flow
20 сент. 2012 г. 01:03:11

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

Dave Hunt Dave Hunt
20 сент. 2012 г. 17:02:31

Привет. У меня есть этот код, но я ничего не вижу:

```

// Пользовательский тип записи "Услуга" 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 Sylar
20 июл. 2017 г. 12:41:39

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

Dave Hunt Dave Hunt
14 мар. 2018 г. 19:43:27
0

В дополнение к ответу @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' к экрану администрирования пользовательского типа записи

18 сент. 2012 г. 17:04:32