Multiple Content Block

时间:2012-11-17 作者:Omar Mir

我正在尝试创建一个自定义帖子类型,并希望该帖子类型有两个内容块。因此,在循环中,我可以分别请求content-1和content-2。

我可以编写代码,只是很难弄清楚应该如何开始,也就是说,有没有办法轻松添加另一个“帖子内容”块。我是否应该删除现有的内容块并使用两个自定义字段(自定义字段是否可以使用厨房水槽?)?

谢谢

1 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

我将保留主内容字段,并添加一个元框+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_metadelete_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\');
最终结果:

Secondary Content

以上所有内容as a plugin.

结束