编写“自定义编写面板/Meta框”的最简洁方式?

时间:2011-09-19 作者:Mr.Brown

就像Wordpress中的任何东西一样,似乎有20种方法可以做一些事情,但经过几周的广泛搜索,我真的没有找到更多的教程,这些教程在写作惯例中真正反映了彼此,这总是让我有点不安,当这是我学习的方式时,所以我想发表一篇帖子,问你们,社区,你们觉得怎么样?。。。。

即使你有一个最喜欢的资源,比如网上的教程,那也是非常有用的。我觉得我已经把它们都梳理过了,但通常情况下,询问一组特定的有经验的人通常会得到更好的结果,所以我来了。

*PS-我尝试了DeluxeBlogs类,效果很好,但目前我真正想做的是学习最“正确”的方法,从头开始编写我自己的元框。

谢谢,SB

-----EDIT 1 : Example of one of my current meta boxes -----

<?php
// Register Custom Post Type Meta Boxes -- Description Field
add_action( \'add_meta_boxes\', \'store_description_meta_box_add\' );
function store_description_meta_box_add()
{
    add_meta_box( \'epr_store_description_meta_id\', \'Product Description\', \'store_description_meta_box_cb\', \'epr_store\', \'normal\', \'high\' );
}

function store_description_meta_box_cb( $post )
{
    $values = get_post_custom( $post->ID );
    $textbox = isset( $values[\'meta_box_description_text\'] ) ? esc_attr( $values[\'meta_box_description_text\'][0] ) : \'\';
    wp_nonce_field( \'my_meta_box_nonce\', \'meta_box_nonce\' );
    ?>
        <textarea name="meta_box_description_text" id="meta_box_description_text" style="width:100%; height:100px;text-align:left;">
            <?php echo $textbox; ?>
        </textarea>
    <?php   
}

add_action( \'save_post\', \'epr_description_meta_box_save\' );
function epr_description_meta_box_save( $post_id )
{
    if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
    if( !isset( $_POST[\'meta_box_nonce\'] ) || !wp_verify_nonce( $_POST[\'meta_box_nonce\'], \'my_meta_box_nonce\' ) ) return;
    if( !current_user_can( \'edit_post\' ) ) return;

    $allowed = array( 
        \'a\' => array( 
            \'href\' => array() 
        )
    );

    if( isset( $_POST[\'meta_box_description_text\'] ) )
        update_post_meta( $post_id, \'meta_box_description_text\', wp_kses( $_POST[\'meta_box_description_text\'], $allowed ) );
}
?>
----EDIT 2 : Example of how to remove indentation after saving w/ Chris\' help -----

<?php
// Register Custom Post Type Meta Boxes -- Description Field
add_action( \'add_meta_boxes\', \'store_description_meta_box_add\' );
function store_description_meta_box_add()
{
    add_meta_box( \'epr_store_description_meta_id\', \'Product Description\', \'store_description_meta_box_cb\', \'epr_store\', \'normal\', \'high\' );
}

function store_description_meta_box_cb( $post )
{
    $values = get_post_custom( $post->ID );
    $textbox = isset( $values[\'meta_box_description_text\'] ) ? esc_attr( $values[\'meta_box_description_text\'][0] ) : \'\';
    wp_nonce_field( \'my_meta_box_nonce\', \'meta_box_nonce\' );
    ?>
        <textarea name="meta_box_description_text" id="meta_box_description_text" style="width:100%; height:100px;text-align:left;"><?php echo esc_attr($textbox); ?></textarea>
    <?php   
}

add_action( \'save_post\', \'epr_description_meta_box_save\' );
function epr_description_meta_box_save( $post_id )
{
    if( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) return;
    if( !isset( $_POST[\'meta_box_nonce\'] ) || !wp_verify_nonce( $_POST[\'meta_box_nonce\'], \'my_meta_box_nonce\' ) ) return;
    if( !current_user_can( \'edit_post\' ) ) return;

    $allowed = array( 
        \'a\' => array( 
            \'href\' => array() 
        )
    );

    if( isset( $_POST[\'meta_box_description_text\'] ) )
        update_post_meta( $post_id, \'meta_box_description_text\', wp_kses( $_POST[\'meta_box_description_text\'], $allowed ) );
}
?>

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

我有一种“插件库”,其中包含base class for meta boxes. 基本上,它包含的都是一系列生成表单字段的方法,以及一些我为包含大量内容的元框所做的选项卡式导航。这让我可以更快地开发元框,而不必担心几个小时的表单字段编码。

我将使用它作为实际添加元框的类的父类。该类看起来像这样:

<?php
class wpseMetaBox extends davispressMetaBoxTools
{
    function __construct()
    {
        add_action( \'add_meta_boxes\', array( &$this, \'add_meta_box\' ) );
        add_action( \'save_post\', array( &$this, \'save\' ), 10, 1 );
        add_action( \'load-edit.php\', array( &$this, \'add_styles_scripts\' ) );
        add_action( \'load-post-new.php\', array( &$this, \'add_styles_scripts\' ) );
    }

    function add_meta_box()
    {
        add_meta_box( \'some-metabox\', \'Meta Box Title\', array( &$this, \'meta_box_cb\' ), \'post\' );
    }

    function meta_box_cb( $post )
    {
        wp_nonce_field( \'wpse_nonce\', \'wpse_nonce\' );
        // add fields here
        $o = $this->textinput( \'_some_id\', \'Some Label\', $post->ID );
        echo $this->form_table( $o );
        // etc.
    }

    function save( $post_id )
    {
        // verify we can do this
        if( ! isset( $_REQUEST[\'wpse_nonce\'] ) || ! wp_verify_nonce( $_REQUEST[\'wpse_nonce\'], \'wpse_nonce\' ) ) return;
        if( ! current_user_can( \'edit_post\' ) ) return;

        // save data
        if( isset( $_REQUEST[\'_some_id\'] ) )
            update_post_meta( $post_id, \'_some_id\', esc_attr( $_REQUEST[\'_some_id\'] ) );
    }

    function add_styles_scripts()
    {
        // check and see if we\'re on the post type with the meta box
        if( ( isset( $_REQUEST[\'post\'] ) && \'post\' == get_post_type( $_REQUEST[\'post\'] ) ) || ( isset( $_REQUEST[\'post_type\'] ) && \'post\' == $_REQUEST[\'post_type\'] ) ) 
        {
            add_action( \'admin_print_scripts\', array( &$this, \'scripts\' ) );
            add_action( \'admin_print_styles\', array( &$this, \'styles\' ) );
        }
    }

    function scripts()
    {
        // wp_enqueue_script here
    }

    function styles()
    {
        // wp_enqueue_style here
    }
}
创建元框最痛苦的部分是编写输出所有内容的实际元框回调函数。它花费的时间最长,似乎这是最容易抽象的东西。所以我就是这么做的。其他人可能会有很多不同的意见。

综上所述:有时元框(以及插件/主题的任何其他部分)不适合模具。你必须知道什么时候应该放弃那些让事情变得容易的东西,去满足形势的需要。不要仅仅因为你创建了工具就被锁定在工具中。

tutorial 也许你也会感兴趣。它没有上述内容,只是一个基本的操作方法。

SO网友:Ray Gulick

当编辑主题函数文件是一个选项时,我对插件不是很在行,但更多字段插件节省了很多时间,所以我用它来代替。它快速、简单,并为我提供了许多选项来创建分组在元框中的不同类型的字段,这些字段可以分配给特定的帖子类型。

结束