以下是 Kevin Leary 的客座文章。我很高兴收到 Kevin 的这篇客座文章投稿,因为它是我最喜欢的教程类型:实用且详细。
我使用 WordPress 开发的几乎每个自定义主题都需要一个管理团队或 团队成员页面。如果让我猜测,我会说我构建了大约 50 种不同的设置。我意识到,一定还有许多其他 WordPress 开发人员也在创建类似的系统。因此,我将分享我通常用于在 WordPress 中构建和管理“团队成员”页面的方法。

对于那些只想查看最终产品的人,可以查看 Github 上的 PHP 类或查看示例。
在 WordPress 中创建和管理这样的团队页面涉及以下工具组合
- 自定义帖子类型(例如
team
) - 用于过滤的自定义分类法(例如
department
) - 用于管理自定义字段的元框 UI(例如职位、电子邮件、电话和社交媒体链接)
使用这些工具,让我们逐步了解为自定义 WordPress 主题创建“认识我们的团队”模板的过程。
首先
在我们开始之前,我应该澄清一些事情。在本教程的 Github 示例中,我使用了面向对象的方法,并将我的代码存储在一个单独的 .php
文件中,我通常将其包含在主题的 functions.php
文件中。
为了清楚起见,我将逐步描述该过程,并参考在您的 functions.php
中进行设置。
创建帖子类型和分类法
第一步是注册一个新的帖子类型(例如 team
)。如果需要过滤或分类,您还可以注册一个分类法(例如 department
)。
此帖子类型将在 WordPress 后台添加一个新的团队简介菜单,将所有团队帖子与帖子和页面分开,以便于内容管理。
分类法将为团队帖子添加一个自定义类别,允许您过滤或对团队进行分类。当您拥有一个超过十人的团队时,我发现这是合适的。它通常方便按办公地点或部门过滤员工。

帖子类型
/**
* Register `team` post type
*/
function team_post_type() {
// Labels
$labels = array(
'name' => _x("Team", "post type general name"),
'singular_name' => _x("Team", "post type singular name"),
'menu_name' => 'Team Profiles',
'add_new' => _x("Add New", "team item"),
'add_new_item' => __("Add New Profile"),
'edit_item' => __("Edit Profile"),
'new_item' => __("New Profile"),
'view_item' => __("View Profile"),
'search_items' => __("Search Profiles"),
'not_found' => __("No Profiles Found"),
'not_found_in_trash' => __("No Profiles Found in Trash"),
'parent_item_colon' => ''
);
// Register post type
register_post_type('team' , array(
'labels' => $labels,
'public' => true,
'has_archive' => false,
'menu_icon' => get_stylesheet_directory_uri() . '/lib/TeamProfiles/team-icon.png',
'rewrite' => false,
'supports' => array('title', 'editor', 'thumbnail')
) );
}
add_action( 'init', 'team_post_type', 0 );
可选分类法
/**
* Register `department` taxonomy
*/
function team_taxonomy() {
// Labels
$singular = 'Department';
$plural = 'Departments';
$labels = array(
'name' => _x( $plural, "taxonomy general name"),
'singular_name' => _x( $singular, "taxonomy singular name"),
'search_items' => __("Search $singular"),
'all_items' => __("All $singular"),
'parent_item' => __("Parent $singular"),
'parent_item_colon' => __("Parent $singular:"),
'edit_item' => __("Edit $singular"),
'update_item' => __("Update $singular"),
'add_new_item' => __("Add New $singular"),
'new_item_name' => __("New $singular Name"),
);
// Register and attach to 'team' post type
register_taxonomy( strtolower($singular), 'team', array(
'public' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'hierarchical' => true,
'query_var' => true,
'rewrite' => false,
'labels' => $labels
) );
}
add_action( 'init', 'team_taxonomy', 0 );
department
分类法。我在教程中包含它是因为了解它可以用于过滤团队成员很有用。自定义字段的元框
现在我们在 WordPress 中有了新的团队简介菜单,我们需要自定义与每个团队帖子一起存储的数据。根据我的经验,大多数团队简介都有以下字段
- 职位
- 电子邮件
- 电话
- 推特
- 领英
为了管理此内容,我喜欢自定义团队帖子类型的添加新内容和编辑UI,允许网站管理员和作者直观地更新此信息,无需培训。
我目前用于创建自定义字段元框 UI 的工具是 Advanced Custom Fields (ACF) 插件。

要创建此元框,您需要安装 ACF 插件,在自定义字段后台菜单下创建您的字段。以下是本教程中我使用的字段和设置。

