如何从前端到后端在自定义帖子类型中保存多个值

时间:2019-03-03 作者:user2631855

我在WordPress中创建了一个插件,我创建了名为“发票”的自定义帖子类型,这是代码

add_action(\'init\', \'invoices_register\'); 

function invoices_register() {

$labels = array(
    \'name\' => _x(\'Invoices\', \'post type general name\'),
    \'singular_name\' => _x(\'Invoice\', \'post type singular name\'),
    \'add_new\' => _x(\'Add New Invoice \', \'Device\'),
    \'add_new_item\' => __(\'Add New Invoice\'),
    \'edit_item\' => __(\'Edit Invoice\'),
    \'new_item\' => __(\'New Invoice\'),
    \'view_item\' => __(\'View Invoices\'),
    \'search_items\' => __(\'Search Invoices\'),
    \'not_found\' =>  __(\'No Invoices\'),
    \'not_found_in_trash\' => __(\'No Invoices Here\'),
    \'parent_item_colon\' => \'\'
);

$args = array(
    \'labels\' => $labels,
    \'public\' => true,
    \'publicly_queryable\' => true,
    \'show_ui\' => true,
    \'query_var\' => true,
    \'rewrite\' => true,
    \'capability_type\' => \'post\',
    \'hierarchical\' => false,
    \'menu_position\' => null,
    \'supports\' => array(\'title\',\'editor\')
  );

register_post_type( \'invoices\' , $args );
}
然后我创建了重复的元框,这是代码

    <?php
add_action( \'add_meta_boxes\', \'mb_add_custom_box\' );

/* Do something with the data entered */
add_action( \'save_post\', \'mb_save_postdata\' );

/* Adds a box to the main column on the Post and Page edit screens */
function mb_add_custom_box() {
    add_meta_box(
        \'invocie_details\',
        __( \'Invocie Details\', \'myplugin_textdomain\' ),
        \'mb_inner_custom_box\',
        \'invoices\');
}

/* Prints the box content */
function mb_inner_custom_box() {
    global $post;
    // Use nonce for verification
    wp_nonce_field( plugin_basename( __FILE__ ), \'mbMeta_noncename\' );
    ?>
    <div id="meta_inner">
    <?php

    //get the saved meta as an array
    $invocies = get_post_meta($post->ID,\'invocies\',false);
  //  print_r($invocies);

    $c = 0;
    if ( count( $invocies ) > 0 ) {
        if(!empty($invocies)){
            foreach( $invocies as $track_val ) {

                foreach( $track_val as $track ) {
                    //var_dump($track);
                    if ( isset( $track[\'service\'] ) || isset( $track[\'price\'] ) || isset( $track[\'status\']) || isset( $track[\'client\']) )  {
                        printf( \'<p>invocie service <input type="text" name="invocies[%1$s][service]" value="%2$s" /> &nbsp;&nbsp; invocie price : <input type="text" name="invocies[%1$s][price]" value="%3$s" /><br> invocie staus : <input type="text" name="invocies[%1$s][status]" value="%4$s" />&nbsp;&nbsp; invocie client : <input type="text" name="invocies[%1$s][client]" value="%5$s" /><span class="remove">%6$s</span></p>\', $c, $track[\'service\'], $track[\'price\'],$track[\'status\'],$track[\'client\'], __( \'Remove Invocie\' ) );
                        $c = $c +1;
                    }
                }
            }
        }    
    }

    ?>


<span id="here"></span>
<span class="add"><?php _e(\'Add Invoice\'); ?></span>
<script>
    var $ =jQuery.noConflict();
    $(document).ready(function() {
        var count = <?php echo $c; ?>;
        $(".add").click(function() {
            count = count + 1;

            $(\'#here\').append(\'<p>invocie service <input type="text" name="invocies[\'+count+\'][service]" value="" /> &nbsp;&nbsp; invocie price : <input type="text" name="invocies[\'+count+\'][price]" value="" /><br> invocie staus : <input type="text" name="invocies[\'+count+\'][status]" value="" />&nbsp;&nbsp; invocie client : <input type="text" name="invocies[\'+count+\'][client]" value="" /><span class="remove">Remove Invocie</span></p>\' );
            return false;
        });
        $(".remove").live(\'click\', function() {
            $(this).parent().remove();
        });
    });
    </script>
</div><?php

}

/* When the post is saved, saves our custom data */
function mb_save_postdata( $post_id ) {
    // verify if this is an auto save routine. 
    // If it is our form has not been submitted, so we dont want to do anything
    if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) 
        return;

    // verify this came from the our screen and with proper authorization,
    // because save_post can be triggered at other times
    if ( !isset( $_POST[\'mbMeta_noncename\'] ) )
        return;

    if ( !wp_verify_nonce( $_POST[\'mbMeta_noncename\'], plugin_basename( __FILE__ ) ) )
        return;

    // OK, we\'re authenticated: we need to find and save the data

    $invocies = $_POST[\'invocies\'];

    update_post_meta($post_id,\'invocies\',$invocies);
}
然后,我创建了自定义页面模板,以从前端插入新发票,但问题是在创建新帖子时,保存不使用元框此处的代码

 if(isset($_POST[\'submit\']) == \'1\') {
                            $post_title = $_POST[\'tile\'];
                            //$post_category = $_POST[\'cat\'];
                            //$post_content = $_POST[\'post_content\'];

                            $new_post = array(
                                 // \'ID\' => \'\',
                                  \'post_type\' => \'invoices\',
                                  //\'post_author\' => $user->ID, 
                                  //\'post_category\' => array($post_category),
                                 // \'post_content\' => $post_content, 
                                 // \'post_title\' => $post_title,
                                  \'post_status\' => \'publish\',
                                  \'meta_input\' => array(
                                    \'invociesp[service]\' => $_POST[\'service\'],
                                    \'invocies[price]\' => $_POST[\'price\'],
                                    \'invocies[status]\' => $_POST[\'status\'],
                                    \'invocies[client]\' => $_POST[\'client\'],

                                   // \'_flatsome_case_type\' => $_POST[\'type\'],

                                    //\'city\' => $post[\'city\']
                                  )
                                );

                            $post_id = wp_insert_post($new_post,true);
                            if($post_id ==true){
                              echo \'<script language="javascript">alert("You Create a New case successfully")</script>\';                            

                            }

1 个回复
SO网友:Antti Koskinen

wp_insert_uses (trac)要处理的以下循环meta_input,

if ( ! empty( $postarr[\'meta_input\'] ) ) {
  foreach ( $postarr[\'meta_input\'] as $field => $value ) {
    update_post_meta( $post_ID, $field, $value );
  }
}
所以如果你改变meta_input 在你的新帖子中,

\'meta_input\'  => array(
  \'invocies\'  => array(
    \'service\' => $_POST[\'service\'],
    \'price\'   => $_POST[\'price\'],
    \'status\'  => $_POST[\'status\'],
    \'client\'  => $_POST[\'client\'],
  ),
)
我认为数据会正确保存。

相关推荐

Starting with tabbed metabox

我的插件需要一个带选项卡的metabox。实际上,它们是5个代谢箱,每个都在一个选项卡中。我找到了以下脚本:https://speckyboy.com/10-simple-code-snippets-creating-beautiful-tabs/哪一个最适合在元框中使用?最好只有CSS?JS必须注册?我想开始测试这些脚本,但想知道从哪里开始。非常感谢。