Стандартные пользовательские поля в админке WordPress

4 сент. 2010 г., 03:53:41
Просмотры: 1.49K
Голосов: 7

Я добавил несколько разных custom_post_types в свою установку WordPress 3. Все они немного отличаются друг от друга и должны хранить уникальную информацию в custom_fields. Но если один тип может хранить product_id, то другой - нет. Один будет иметь source_url, а другой - нет. Вместо того чтобы инструктировать моих редакторов о том, какие пользовательские поля следует использовать с какими записями, как я могу сделать так, чтобы каждый пользовательский тип записи включал свои пользовательские поля как часть самого интерфейса?

Если вы зайдете в "daily_cartoon", у вас будет экран, который запрашивает только заголовок, подпись и медиа.
Если вы зайдете в "daily_product", у вас будет экран, который запрашивает только заголовок, цену, описание и т.д.

3
Комментарии

@Jonathan Sampson: Я работаю все выходные над пакетом, чтобы решить эту проблему (я работаю над ним уже больше месяца). Но у меня дедлайн во вторник, так что в эти выходные мне не отвечать на вопросы в StackExchange. Если к концу следующей недели вопрос все еще останется нерешенным, я обязательно займусь этим.

MikeSchinkel MikeSchinkel
4 сент. 2010 г. 19:27:34

@MikeSchinkel Я все еще работаю над проектом, так что если ты уже закончил свой инструмент, я с радостью опробую его и поделюсь своим опытом.

Sampson Sampson
12 сент. 2010 г. 04:02:50

Привет @Jonathan Sampson: Я еще не готов опубликовать его, но могу поработать с тобой приватно в качестве моего первого бета-тестера, если хочешь. Свяжись со мной по email, мой адрес есть на странице моего профиля: http://wordpress.stackexchange.com/users/89/mikeschinkel

MikeSchinkel MikeSchinkel
12 сент. 2010 г. 06:20:59
Все ответы на вопрос 3
0

Вы можете добавлять meta_boxes для хранения данных пользовательских полей в них. Поскольку add_meta_box можно настроить в зависимости от post_type, это позволит вам добавлять разные meta_box к разным типам записей.

Посмотрите этот пост для полного примера изменения экрана создания/редактирования пользовательского типа записи.

4 сент. 2010 г. 04:41:06
2

Привет, @Jonathan Sampson:

Существует несколько плагинов для упрощения работы с пользовательскими типами записей, некоторые из них также позволяют определять пользовательские поля (в произвольном порядке):

Как я уже упоминал, я работал над плагином, который не предоставляет пользовательский интерфейс, как эти, а вместо этого предлагает расширяемый API для сложных (и простых) типов полей. Но после часа попыток упаковать его я понял, что он еще не готов к распространению. Возможно, через несколько недель.

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

Возможно, вам также будет полезна эта статья:

12 сент. 2010 г. 22:46:56
Комментарии

Отмечу этот вопрос как избранный и буду ждать вашего решения ;)

ariefbayu ariefbayu
12 сент. 2010 г. 23:37:12

@silent: Круто!

MikeSchinkel MikeSchinkel
13 сент. 2010 г. 01:27:59
0

Недавно мне пришлось решать очень похожую проблему при работе с темой. Основой кода послужила эта статья, и я немного модифицировал код.

Ниже приведена первая часть модифицированного кода.

    add_action('init', 'limited_post_type');
function my_custom_limited_post_type() 
{
  $labels = array(
    'name' => _x('Limited Post Type', 'post type general name'),
    'singular_name' => _x('Film - DVD', 'post type singular name')
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true, 
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','author','thumbnail','excerpt', 'page-attributes','custom-fields' ),
    'show_in_nav_menus' => true
  ); 
  register_post_type('limited_post_type', $args);
}

Ниже приведена вторая часть модифицированного кода.

foreach ( $scope as $scopeItem ) {
       switch ( $scopeItem ) {
           case "post": {
             // Вывод на любом экране поста
             if ( basename( $_SERVER['SCRIPT_FILENAME'] )=="post-new.php" || $post->post_type=="post" )
             $output = true;
             break;}              
            case "page": {
                  // Вывод на любом экране страницы
                  if ( basename( $_SERVER['SCRIPT_FILENAME'] )=="page-new.php" || $post->post_type=="page" )
            $output = true;
            break;}
             case "limited_post_type": {
                                // Вывод только для limited_post_type
            if ((basename( $_SERVER['SCRIPT_FILENAME'] )=="post-new.php" && $post->post_type=="limited_post_type" ) || (basename( $_SERVER['SCRIPT_FILENAME'] )=="post.php" && $post->post_type=="film_dvd" ))
                   $output = true;
                   break;
                  }

Если хотите, напишите мне, и я с радостью отправлю вам мой файл functions.php для ознакомления. Это определенно правильный способ решения проблемы, так как я сам провел немало бессонных ночей, разбираясь с этим.

14 сент. 2010 г. 04:40:52