我将保留主内容字段,并添加一个元框+wp编辑器的辅助实例(使用handywp_editor
函数)。
自定义字段值在数据库中存储为LONGTEXT
, 所以他们可以处理你想扔给他们的任何东西。
一个总结一切的课程。这里有几个常量,我们稍后将使用。
<?php
class Secondary_Content
{
// meta key we\'ll use to save things.
const META = \'_secondary_content\';
// nonce name to check
const NONCE = \'_s_content_nonce\';
// post type to which we\'ll add the box
const TYPE = \'page\';
private static $ins = null;
public static function init()
{
add_action(\'plugins_loaded\', array(self::instance(), \'_setup\'));
}
public static function instance()
{
is_null(self::$ins) && self::$ins = new self;
return self::$ins;
}
public function _setup()
{
// we\'ll add actions here later.
}
}
要添加元框,请将其挂入
add_meta_boxes_{{YOUR_POST_TYPE}}
. 我将在这个示例中使用pages。更改
TYPE
类中的常量,使其适用于自定义帖子类型。
<?php
class Secondary_Content
{
// snip snip
public function _setup()
{
add_action(\'add_meta_boxes_\' . self::TYPE, array($this, \'add_box\'));
}
/**
* Adds a meta box to the `page` post type.
*
* @uses add_meta_box
* @return void
*/
public function add_box()
{
add_meta_box(
\'secondary-content\',
__(\'Secondary Content\', \'wspe\'),
array($this, \'box_cb\'),
self::TYPE,
\'normal\',
\'high\'
);
}
/**
* Metabox callback function.
*
* @access public
* @param object $post The current $post
* @uses get_post_meta
* @uses wp_editor
* @return void
*/
public function box_cb($post)
{
wp_nonce_field(self::NONCE . $post->ID, self::NONCE, false);
wp_editor(
get_post_meta($post->ID, self::META, true),
self::META
);
}
}
上面还包括元框回调。它只是弹出一个供我们验证的nonce,以及编辑器字段,使用
wp_editor
.
现在我们只需要save_post
保存东西。我们会检查以确保我们使用了正确的帖子类型。然后验证nonce并检查当前用户是否有编辑帖子的权限,然后只需调用update_post_meta
或delete_post_meta
视情况而定。这里唯一需要注意的是,我检查当前用户是否可以发布未过滤的HTML。如果可以的话,我会让元盒子里的任何东西通过。如果没有,最好把它完成wp_filter_post_kses
.
<?php
class Secondary_Content
{
// snip snip
public function _setup()
{
add_action(\'add_meta_boxes_\' . self::TYPE, array($this, \'add_box\'));
add_action(\'save_post\', array($this, \'save\'), 10, 2);
}
// snip snip
/**
* Hooked into `save_post`. Makes sure this is the request we want and the
* user has permission, then saves the custom field.
*
* @access public
* @param int $post_id
* @param object $post
* @uses wp_verify_nonce
* @uses current_user_can
* @uses update_post_meta
* @uses delete_post_meta
* @return void
*/
public function save($post_id, $post)
{
if(
self::TYPE != $post->post_type ||
(defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE)
) return;
if(
!isset($_POST[self::NONCE]) ||
!wp_verify_nonce($_POST[self::NONCE], self::NONCE . $post_id)
) return;
if(!current_user_can(\'edit_post\', $post_id))
return;
if(!empty($_POST[self::META]))
{
update_post_meta(
$post_id,
self::META,
current_user_can(\'unfiltered_html\') ?
$_POST[self::META] : wp_filter_post_kses($_POST[self::META])
);
}
else
{
delete_post_meta($post_id, self::META);
}
}
}
要在前端获取此内容,只需执行以下操作
echo get_post_meta($post->ID, \'_secondary_content\', true);
循环中的某个地方。但在我们的类中包含包装器函数可能更好。
<?php
class Secondary_Content
{
// snip snip
/**
* Meant to be used as a template tag. A simple helper to spit out our
* secondary content.
*
* @access public
* @param object $post
* @param bool $echo (optional) defaults to true.
* @uses get_post_meta
* @return string
*/
public static function content($post, $echo=true)
{
$res = apply_filters(\'secondary_content\',
get_post_meta($post->ID, self::META, true));
if($echo)
echo $res;
return $res;
}
}
现在你可以
Secondary_Content::content($post);
去拿东西。
最后一点注意:此内容不会像wpautop
或类似的。如果要这样做,需要将其作为过滤器添加到最终输出中。
<?php
add_filter(\'secondary_content\', \'wpautop\');
最终结果:
以上所有内容as a plugin.