定义content type

需要在theme的functions.php里添加action

/*
* 自定义内容类型 - 电影
*/
function movietalk_custom_post_type_movie() {

  register_post_type( 'movie', array(
    'public'        => true,
    'labels'        => array(
      'name'               => '电影',
      'singular_name'      => '电影',
      'add_new'            => '添加电影',
      'add_new_item'       => '添加电影资料',
      'edit_item'          => '编辑电影资料',
      'new_item'           => '新电影',
      'all_items'          => '所有电影',
      'view_item'          => '查看电影',
      'search_items'       => '搜索电影',
      'not_found'          => '没找到电影资料',
      'not_found_in_trash' => '回收站里没找到电影资料', 
      'menu_name'          => '电影'
    ),
    'menu_position' => 5, // MENU在导航上的顺度
    'supports' => array(
      'title', 
      'editor',  // 编辑器
      'thumbnail',  // 缩略图
      'excerpt', // 摘要
      'custom-fields', // 自定义字段
      'revisions' // 版本
      ),
    'has_archive' => true,
    'rewrite' => array(
      'slug'  => 'movie', // 地址别名
      'with_front' => false // 地址是否带前缀字串"archives"
    ),
   ) );
}
add_action( 'init', 'movietalk_custom_post_type_movie' );

定义content type的信息库

/*
* 自定义内容类型的内容更新信息 - 电影
*/
function movietalk_movie_updated_messages( $messages ) {
  global $post, $post_ID;

  $messages['movie'] = array(
    0 => '', // 没有用,信息从索引 1 开始。
    1 => sprintf( __('电影已更新,<a href="%s">点击查看</a>', 'movietalk'), esc_url( get_permalink($post_ID) ) ),
    2 => __('自定义字段已更新。', 'movietalk'),
    3 => __('自定义字段已删除。', 'movietalk'),
    4 => __('电影已更新。', 'movietalk'),
    // translators: %s: 修订版本的日期与时间 
    5 => isset($_GET['revision']) ? sprintf( __('电影恢复到了 %s 这个修订版本。', 'movietalk'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
    6 => sprintf( __('电影已发布,<a href="%s">点击查看</a>', 'movietalk'), esc_url( get_permalink($post_ID) ) ),
    7 => __('电影已保存', 'movietalk'),
    8 => sprintf( __('电影已提交, <a target="_blank" href="%s">点击预览</a>', 'movietalk'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
    9 => sprintf( __('电影发布于:<strong>%1$s</strong>, <a target="_blank" href="%2$s">点击预览</a>', 'movietalk'),
      // translators: 发布选项日期格式,查看 http://php.net/date
      date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
    10 => sprintf( __('电影草稿已更新,<a target="_blank" href="%s">点击预览</a>', 'movietalk'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
  );

  return $messages;
}
add_filter( 'post_updated_messages', 'movietalk_movie_updated_messages' );

定义taxonomy

/*
* 自定义分类法 - 电影类型
*/
function movietalk_custom_taxonomy_genre() {
  $labels = array(
    'name'                         => '类型',
    'singular_name'                => '类型',
    'search_items'                 => '搜索类型',
    'popular_items'                => '热门类型',
    'all_items'                    => '所有类型',
    'parent_item'                  => null,
    'parent_item_colon'            => null,
    'edit_item'                    => '编辑类型',
    'update_item'                  => '更新类型',
    'add_new_item'                 => '添加新类型',
    'new_item_name'                => '新类型',
    'separate_items_with_commas'   => '使用逗号分隔不同的类型',
    'add_or_remove_items'          => '添加或移除类型',
    'choose_from_most_used'        => '从使用最多的类型里选择',
    'menu_name'                    => '类型'
  );
  $args = array(
    'public'        => true,
    'labels'        => $labels,
  );
  register_taxonomy( 'genre', 'movie', $args );
}
add_action( 'init', 'movietalk_custom_taxonomy_genre' );

自定义字段

安装advanced-custom-fields plugin后台就拥有管理字段的功能,可以把字段组添加到任意已定义的content type上。需要使用代码来输出字段,代码如下:

<?php while(have_posts()): the_post();?>
    <?php the_title();?>
    <?php the_content();?>
    <?php if(get_field('field_name')):?>
        <?php the_field('field_name');?>
    <?php endif;?>
<?php endwhile;?>

自定义字段:出现逻辑

custom field很强大,有些功能甚至比drupal7的content type还要强大,field的出现逻辑设置就是其中一个。

field可以设置Conditional Logic来指定当其它field值达到某些条件后,field才会出现。这样可以制作更深层次的内容类型,而不仅限于post type。

添加新的缩略图尺寸

// functions.php
add_image_size( 'video_detail', $width, $height, true );

显示缩略图

$image_id = get_field('image');
echo wp_get_attachment_image($image_id, 'video_detail'); 
echo wp_get_attachment_image_src($image_id, 'video_detail');

添加javascript文件

function movietalk_scripts() {
  if( get_post_type() == 'video' ){
    wp_enqueue_script( 'jwplayer', get_stylesheet_directory_uri() . '/jwplayer/jwplayer.js' );
  }
}
add_action( 'wp_enqueue_scripts', 'movietalk_scripts' );

当前post页面加载其它post页面的数据

当使用custom field的related field,可以引入其它post数据,在模板里也是通过get_field函数获取其它post对象,不过要注意需要使用setup_postdata($post);来载入其它post的内容,而且使用完数据之后需要用wp_reset_postdata();重置数据,否则会影响the_post, the_title, the_excerpt的结果。

管理内容列表添加列

mytheme/functions.php

// add column & column name
fucntion mytheme_video_cover_column($columns){
  $columns['video-cover-image'] = 'Video Image';
}
add_filter('manage_video_posts_columns', 'mytheme_video_cover_column');

// set column content
function mytheme_video_column_content($column_name, $post_id) {
  if($column_name == 'video-cover-image') {
      $video_cover_id = get_field('video-cover', $post_id);
      echo wp_get_attachment_image($video_cover_id, 'thumbnail');
  }
}
add_action('manage_video_posts_custom_column', 'mytheme_video_cover_column_content');

// set column style
function mytheme_video_cover_image_css() {
  echo '<style>.column-video-cover-image img {width:60x;}</style>';
}
add_action('admin_head', 'mytheme_video_cover_image_css');

猫之良品
2.5k 声望139 粉丝

资深Drupal, magento与Joomla