使用unction.php添加meta box

时间:2012-03-18 作者:user5601

嗨,有人知道我如何使用下面的代码添加其他元框并将数据保存在不同的自定义字段中吗。

<?php
function add_meta_boxes() {
    add_meta_box(
        \'repeatable-fields\',
        \'Audio Playlist\',
        \'repeatable_meta_box_display\',
        \'post\',
        \'normal\',
        \'high\');
}
add_action(\'admin_menu\', \'add_meta_boxes\');


function repeatable_meta_box_display() {
    global $custom_meta_fields, $post;
    wp_nonce_field( \'repeatable_meta_box_nonce\', \'repeatable_meta_box_nonce\' );
    //$repeatable_fields = get_post_meta($post->ID, $prefix, true);
?>
    <script type="text/javascript">
jQuery(document).ready(function($) {
    $(\'.metabox_submit\').click(function(e) {
        e.preventDefault();
        $(\'#publish\').click();
    });
    $(\'#add-row\').on(\'click\', function() {
        var row = $(\'.empty-row.screen-reader-text\').clone(true);
        row.removeClass(\'empty-row screen-reader-text\');
        row.insertBefore(\'#repeatable-fieldset-one tbody>tr:last\');
        return false;
    });
    $(\'.remove-row\').on(\'click\', function() {
        $(this).parents(\'tr\').remove();
        return false;
    });

    $(\'#repeatable-fieldset-one tbody\').sortable({
        opacity: 0.6,
        revert: true,
        cursor: \'move\',
        handle: \'.sort\'
    });
});
    </script>
<?php 
        $meta = get_post_meta($post->ID, \'custom_audio\', true);
?>
    <table id="repeatable-fieldset-one" width="100%">
    <thead>
        <tr>
            <th width="2%"></th>
            <th width="30%">Name</th>
            <th width="60%">URL</th>
            <th width="2%"></th>
        </tr>
    </thead>
    <tbody>
    <?php

        if ( $meta ) {

            foreach ( $meta as $field ) {
?>
    <tr>
        <td><a class="button remove-row" href="#">-</a></td>
        <td><input type="text" class="widefat" name="name[]" value="<?php if($field[\'name\'] != \'\') echo esc_attr( $field[\'name\'] ); ?>" /></td>

        <td><input type="text" class="widefat" name="url[]" value="<?php if ($field[\'url\'] != \'\') echo esc_attr( $field[\'url\'] ); else echo \'http://\'; ?>" /></td>
        <td><a class="sort">|||</a></td>

    </tr>
    <?php
            }
         } else {
            // show a blank one
?>
    <tr>
        <td><a class="button remove-row" href="#">-</a></td>
        <td><input type="text" class="widefat" name="name[]" /></td>


        <td><input type="text" class="widefat" name="url[]" value="http://" /></td>
<td><a class="sort">|||</a></td>

    </tr>
    <?php } ?>

    <!-- empty hidden one for jQuery -->
    <tr class="empty-row screen-reader-text">
        <td><a class="button remove-row" href="#">-</a></td>
        <td><input type="text" class="widefat" name="name[]" /></td>


        <td><input type="text" class="widefat" name="url[]" value="http://" /></td>
<td><a class="sort">|||</a></td>

    </tr>
    </tbody>
    </table>

    <p><a id="add-row" class="button" href="#">Add another</a>
    <input type="submit" class="metabox_submit" value="Save" />
    </p>
    <?php

}

add_action(\'save_post\', \'repeatable_meta_box_save\');
function repeatable_meta_box_save($post_id) {
    global $custom_meta_fields;
    if ( ! isset( $_POST[\'repeatable_meta_box_nonce\'] ) ||
        ! wp_verify_nonce( $_POST[\'repeatable_meta_box_nonce\'], \'repeatable_meta_box_nonce\' ) )
        return;

    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE)
        return;

    if (!current_user_can(\'edit_post\', $post_id))
        return;

    // loop through fields and save the data
        $old = get_post_meta($post_id, \'custom_audio\', true);
        $new = array();


        $names = $_POST[\'name\'];
        $urls = $_POST[\'url\'];

        $count = count( $names );

        for ( $i = 0; $i < $count; $i++ ) {
            if ( $names[$i] != \'\' ) :
                $new[$i][\'name\'] = stripslashes( strip_tags( $names[$i] ) );


            if ( $urls[$i] == \'http://\' )
                $new[$i][\'url\'] = \'\';
            else
                $new[$i][\'url\'] = stripslashes( $urls[$i] ); // and however you want to sanitize
            endif;
        }

        if ( !empty( $new ) && $new != $old )
            update_post_meta( $post_id, \'custom_audio\', $new );
        elseif ( empty($new) && $old )
            delete_post_meta( $post_id, \'custom_audio\', $old );

} ?>

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

function add_meta_boxes() {
     add_meta_box(
          \'repeatable-fields\',
          \'Audio Playlist\',
          \'repeatable_meta_box_display\',
          \'post\',
          \'normal\',
          \'high\');

     add_meta_box(
          \'wpa-45985\',
          \'Wordpress Answers Metabox\',
          \'wpa_meta_box_display\',
          \'post\',
          \'normal\',
          \'high\');

} add_action(\'admin_menu\', \'add_meta_boxes\');
只需定义第二个元框,然后定义其显示功能和保存功能。这完全一样。除此之外,如果要将其另存为其他元条目,则将更改所有新输入的name属性。

例如:您的第一个元框的名称为=“custom\\u audio[]”,因此要将第二个框保存在不同的元条目中,您可以对元输入进行不同的命名

<input type="text" name="wpa_45985[\'input1\']" />
<input type="text" name="wpa_45985[\'input2\']" />
此框中的所有元将保存在元密钥wpa\\U 45985中

编辑#1:添加显示和保存回调。您应该在save函数中添加一些数据卫生功能,但这应该是一个良好的开端

function wpa_meta_box_display() {
    global $post;
    wp_nonce_field( \'wpa_45985\', \'wpa_45985_nonce\' );


$meta = get_post_meta($post->ID, \'wpa_45985\', true);

$foo = isset($meta[foo]) ? $meta[foo] : \'\';
$bar = isset($meta[bar]) ? $meta[bar] : \'\';
?>
<input type="text" class="widefat" name="wpa_45985[foo]" value="<?php echo $foo; ?>"/>
<input type="text" class="widefat" name="wpa_45985[bar]" value="<?php echo $bar; ?>"/>


<?php

}

add_action(\'save_post\', \'wpa_meta_box_save\');
function wpa_meta_box_save($post_id) {
    global $custom_meta_fields;
    if ( ! isset( $_POST[\'wpa_45985_nonce\'] ) ||
        ! wp_verify_nonce( $_POST[\'wpa_45985_nonce\'], \'wpa_45985\' ) )
        return;

    if (defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE)
        return;

    if (!current_user_can(\'edit_post\', $post_id))
        return;

    update_post_meta($post_id,\'wpa_45985\',$_POST[\'wpa_45985\']);

} ?>

结束

相关推荐

通过Admin AJAX调用进行Metabox克隆的问题

我创建了一个相当简单的类,用于在wordpress admin中处理元盒的创建。我已经设置了该类,以便该类的每个实例都表示一个新的元盒定义。每个类实例都将其元盒定义存储为一个私有类变量,该变量在整个类中用于绘制元盒字段等。到目前为止,一切正常。有一个单独的类变量,用于定义metabox是否可重复。如果是,metabox类会添加必要的操作和javascript来处理admin ajax调用。现在,这个对管理ajax的调用导致了一个奇怪的问题。出于某种原因,admin ajax调用总是返回第一个创建的元盒的元