如果您像我一样懒惰,可以 导入我的 XML 导出文件来自动化字段创建过程。操作方法如下
- 下载我的“团队详细信息”字段组导出文件:acf-export-team-details.xml.zip
- 导航到工具 » 导入并选择 WordPress
- 如果出现提示,请安装 WP 导入插件
- 上传并导入
.xml
文件 - 选择您的用户并忽略导入附件
- 就是这样!
ACF 插件将其数据存储在自定义帖子类型中,因此可以使用标准的 WordPress XML 导入工具。插件作者 Elliot Condon 的一个非常聪明的举动。
其他
在我的 PHP 类中,我添加了一个管理通知,如果尚未安装 ACF 插件,它将提示您安装。这提供了一个很好的提醒,您需要它才能使团队帖子类型正常工作。
自定义模板
现在我们已经设置了团队管理系统,我们需要在网站上的某个位置输出团队简介。为此,我通常会创建一个自定义主题模板(例如 template-team.php
),该模板会更改特定 WordPress 页面的视图。查看 WordPress.org 上的文档以了解有关 自定义模板 的详细信息。
循环显示团队帖子
要在我们的自定义模板中输出团队帖子,我们将使用以下代码。
'team',
'posts_per_page' => -1, // Unlimited posts
'orderby' => 'title', // Order alphabetically by name
) );
if ( $team_posts ):
?>
团队成员
“个人可以并且确实会产生影响,但需要一个团队
才能真正搞砸事情。”
ID) ) { $src = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), ‘team-thumb’ ); $thumb_src = $src[0]; } ?>
为了获取 team
帖子的循环,我使用了 get_posts
函数。它简单易用且高效。我使用了以下参数来定位和组织查询结果
'post_type' => 'team'
将只查询团队帖子'posts_per_page' => 50
将返回所有团队简介,假设您少于 50 个。如果您计划拥有更多,请相应调整。'orderby' => 'title'
将按名称对结果进行排序'order' =>; 'ASC'
将按字母顺序开始排序
获得查询对象后,我们将遍历每个团队帖子,将其数据和内容输出到我们的 HTML 结构中。
get_field
和 the_field
函数是 ACF 插件的内置函数。这可能是您在使用它时会发现的两个最常见的函数。它们输出给定自定义字段的值。
循环完成后,我们可以在 WordPress 中创建一个新的页面,从自定义模板下拉列表中选择团队。当您查看此页面时,您应该会看到团队简介的列表。

