WordPress新增Training自定义文章类型缺少主题自带Service Options选项
WordPress新增自定义文章类型不显示主题自带配置项问题
我为我的WordPress站点使用了Prague主题(一款建筑与室内设计类WordPress主题),站点地址为RainProPixel.com。
该主题自带多个自定义文章类型,我需要新增更多自定义文章类型,因此我在Post-type.php文件中添加了名为Training的自定义文章类型,代码如下:
<?php /* * Portfolio post type. */ function register_custom_post_type() { $services_url_slug = cs_get_option('services_url_slug') ? cs_get_option('services_url_slug') : 'services-item'; $services_category_slug = cs_get_option('services_category_slug') ? cs_get_option('services_category_slug') : 'services-category'; // New Post Type register_post_type( 'services', array( 'labels' => array( 'name' => esc_html__( 'Services','prague-plugins'), 'singular_name' => esc_html__( 'Service','prague-plugins') ), 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', ), 'menu_icon' => plugins_url( 'assets/repairing.png' , __FILE__ ), 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => $services_url_slug), ) ); // New Taxonomy register_taxonomy( 'service-category', 'services', array( 'label' => esc_html__( 'Categories','prague-plugins'), 'rewrite' => array( 'slug' => $services_category_slug ), 'hierarchical' => true, ) ); $training_url_slug = cs_get_option('training_url_slug') ? cs_get_option('training_url_slug') : 'training-item'; $training_category_slug = cs_get_option('training_category_slug') ? cs_get_option('training_category_slug') : 'training-category'; register_post_type( 'training', array( 'labels' => array( 'name' => esc_html__( 'Training','prague-plugins'), 'singular_name' => esc_html__( 'Training','prague-plugins') ), 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail', ), 'menu_icon' => plugins_url( 'assets/repairing.png' , __FILE__ ), 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => $training_url_slug), ) ); // New Taxonomy register_taxonomy( 'training-category', 'training', array( 'label' => esc_html__( 'Categories','prague-plugins'), 'rewrite' => array( 'slug' => $training_category_slug ), 'hierarchical' => true, ) ); // New Post Type $projects_url_slug = cs_get_option('projects_slug') ? cs_get_option('projects_slug') : 'projects-item'; $projects_category_url_slug = cs_get_option('projects_category_slug') ? cs_get_option('projects_category_slug') : 'projects-category'; register_post_type( 'projects', array( 'labels' => array( 'name' => esc_html__( 'Projects','prague-plugins'), 'singular_name' => esc_html__( 'Project','prague-plugins') ), 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail' ), 'menu_icon' => plugins_url( 'assets/projects.png' , __FILE__ ), 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => $projects_url_slug), ) ); // New Taxonomy register_taxonomy( 'projects-category', 'projects', array( 'label' => esc_html__( 'Categories','prague-plugins'), 'rewrite' => array( 'slug' => $projects_category_url_slug ), 'hierarchical' => true, ) ); // New Post Type register_post_type( 'books', array( 'labels' => array( 'name' => esc_html__( 'Books','prague-plugins'), 'singular_name' => esc_html__( 'Book','prague-plugins') ), 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail' ), 'menu_icon' => plugins_url( 'assets/agenda.png' , __FILE__ ), 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'books-item'), ) ); // New Taxonomy register_taxonomy( 'books-category', 'books', array( 'label' => esc_html__( 'Categories','prague-plugins'), 'rewrite' => array( 'slug' => 'books-category' ), 'hierarchical' => true, ) ); // New Post Type register_post_type( 'media', array( 'labels' => array( 'name' => esc_html__( 'Media','prague-plugins'), 'singular_name' => esc_html__( 'Media item','prague-plugins') ), 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail' ), 'menu_icon' => plugins_url( 'assets/magazine.png' , __FILE__ ), 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'media-item'), ) ); // New Taxonomy register_taxonomy( 'media-category', 'media', array( 'label' => esc_html__( 'Categories','prague-plugins'), 'rewrite' => array( 'slug' => 'media-category' ), 'hierarchical' => true, ) ); // New Post Type register_post_type( 'exihibitions', array( 'labels' => array( 'name' => esc_html__( 'Exihibitions','prague-plugins'), 'singular_name' => esc_html__( 'Exihibition','prague-plugins') ), 'menu_icon' => plugins_url( 'assets/museum.png' , __FILE__ ), 'supports' => array( 'title', 'editor', 'excerpt', 'thumbnail' ), 'public' => true, 'has_archive' => true, 'rewrite' => array('slug' => 'exihibitions-item'), ) ); // New Taxonomy register_taxonomy( 'exihibitions-category', 'exihibitions', array( 'label' => esc_html__( 'Categories','prague-plugins'), 'rewrite' => array( 'slug' => 'exihibitions-category' ), 'hierarchical' => true, ) ); } add_action( 'init', 'register_custom_post_type', 0);
新增的Training自定义文章类型已经正常显示在WordPress后台管理菜单中,也可以正常创建对应文章。但我遇到的问题是,主题自带的其他文章类型拥有一组名为“Service Options”的额外配置项,我新增的Training文章类型没有该配置项,我需要能够编辑这些选项。我通过开发者工具检查到该配置项对应DIV ID为service_post_options,但我找不到该配置项的创建位置,请问我还遗漏了哪些操作,才能让新增的自定义文章类型拥有和主题原生文章类型一致的配置选项?
解决方案
从代码里的cs_get_option可以判断,该主题使用Codestar Framework框架开发后台配置模块,你要找的配置项是框架注册的自定义metabox,按以下步骤操作即可:
- 第一步:找到metabox注册代码
在主题目录、或者主题附带的核心功能插件目录下全局搜索createMetabox函数,匹配ID为service_post_options的注册代码,你会看到类似如下配置:
CSF::createMetabox( 'service_post_options', array( 'title' => 'Service Options', 'post_type' => array('services'), // 其余配置参数 ) );
- 第二步:绑定新增的文章类型
把你新增的training文章类型别名添加到上面post_type对应的数组中即可,修改后示例:
'post_type' => array('services', 'training'),
如果担心修改主题原生代码后续主题升级会被覆盖,可以通过子主题的functions.php挂载对应钩子,将training类型加入到该metabox的绑定列表中即可。
- 第三步:验证生效
修改保存后刷新后台的Training文章编辑页,就能看到Service Options配置项了。如果后续需要前台输出这些配置值,直接用和原生Services类型一致的get_post_meta方法取值即可,不需要额外调整逻辑。
另外修改完自定义文章类型相关配置后,建议到WordPress后台的「设置」-「固定链接」页面直接点击保存,刷新路由规则避免出现404问题。
内容的提问来源于stack exchange,提问作者Sean Walker
相关产品推荐
相关产品推荐

