就像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 ) );
}
?>
最合适的回答,由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 也许你也会感兴趣。它没有上述内容,只是一个基本的操作方法。