您需要为此使用自定义的帖子类型。但不要让“自定义帖子类型”这个词吓跑你。
例如one of my clients 需要出示一张显示不同合作伙伴的“线路卡”。最初,他们想要的只是各种合作伙伴的名称和徽标。在我构建了这个特性之后,他们想为每个合作伙伴添加一个描述。
自定义帖子类型最终包括标题、编辑器和缩略图。最终用户可以创建新的“合作伙伴”,并在传统的WordPress后期编辑屏幕中输入内容-无需在任何地方编辑代码。
然后,他们的线路卡页面使用自定义快捷码呈现,该快捷码以易于阅读的格式显示所有合作伙伴。
添加自定义帖子类型的代码相当简单。只需定义要调用的内容并适当设置字符串:
add_action( \'init\', \'manufacturer_post_type\' );
function manufacturer_post_type() {
$labels = array(
\'name\' => \'Manufacturers\',
\'singular_name\' => \'Manufacturer\',
\'add_new_item\' => \'Add New Manufacturer\',
\'edit_item\' => \'Edit Manufacturer\',
\'new_item\' => \'New Manufacturer\',
\'all_items\' => \'All Manufacturers\',
\'view_item\' => \'View Manufacturers\',
\'search_items\' => \'Search Manufacturers\',
\'not_found\' => \'No manufacturers found\',
\'not_found_in_trash\' => \'No manufacturers found in trash\',
\'menu_name\' => \'Manufacturers\'
);
$args = array(
\'labels\' => $labels,
\'capability_type\' => \'post\',
\'public\' => true,
\'menu_position\' => 20,
\'show_ui\' => true,
\'publicly_queryable\' => false,
\'show_in_menu\' => true,
\'query_var\' => false,
\'rewrite\' => false,
\'has_archive\' => false,
\'supports\' => array(
\'title\',
\'editor\',
\'thumbnail\'
),
\'can_export\' => true,
);
register_post_type( \'adapt-manufacturer\', $args );
}
然后是描述和定义输出的问题。这个
[linecard]
下面的短代码示例是从数据库中提取此信息并在屏幕上呈现的所有工作:
add_shortcode( \'linecard\', \'line_card_shortcode\' );
function line_card_shortcode( $atts ) {
$results = get_manufacturers();
$output = \'<table cellspacing="20px" width="100%"><tbody>\';
$count = 0;
$closed = true;
while ( $results->have_posts()) : $results->the_post();
if ( $count == 0 ) {
$output .= \'<tr valign="top">\';
$closed = false;
}
$link = get_post_meta( get_the_ID(), \'manufacturer_link\', true );
$output .= \'<td width="33%">\';
$output .= \'<strong><a href="\' . $link . \'">\' . get_the_title() . \'</a></strong><br />\';
$output .= get_the_content();
$output .= \'</td>\';
$count++;
if ( $count == 3 ) {
$output .= \'</tr>\';
$closed = true;
$count = 0;
}
endwhile;
if ( !$closed ) $output .= \'</tr>\';
$output .= "</tbody></table>";
return $output;
}
此外,一旦将内容加载到数据库中,您可以根据需要将其拉出。除了线路卡之外,我的客户在其网站的首页上还有一个滚动的合作伙伴徽标旋转木马,所有这些都使用完全相同的数据。
我实际上删除了我用来向客户的自定义帖子类型添加“链接”字段的代码,因为它看起来并不重要。但将自定义元框添加到使用register_post_type()
这相当容易。
步骤1:将metabox回调添加到$args
阵列:
$args = array(
\'labels\' => $labels,
\'capability_type\' => \'post\',
// ... other entries removed for brevity
\'register_meta_box_cb\' => \'manufacturer_meta\',
);
然后定义回调函数:
function manufacturer_meta() {
add_meta_box(
\'manufacturer_link\',
\'Link to Manufacturer Site\',
\'manufacturer_link_meta_box\',
\'adapt-manufacturer\',
\'normal\',
\'high\'
);
}
在这个特定的示例中,我添加了一个元框,允许用户添加指向外部制造商网站的链接。核心功能在于
manufacturer_link_meta_box()
接下来就是
all of the normal rules 接下来是自定义元框。
元框的完整代码PLEASE DO NOT USE THIS CODE VERBATIM IN YOUR SITE! 您绝对需要修改代码以符合您的目的,所以不要只是将其复制粘贴到您自己的系统中。
// This function generates the actual markup of the meta box
function manufacturer_link_meta_box( $post ) {
$link = get_post_meta( $post->ID, \'manufacturer_link\', true );
wp_nonce_field( plugin_basename(__FILE__), \'manufacturer_link_nonce\' );
echo \'<label for="manufacturer_link">Site URL:</label>\';
echo \'<input type="text" id="manufacturer_link" name="manufacturer_link" size="150" value="\';
echo $link;
echo \'" />\';
}
// When the post is saved/updated, you need to save the content of the meta box as well
add_action( \'save_post\', \'save_manufacturer_link\' );
function save_manufacturer_link( $post_id ) {
if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE )
return;
if ( ! isset( $_POST[\'manufacturer_link\'] ) || ! wp_verify_nonce( $_POST[\'manufacturer_link_nonce\'], plugin_basename(__FILE__) ) )
return;
if ( ! current_user_can( \'edit_post\', $post_id ) )
return;
$link = $_POST[\'manufacturer_link\'];
update_post_meta( $post_id, \'manufacturer_link\', $link );
}