性能说明
在没有任何缓存的情况下,这段代码会向页面添加多达 26 个查询。如果您有一个流量很大的网站,则需要利用 Transients API 来缓存此类密集型自定义查询的输出。我在我的 PHP 类中包含了一个静态 display()
方法,该方法处理瞬态缓存。
if ( $team_profiles = TeamProfiles::display() )
echo $team_profiles;
display()
方法使用输出缓冲和瞬时缓存来存储和缓存我们的团队循环生成的 HTML。
使用这种方法而不是我们之前的循环,可以将查询次数减少到 1 次,节省了 25 次数据库访问。这还可以将初始页面加载时间缩短 400-500 毫秒。不错!
使用 CSS 样式化模板
现在我们已经建立了团队页面管理系统并输出了 HTML 结构,我们需要为我们的新模板添加一些样式。
有条件地加载 CSS
要仅为我们的自定义模板 (template-team.php
) 包含样式表,我们可以使用以下条件检查。
/**
* Load CSS for template-team.php
*/
function team_styles() {
if ( is_page_template('template-team.php') )
wp_enqueue_style( 'team-template', get_stylesheet_directory_uri() . '/assets/css/team.css' );
}
add_action( 'wp_enqueue_scripts', 'team_styles', 101 );
当使用 template-team.php
时,这将加载一个 CSS 文件 (/assets/css/team.css
)。使用此方法有助于保持核心样式表的简洁。
示例样式
以下是我在此教程随附的示例中使用的样式。
/* ==============================================
Team profiles
============================================== */
.profiles {
margin-bottom: -20px;
}
.intro {
padding-left: 140px;
}
.intro h2 {
margin: 0 0 7px;
}
.intro .lead {
line-height: 120%;
font-size: 1.1em;
font-style: italic;
margin: 0 0 35px;
}
.profile {
position: relative;
margin: 0 0 20px;
}
.profile:nth-child(even) {
clear: left;
}
.profile-header {
position: absolute;
top: 0;
}
.profile-header img {
float: left;
}
.profile-content {
font-size: 14px;
padding: 27px 20px 0 0;
line-height: 1.4em;
margin: 0 0 0 125px;
}
.profile-content h3 {
margin: 0;
}
.profile-content .lead {
font-size: 1.3em;
line-height: 100%;
font-style: italic;
margin: 3px 0 20px;
}
.profile-content:before {
content: '';
width: 36px;
height: 3px;
background: #dededc;
position: absolute;
top: 0;
}
.profile-content p {
margin: 0 0 10px;
}
.profile-footer {
position: absolute;
top: 121px;
width: 100px;
text-align: center;
}
.profile-footer a {
line-height: 18px;
margin: 0 3px;
display: inline-block;
}
.profile-footer a:hover i {
color: #595959;
}
.profile-footer a:active i {
color: #000;
}
.profile-footer i {
font-size: 18px;
position: relative;
}
.profile-footer i.icon-envelope {
font-size: 16px;
top: -1px;
}
.profile-footer i.icon-linkedin {
font-size: 16px;
top: -1px;
}
在我的项目工作流程中,我使用 LESS 预处理我的 CSS。如果您想在您的项目中使用 LESS,下面是 LESS 格式的 CSS。
/* ==================================================
Team profiles
================================================== */
// Mixins
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
// Global
.profiles {
margin-bottom: -20px; // Offset adjustment
}
.intro {
padding-left: 140px;
h2 {
margin: 0 0 7px;
}
.lead {
line-height: 120%;
font-size: 1.1em;
font-style: italic;
margin: 0 0 35px;
}
}
.profile {
position: relative;
margin: 0 0 20px;
&:nth-child(even) {
clear: left;
}
}
// Header
.profile-header {
position: absolute;
top: 0;
img {
float: left;
}
}
// Content
.profile-content {
font-size: 14px;
padding: 27px 20px 0 0;
line-height: 1.4em;
margin: 0 0 0 125px;
h3 {
margin: 0;
}
.lead {
font-size: 1.3em;
line-height: 100%;
font-style: italic;
margin: 3px 0 20px;
}
// Top separator
&:before {
content: '';
width: 36px;
height: 3px;
background: #dededc;
position: absolute;
top: 0;
}
p {
margin: 0 0 10px;
}
}
// Footer
.profile-footer {
position: absolute;
top: 121px;
width: 100px;
text-align: center;
a {
line-height: 18px;
margin: 0 3px;
display: inline-block;
}
a:hover i { color: #595959; }
a:active i { color: #000; }
i {
font-size: 18px;
position: relative;
}
i.icon-envelope {
font-size: 16px;
top: -1px;
}
i.icon-linkedin {
font-size: 16px;
top: -1px;
}
}
太棒了,你做到了!
感谢您的阅读,我希望本教程能使您深入了解如何在 WordPress 中创建团队简介/遇见团队/团队资料管理系统。如果您理解本文中解释的基本概念,那么您现在应该拥有了一种宝贵的管理 WordPress 自定义内容的新方法。
自定义帖子类型、分类法和元框管理的自定义字段为管理许多复杂的 WordPress CMS 场景提供了一种强大的方法。
很棒的教程,一个快速的问题,为什么您使用
get_posts
而不是使用自定义WP_Query
?后者似乎更简单。我选择
get_posts()
而不是WP_Query
是因为我实际上认为它更简单。这完全取决于您,WP_Query
也能很好地工作。我认为两者之间没有显著差异。很棒的教程!ACF 永远的神。有时当我感到最懒的时候,我甚至使用自定义帖子类型 UI。就像你不用再编码了。将其与 Bootstrap 结合使用。你就像在创建 WordPress 网站时睡觉一样。呵呵!
永远永远永远永远使用
WP_Query
而不是get_posts
,如果您想使用get_posts
,请使用wp_reset_query
。我会无限次地对我的同事重复这一点,它会在以后节省很多麻烦。只有男性团队成员?
你真可耻!
示例页面上有四个虚构的人物来演示一些代码。我将把这段话埋起来,因为我认为这不是开始关于性别的对话的地方。
感谢这个详细的教程!我过去三天一直在搜索自定义帖子类型的教程,而这个教程在细节和代码方面都非常好。不过我有一个问题,我想知道我是否可以使用此方法在一个页面上显示艺术家/设计师的详细列表,该列表将链接到他们在单独页面上的个人资料。就加载/查询而言,这种方法是否可行?
确实!您只需要提供指向由您的自定义帖子类型创建的正确 URL 的链接,并为用户个人资料页面创建一个模板。
我很高兴你喜欢这篇文章,Beelal,
这很容易做到。您可能会注意到,您创建的每个**团队**帖子都没有重写的 slug。相反,它们具有类似以下内容:
http://www.kevinleary.net/?team=jonathan-ive
。要为每个团队帖子创建单个页面,请在
register_post_type()
函数中将rewrite
参数设置为true
。然后您的 URL 将如下所示:http://www.kevinleary.net/team/jonathan-ive/
。谢谢 Kevin 和 Adam,我正在尝试这个! :)
要使个人资料本身正常工作,您唯一需要做的事情是创建相应的单个模板,以便在他们点击永久链接时使用。假设您有一个“艺术家”的自定义帖子类型。您只需在“团队”页面上创建一个指向单个帖子的永久链接,然后创建一个名为“single-artist.php”的新文件,然后将您的高级自定义字段添加到其中,就完成了。
对于那些遵循 Kevin 和 Josh 的说法但仍然遇到问题的人,请确保您转到设置 > 永久链接并重新保存此页面。您甚至不必更改此页面的设置,只需点击或点击保存按钮,您应该就可以使用了。我花了一两个小时才弄清楚为什么单个页面没有显示!希望这对某些人有所帮助。
关于您使用瞬态 API 的一个快速问题。
您使用
set_transient($transient_label, $html);
设置数据且没有过期时间。如果您要向团队添加新用户,它是否不会显示?不太清楚它是如何工作的。Adam,你抓住了要点,
我已经更新了 Github 存储库,改为包含
set_transient($transient_label, $html, DAY_IN_SECONDS);
。这绝对是我方面的一个意外疏忽。您还可以挂接到
save_post
来刷新缓存,而不是使用时间限制。Paul 的主意不错,我实际上更喜欢这个主意。如果没有任何更改,为什么要刷新缓存呢?对吧?
我爱这个
很棒的教程!对于那些不想手动创建自定义帖子类型的人,有一个名为 Types 的不错的插件可以为您完成此操作(但即使在创建后也必须安装它,因此商业实现可能希望跳过此操作)。
另外——Javier 已经问过这个问题了——为什么使用
get_posts
而不是WP_Query
?使用它是否对性能有任何真正的改进?请参阅评论列表顶部的 Javier 的回答。我认为两者之间没有显著差异。
get_posts()
是WP_Query
的一个更简单的接口,封装在一个单个函数中,它本身使用WP_Query
。很棒的教程,谢谢!我最近在客户项目中经常使用自定义帖子类型和 ACF 的相同组合,它太棒了!我从您的示例中了解了一些细节,尤其喜欢缓存提示!
精彩的帖子,尤其感谢性能片段!我经常发现我需要对组织内的不同职能排序结果,例如:主管、行政人员、助理等,其中它们必须按层次结构显示,而不是按字母顺序。在这些情况下,我一直在创建单独的循环,一次循环遍历一个自定义分类法,但这似乎有点过头了,而且对性能不利,例如在学术机构中,我可能有 10 个这样的循环。我可能遗漏了一个非常明显的解决方案,但对于如何处理这种情况有任何建议吗?
您好,Niek,
最有效的方法可能是使用
$wpdb
来构建你自己的查询。其次,我可能会使用get_posts()
查询你帖子类型中的所有帖子,然后遍历每个帖子,获取附加到它的术语,例如$post_terms = wp_get_post_terms($team_post->ID, 'departments', array("fields" => "names") );
然后,我会为每个分类术语创建一个数组,然后将每个帖子存储到各自的数组中。完成所有这些操作后,你应该会得到每个术语的数组,可能类似于
$directors
、$administrators
、$staff
、$assistants
等。此时,你应该有足够的信息来生成输出。希望这有帮助,请务必利用瞬态。当分类术语发挥作用时,事情很快就会变得资源/查询密集。
Kevin,非常感谢,很棒的建议,非常感谢!
啊!我使用ACF已经超过一年了,它改变了我的生活!
巧妙地使用自定义帖子类型来显示团队成员。我可能会在普通页面上使用重复字段来实现它,但如果你不想为那个AFC插件付费,这是一种非常棒的免费方法来实现几乎相同的事情。
你提到了性能以及此方法产生的查询数量。你是否比较过自定义帖子类型和重复字段的性能?
ACF 是一个很棒的省时工具,它对开发有很大帮助。重复字段是一个很棒的插件,我也在客户的项目中使用它。
ACF 的重复字段和自定义帖子类型之间的性能差异取决于你对数据库进行多少次查询、从中选择多少信息以及返回多少信息。它还取决于你访问信息的方式——是否循环遍历所有信息以查找某些内容,或者是否定位特定帖子。
对于中小型项目,使用其中一个或另一个没有明显的性能差异。一切都取决于在项目中哪个“感觉”更直观。
安娜说得对,
我通常更喜欢帖子类型而不是重复器,原因有几个。将所有这些信息存储在自定义字段中似乎效率低下,尤其是在团队规模随着时间推移而增长的的情况下。
我遇到过许多情况,在这些情况下,为团队成员设置帖子关系非常方便。例如,可能有一组团队成员都是电子书的贡献者,或者参与了公司的成就。当数据位于帖子类型中时,我可以使用 ACF 关系来处理这种情况。
使用帖子类型创建单个团队成员页面也更容易,这是一种经常出现的常见场景。我必须承认,这些重复字段确实很方便。
不错的教程。我注意到很多设计师使用 ACF 或其他插件来处理这类事情——为什么不手动编写自定义元框呢?
手动编写是否有缺点?或者使用插件创建自定义字段有什么好处(除了显而易见的时间问题之外)?
在我看来,依赖插件来实现核心功能存在维护风险,但也许我忽略了一些东西。
时间就是原因。我可以花大量时间手动编写它们——或者我可以花 2 分钟来构建一些非常高级的东西。ACF 附带的选项(如日期/时间选择器和重复器)足以让我信任它。
我明白这一点,但 ACF 似乎是一个经常更新的工具,并且拥有足够的用户群,使其成为可靠的选择。
我也想问同样的问题。有人吗?
没错。这些功能创建起来并不有趣。
我明白你的意思,老实说,我对此非常谨慎,Erin。过去,我曾使用插件来实现类似的功能,例如“更多字段”或“自定义字段模板”,并遭遇了惨痛的失败。
有一段时间,WP Alchemy MetaBox 类是我的首选元框创建工具,我偶尔仍然会将其用于自定义场景。
当我开始使用 ACF 时,我担心切换回使用插件,因此我彻底审核了底层代码。我的结论是,它开发得非常好,稳定且利用了 WordPress 最佳实践和 API。我现在很乐意使用它,并且已经使用了大约 6 个月。
事实上,我认为从维护的角度来看,使用集中式工具更有效率。如果你有 20 个带有元框的站点,并且 WordPress 进行了一个影响所有站点的更新,你可以在一个地方有效地修补或修复这 20 个站点。
我唯一担心的是插件作者最终可能会筋疲力尽。Elliot Condon 创建了一个令人难以置信的工具,这么多人免费使用它。我想,使用它的人越多,他的支持请求就越频繁和苛刻。
Elliot 一直兴奋地发推文,谈论将全部精力投入到 ACF 的开发中。他还为版本 5(包含免费和专业版本)制定了很棒的计划,所以我认为开发不会很快停止 :-)
ACF 也是我的首选工具,如果 WordPress 只需聘用 Elliot 并将 ACF 集成到原生 WordPress 中,我将非常高兴。
我会担心插件在 WordPress 更新后出现问题,突然间,你创建的所有“团队成员”页面都无法工作。客户不会关心这只是一个暂时的状况。
在我看来,当你使用简单布局时,更明智的做法是在管理员端为用户使用该插件,但在模板中使用标准的 WordPress 函数(或你自己的函数)来检索数据并显示它。这样,如果插件因 WordPress 更新而出现故障,你不会在等待插件更新时遇到一堆损坏或空白页面。在最坏的情况下,客户将暂时无法更新单个团队成员。
很棒的教程。自定义帖子类型在很多情况下都很有用。我希望它们不要在 WordPress 核心代码中隐藏得那么深。
这是我见过的最好的帖子之一.. 详细且易于理解.. 感谢 Kevin Leary 分享它..!
非常有用的教程。
另外,有没有办法将团队成员与 WordPress 用户关联起来?这样每个团队成员可以在其描述下方拥有帖子列表等。
谢谢,
我想你可以创建一个字段,你可以在其中输入用户名(“也许可以动态填充它?”)…然后在你的模板中,运行一个 WP_Query,获取与前面提到的字段匹配的作者的帖子?
我相信我记得见过一些插件,这些插件可以通过添加其他字段来增强作者资料——这可能也值得研究…
ACF 关系字段非常适合这种情况。
在你的团队帖子中添加一个“相关文章”字段,或在你的帖子中添加一个“相关团队成员”字段。
显示每个用户的最新帖子最好的方法是什么,而不是必须使用 ACF 关系字段手动选择它们?
如果所有团队成员都是 WordPress 用户,你是否无法在用户个人资料屏幕中使用 ACF 创建自定义字段?
感谢你提供的精彩教程。
请告诉我,有没有办法取消设置每个团队成员的单个页面?在我的项目中,我只需要一个页面显示整个团队,而不需要像http://site.com/team/barack-obama/这样的单独页面。
Chris,在 ACF 中不使用重复器来实现此目的有什么原因吗?可以创建一个包含这些字段的“个人资料”重复器,然后仅对字段本身执行 while 循环,而无需额外的分类法。
甚至更好的是可以为此创建一个灵活的字段,以便它们可以包含在任何地方。
如安娜·芬克上面提到的,重复字段是一个付费插件。
这是一种免费的方式来完成任务。
啊,非常正确,它只需要几美元,而且绝对物有所值。ACF 是我开始为客户项目使用 WordPress 的唯一原因,没有它,WordPress 作为 CMS 简直不够好。
重复字段有效,但由于许多原因,帖子类型通常是更好的选择。请参阅我上面对安娜·芬克的回复。
很棒的文章,你应该经常这样做。
我找到了我想要的东西。太棒了!
我一直在寻找一个替代的元框插件,我对 ACF 印象深刻。感谢你的介绍!
很棒的文章!真是及时雨:D 非常感谢!
很棒的帖子!我想将其应用于一个在 WordPress 上运行的公司内网员工目录。
我做过类似的项目,它非常适合这个目的。如果这是一个庞大的人员数据库,相关的搜索可以是一个很好的补充。我建议查看SwiftType
很棒的帖子!对于那些需要了解如何使用自定义帖子类型、分类法和自定义字段的完美示例。
我碰巧今天正在使用 ACF 和自定义帖子类型制作一个“认识团队”页面!我遇到了一个问题。我试图通过让上面类似的关于页面链接到每个成员生成的个人简介页面来自动化这个过程。我正在发送永久链接,但是我没有办法用自定义字段构建该页面。这可能做到吗?
非常感谢!
很棒的文章。将为我节省很多在当前工作内容上进行的调试和实验。
感谢 Kevin,
我希望几个月前就看到这个,但没关系,我更喜欢你的解决方案!
当然,无论如何我都会查看 ACF 插件和重复器想法!
干杯,
Jon
PS。自定义模板上的 href 在开头有一个额外的“s”,你可能需要更新它
已修复
你好,Kevin,
首先,很棒的教程。
我对你的路线有一些疑问,只是想知道我是否应该“改变我的策略”。
1) 你使用自定义帖子的模板。难道不应更好地利用 WP 的页面层次结构并在主题上创建一个“archive-team.php”页面并在那里插入代码吗?我只是不太热衷于客户更改此设置本身(从普通模板到团队模板)。
2) 你提到一个插件可以缓存一些东西,因为自定义元字段插件。使用我们自己的元框是否更好,或者不应该使用?
我看到第二个问题已经被问过了,所以很高兴知道。但是第一个问题仍然存在 :)
你也可以使用帖子类型归档,为了这个演示的目的,自定义模板效果很好,因为所有个人简介都显示在一个页面上。
嗨,Kevin,感谢你的帖子 - 但我有一个迫切的问题
为什么当你实际上 WordPress 已经有一个表示人的数据对象:它的用户系统时,你选择使用自定义帖子类型来表示团队成员?
很容易扩展一个用户的用户资料以添加额外的字段,并在视图中读取这些字段。
我认为这会导致更清晰的数据结构……并具有额外的好处,即作者页面已经包含了表示一个作者详细信息视图所需的所有信息。
感谢你的回复。
Tobias
Tobias,这是我在上面评论中询问的内容。对我来说,向用户系统添加字段似乎是合乎逻辑的方法。
我唯一能想到的这种方法可能不是最佳解决方案的情况是,如果团队成员不需要访问 WordPress 系统。
这是一个有效的观点,Tobias。我认为自定义帖子类型适用于团队成员以任何方式都不属于作者的公司/商业网站。根据我的经验,大多数“认识团队”页面和个人简介都充当静态内容。在这种情况下,如果他们没有创作内容或登录系统,则为每个人管理一个用户帐户似乎有些过头。
也就是说,你描述的方法肯定有显着优势。为团队成员提供登录和更新其个人资料的能力可以为大型个人资料目录节省大量时间。
对于其他读者,如果你的团队成员正在撰写内容,我建议考虑 Tobias 的方法。
各位,
首先,Kevin,非常感谢你的回复。下次我一定会研究这个插件。
Tobias,关于你的问题,我认为这种方法是最好的(自定义帖子类型),因为并非所有员工都应该是 WP 用户。如果让我允许每个人访问,即使是低级别的访问,并且你可以设置权限,我认为这是一个安全漏洞。你永远不知道什么时候有人可能会获得错误的访问权限等。最好是希望一切顺利,但也要为最坏的情况做好准备:)。
此外,它很麻烦。
我正在学习一些 wp……
我应该把文件放在哪里 - 我试过了,但无法正常工作……
在你的模板文件夹中。/wp-content/themes/name-of-your-theme/
很棒的帖子,在这里学到了很多东西,很高兴你们进行了一场非常高级别的讨论。感谢与我们分享所有这些内容!
Marco,
我把文件放在了 wp-content/themes/name-of-your-theme/twentythirteen 中,但“团队简介”没有显示在菜单中……
那里有一个额外的目录。它应该是:wp-content/themes/twentythirteen
在玩弄它的过程中,我只是想到了一件事。
如果你不想让用户能够查看单个团队个人资料页面,则可能需要将
"publicly_queryable" => false
添加到register_post_type
函数中。使用当前设置,你的个人资料可以在/?team=mark-zuckerberg处单独查看,如果缺少合适的模板文件,则可能会导致问题。
当然,他们不太可能偶然发现该网址,但我喜欢做到万无一失。
对此有什么想法吗?有更好的方法吗?
P
谁能告诉我如何使
flush_rewrite_rules();
在此处工作?我试图基于此创建一个简单的“项目”自定义帖子类型插件,但无论如何我无法使
flush_rewrite_rules();
工作!我有这个调用
我的激活函数是这样的
试试这个
并将你的
public function
替换为public static function
也许这有帮助。
非常好的教程……我第一次听说瞬态 API。
顺便说一句,很棒的团队;)
所有 PHP 代码是否都包含在 functions.php 文件中?关于在自定义字段中创建社交图标的问题。您是否将其链接到 Font Awesome?我想知道如何链接它。
优秀的教程,感谢发布!
有没有一种简单的方法可以创建此 CPT 的插件版本?如何将其制作成插件?任何指导都将不胜感激。
很棒的教程,非常感谢!
很棒的教程。非常详细。您还可以使用这种类型的代码在 WordPress 中创建其他自定义帖子类型,例如投资组合、服务等。无论如何,继续努力。
这是一篇很棒的文章,我立即决定将其应用到我的某些项目中。但是,作为 PHP 新手,有人可以帮我更改 orderby 值吗?
基本上,我不想按字母顺序排列我的页面。
我想创建一个排序索引,可能为每个团队简介使用自定义字段(可以这样工作吗?),然后为每个团队简介输入一个值(1,2,3..),在我的脑海中,这将是排序他们的方式。
我的问题是,我不知道需要在 team-template PHP 页面中放入什么来替换以下内容:
'orderby' => 'Title', // 按名称按字母顺序排序
谁能帮我指明正确的方向,或者至少告诉我我这样做的方法是否错误?
如何替换代码中的“Title”以使用我的自定义字段,例如“index_no”?
谢谢
嗨,吉姆。以下是按顺序排列的所有参数
orderby(字符串)– 按参数对检索到的帖子进行排序。默认为“date”。可以传递一个或多个选项。
‘none’ – 无序(版本 2.8 中可用)。
‘ID’ – 按帖子 ID 排序。请注意大小写。
‘author’ – 按作者排序。
‘title’ – 按标题排序。
‘name’ – 按帖子名称(帖子 slug)排序。
‘date’ – 按日期排序。
‘modified’ – 按上次修改日期排序。
‘parent’ – 按帖子/页面父 ID 排序。
‘rand’ – 随机顺序。
‘comment_count’ – 按评论数排序(版本 2.9 中可用)。
‘menu_order’ – 按页面顺序排序。最常用于页面(“编辑页面属性”框中的“顺序”字段)和附件(“插入/上传媒体库”对话框中的整数字段),但可以用于任何具有不同“menu_order”值的帖子类型(它们都默认为 0)。
‘meta_value’ – 请注意,查询中还必须存在“meta_key=keyname”。还要注意,排序将按字母顺序进行,这对于字符串(即单词)来说很好,但对于数字来说可能出乎意料(例如 1、3、34、4、56、6 等,而不是 1、3、4、6、34、56,如您自然预期的那样)。
对于数值,请使用“meta_value_num”。
‘meta_value_num’ – 按数字元值排序(版本 2.8 中可用)。还要注意,查询中还必须存在“meta_key=keyname”。此值允许进行数字排序,如上文“meta_value”中所述。
‘post__in’ – 保留 post__in 数组中给定的帖子 ID 顺序(版本 3.5 中可用)。
非常感谢 HeroWP 抽时间发布所有这些很棒的信息!
非常有帮助!
大家好。我正在逐字逐句地遵循本教程,并且在使自定义 CSS 显示方面运气不佳。
具体在哪里插入此 PHP 代码?在我的主题的 functions.php 中?其他地方?尽管被告知要使用模板,但我无法让页面加载 css。
不过,这是一个完美的教程!
嗨,
我已经将其放入 functions.php 文件中。对我来说似乎有效。
这正是我一直在寻找的!感谢凯文,我真的很高兴在我的网站上使用它。我唯一的问题可能在这里是多余的,因为我对这一切都是新手,但我的自定义页面模板不会显示在 WP 的下拉菜单中,我已经更改了主题并将其放回原处,检查了页面的 php 标题等,它让我抓狂如果你有任何建议,我将不胜感激!
我也有同样的问题。您是否已将 template-team.php 放入正确的目录?
您应该将其保存在 wp-content\themes(您的主题名称)/template-team.php 中
当我这样做时,它起作用了。希望对您有所帮助 :)
一切都非常简单,解释得很好,但有一件事:我无法显示 ACF 中报告的字段中的图标。我的目录中没有图标。我在哪里可以找到它们?
谢谢。
很棒的教程,非常有用,正是我一直在寻找的。不过我想知道是否有一种方法可以按部门将它们显示为块,例如,销售部门的所有人都会与上面的“销售”标题一起显示?感谢您的帮助。
出于某种原因,当我尝试创建新页面时,在页面属性下没有出现“团队”页面。我已经按照教程一直走到循环结束,然后您谈到了“关于性能的说明”。
您应该将“template-team.php”文件保存在哪里?目前我将其保存在“wp-includes”文件夹中。我正在本地主机上试用它,因此我无法提供链接,遗憾的是。
嗨,斯蒂格,
您将 template-team.php 文件保存在主题文件夹中,例如
wp-content\themes\您的主题名称
我希望这有帮助 :)
或者忘记它。我在一些较早的评论中读到,我应该将“template-team.php”文件放在主题目录中,它就像一个魅力一样起作用了 :)
感谢您的回复,杰伊。我终于弄明白了。
它没有加载 WordPress 主题页面的其余部分。当我使用新的“团队”模板创建新页面时,它只会加载包含我刚刚创建的团队内容的 body 标签部分。我没有获得标题、页脚、导航栏等。
有谁知道为什么会发生这种情况?
您必须包含
get_header();
get_sidebar();
get_footer();
在顶部包含标题,在底部包含侧边栏和页脚,这应该会调用所有其他内容。
完美!感谢杰伊 :)
嘿,
我不理解 get_posts 部分。
有人可以发布一个它应该是什么样子的示例吗?
在 single.php 中?
抱歉,我是一个绝对的初学者。
此致,
亚历克斯
嗨,很棒的教程,我遇到的一个问题是它将我创建的页面“认识您的团队”拉入位置字段,而不是人员的姓名,有什么想法吗?我使用的是 WP3.7.1 和一个自定义的 Genesis v2 主题,网站目前正在建设中,如果您需要,我可以向您发送任何文件,也只显示在 1 列中而不是 2 列,谢谢艾利斯特
我也正在尝试为 Genesis 主题解决这个问题。按照教程中的所有步骤操作,但当我添加用于显示帖子的最后一部分时,页面中断了(完全是空白)。注释掉该部分可以修复页面,但没有帖子信息。也许 Genesis 框架需要特定的语法。但是我喜欢这个解决方案,并希望使其正常工作。所以,即使这对我来说还没有奏效,我对前景也感到非常兴奋。
对我的评论进行了一些修改。我将所有内容都放在我的主 functions.php 中,并省略了最后一行(认为它是独立文件的一部分)
<?php endif; ?>
哎呀。因此我现在有了我的团队,但它们在我的主页上并且没有样式。将继续挖掘,但显然这是用户错误。:)我在哪里可以找到 /assets/css/team.css 来添加 css?我在主题目录中找不到 assets。该目录在其他地方吗?
好主意,但创建具有 50% 宽度的小部件的自定义页面模板,并使用任何类型的用户配置文件小部件填充小部件区域,这要容易、灵活和高效得多。
最近编写了这段代码,大约花了 20 分钟,并且非常容易根据自己的样式进行自定义。
不错的脚本。
我创建了一个列表,并且运行良好,但我无法使其与分类法一起使用!
(我正在构建一个新的主题)
我尝试在 get_post 中设置 ‘Regioner’ => ‘en’,但它没有获取到。
我使用的是 q_translate,因此区域设置为“sv”、“en”等等。
我在这里错过了什么?
functions.php 中分类法的标签是
这是输出代码
到目前为止,这是我找到的关于 CPT 最清晰的教程,并且作为 WordPress 设计和主题开发的新手,它极大地帮助我“简化”了学习曲线。
非常棒
我遇到了与 Stig 发布的类似问题。
没有名为“assets/css”的目录,我可以在其中放置 team.css 文件。我只是将其放在与所有主题文件相同的目录中(wpcontent/themes/mytheme)
我甚至将条件 CSS 加载代码放在哪个文件中?functions.php?Team-template.php?
嗨 @TheCurryGuy。我想通了。它在我的主题目录中。我认为这可能因您使用的主题而异,因为默认主题(如 twentyfourteen)中不存在该文件夹。
在我的主题中,我发现在
my theme/admin/assets/css
但我猜如果您的主题中不存在,您可以使用 ftp 创建一个同名文件夹。
并将条件 CSS 加载代码放入 functions.php 中。
希望这有帮助!祝你好运
我在分类法方面遇到问题。我之前发布了代码,但没有收到回复。有没有人可以帮助我找到正确的方向?
问题
我创建了一个列表,并且运行良好,但我无法使其与分类法一起使用!
(我正在构建一个新的主题)
我尝试在 get_post 中设置 ‘Regioner’ => ‘en’,但它没有获取到。
我使用的是 q_translate,因此区域设置为“sv”、“en”等等。
我在这里错过了什么?
代码
functions.php 中分类法的标签是
function team_taxonomy() {
// 标签
$singular = 'Region';
$plural = 'Regioner';
$labels = array(
这是输出代码
` ‘en’,
‘post_type’ => ‘team’,
‘posts_per_page’ => -1, // 无限帖子
‘meta_key’ => ‘team_sortorder’, // 应按什么排序 - 这是自定义帖子
‘orderby’ => ‘meta_value’, // “meta_value” 使用 meta_key 参数 - “title” 按名称按字母顺序排序
‘order’ => ‘ASC’,
if ( $team_posts )
?>
`
嗨!
本教程很棒!我大约休息了 2 年后重新开始编码,这个教程一点也没有让我头疼!尽管我遇到一个小问题。
在完成所有步骤(除了创建分类法)到创建“template-team.php”之后,团队资料下输入信息的字段没有出现。还有其他人遇到此问题吗?帮助?拜托?
谢谢,
Nicole
正如其他人所说,这是一个很棒的教程,谢谢。
由于我正在处理的一个特定项目有一个很棒的插件来创建会员网站(S2 Member Pro),我不得不勉强再次使用 WP。我已经一两年没有使用 WP 了,而是使用 MODX,在我看来,MODX 在创建自己的模板和自定义字段方面远优于 WP。我停止使用 WP 的主要原因是,创建我想要的功能非常令人沮丧,而且在此之前的大多数教程都相互矛盾、误导性、过于基础或几乎毫无用处,当然 MODX 教程也存在这种情况。
看起来 ACF 正是我在必须使用 WP 完成某些项目时所需答案。你的教程对 WP 有很好的见解,我可以看到 WP 以及 ACF 现在有更大的潜力,因为没有它,WP 对于合理地进行编码来说太混乱了。
嗨,
我按照教程操作。但在创建团队页面的最后步骤中,我得到一个空白的白色页面,其中显示了团队成员列表,没有任何页眉、页脚和侧边栏。您在演示中显示的链接(Twitter、Facebook、电子邮件等)也不可见。我很想知道我哪里做错了。
我在子主题文件夹中创建了 team-template 函数、functions.php 和模板的 style.css。
仅供参考,我是一个正在尝试使用 WordPress 的新手。
我的团队页面链接:团队页面链接
很棒的教程,感谢您的发布……通过使用人员的姓名作为标题,您只能按名字按字母顺序排序。通常按姓氏排序更有意义——如果我添加了名字和姓氏字段,并删除了对“标题”的支持——那么我就无法从管理区域的帖子列表中编辑帖子(只有将鼠标悬停在标题上才会给我编辑、查看、删除选项)。您知道如何解决此问题吗?谢谢!
我认为您可以在准确编辑哪些文件以及这些文件需要位于服务器上的哪个位置方面更清楚一些。由于在这方面没有任何经验,我花了几个小时和几次重新操作才弄清楚您正在编辑哪些文件以及它们在我的服务器上的位置。特别是样式部分。条件部分到底放在哪里?我将其放在 functions 中并创建了 /assets/ccs/team.css 文件,但它不起作用。我最终会解决的,但可以更清楚地说明事物应该放在哪里。例如,在包含代码的面板中,它只是简单地写着“php”或“css”。在其中放入完整的文件名会更有帮助。再次感谢!
很棒的代码,很棒的老师。我有点难以弄清楚图标调用,但有没有办法对列表进行排序,例如“我”、“编辑”、“贡献者 1”、“贡献者 2”等?
另外,如果我想更改社交图标,例如从 LinkedIn 到 Facebook 等,该怎么做?
您好,感谢此教程。这是我之前在网站后端看到的东西,但我从未见过设置过程如此易于理解地分解。
标题为“性能说明”的部分提供了一些额外的 php 代码。我不确定在哪里添加它。我转到了瞬态 API 上的链接,但仍然迷路了。任何帮助吗?
:/ 我对此有点迷茫。任何帮助将不胜感激。我使用您提供的代码创建了一个新模板……我将对此进行一些研究。我明白我需要以某种方式合并“content-page.php”模板或将引入导航和通用网站布局的模板之一。我不确定在哪里放置您的 css 以及哪个模板?如果有人使用 Canvas 完成过此操作,我正在使用 Canvas。
在 css 的示例目录中,它是 /assets/css/team.css。assets 是否仅用作示例,或者我的网站上应该有一个名为 assets 的目录。如果是,/应该放在前面。
我有种不好的预感,我是在论坛上毫无希望的那个人……任何东西都会受到赞赏!
抱歉发送垃圾邮件。我已经弄清楚了如何添加页眉、页脚、侧边栏。样式有点疑问,但我认为我可以解决它。仍然不确定将“性能说明”放在哪里
很棒的资源!一个问题,如何将图像显示从圆形更改为正方形显示。
您是否有此团队见面页面“插件”的安装程序?
我有团队页面,但样式错误
我的配置。
主题文件夹中的文件
– template-team.php
– /assets/css/team.css
– /assets/css/team.less
– functions.php(注册团队和部门)
如何修复它?
如何在 template-team.php 中加载 team.css?