hi Michael
Thanks for your support
plz see, this code worked and submit post
save title & countent.but not save hotel name & price
also I know very little php But I need it
/**
* Register the form and fields for our front-end submission form
*/
function wds_frontend_form_register() {
$cmb = new_cmb2_box( array(
'id' => 'front-end-post-form',
'object_types' => array( 'post' ),
'hookup' => false,
'save_fields' => false,
) );
$cmb->add_field( array(
'name' => __( 'New Post Title', 'wds-post-submit' ),
'id' => 'submitted_post_title',
'type' => 'text',
'default' => __( 'New Post', 'wds-post-submit' ),
) );
$cmb->add_field( array(
'name' => __( 'New Post Content', 'wds-post-submit' ),
'id' => 'submitted_post_content',
'type' => 'wysiwyg',
'options' => array(
'textarea_rows' => 12,
'media_buttons' => false,
),
) );
$group_field_id = $cmb->add_field( array(
'id' => 'review_criteria',
'type' => 'group',
'options' => array(
'group_title' => __(' hotel No. {#}', 'cmb'),
'add_button' => __('insert hotel', 'cmb'),
'remove_button' => __('remove', 'cmb'),
'sortable' => true,
),
));
$cmb->add_group_field( $group_field_id, array(
'name' => 'hotel name',
'id' => 'ts_hotel',
'type' => 'text',
));
$cmb->add_group_field( $group_field_id, array(
'name' => 'price',
'id' => 'ts_price',
'type' => 'text',
));
}
add_action( 'cmb2_init', 'wds_frontend_form_register' );
/**
* Gets the front-end-post-form cmb instance
*
* @return CMB2 object
*/
function wds_frontend_cmb2_get() {
// Use ID of metabox in wds_frontend_form_register
$metabox_id = 'front-end-post-form';
// Post/object ID is not applicable since we're using this form for submission
$object_id = 'fake-oject-id';
// Get CMB2 metabox object
return cmb2_get_metabox( $metabox_id, $object_id );
}
/**
* Handle the cmb-frontend-form shortcode
*
* @param array $atts Array of shortcode attributes
* @return string Form html
*/
function wds_do_frontend_form_submission_shortcode( $atts = array() ) {
// Get CMB2 metabox object
$cmb = wds_frontend_cmb2_get();
// Get $cmb object_types
$post_types = $cmb->prop( 'object_types' );
// Current user
$user_id = get_current_user_id();
// Parse attributes
$atts = shortcode_atts( array(
'post_author' => $user_id ? $user_id : 1, // Current user, or admin
'post_status' => 'pending',
'post_type' => reset( $post_types ), // Only use first object_type in array
), $atts, 'cmb-frontend-form' );
/*
* Let's add these attributes as hidden fields to our cmb form
* so that they will be passed through to our form submission
*/
foreach ( $atts as $key => $value ) {
$cmb->add_hidden_field( array(
'field_args' => array(
'id' => "atts[$key]",
'type' => 'hidden',
'default' => $value,
),
) );
}
// Initiate our output variable
$output = '';
// Get any submission errors
if ( ( $error = $cmb->prop( 'submission_error' ) ) && is_wp_error( $error ) ) {
// If there was an error with the submission, add it to our ouput.
$output .= '<h3>' . sprintf( __( 'There was an error in the submission: %s', 'wds-post-submit' ), '<strong>'. $error->get_error_message() .'</strong>' ) . '</h3>';
}
// If the post was submitted successfully, notify the user.
if ( isset( $_GET['post_submitted'] ) && ( $post = get_post( absint( $_GET['post_submitted'] ) ) ) ) {
// Get submitter's name
$name = get_post_meta( $post->ID, 'submitted_author_name', 1 );
$name = $name ? ' '. $name : '';
// Add notice of submission to our output
$output .= '<h3>' . sprintf( __( 'Thank you%s, your new post has been submitted and is pending review by a site administrator.', 'wds-post-submit' ), esc_html( $name ) ) . '</h3>';
}
// Get our form
$output .= cmb2_get_metabox_form( $cmb, 'fake-oject-id', array( 'save_button' => __( 'Submit Post', 'wds-post-submit' ) ) );
return $output;
}
add_shortcode( 'cmb-frontend-form', 'wds_do_frontend_form_submission_shortcode' );
/**
* Handles form submission on save. Redirects if save is successful, otherwise sets an error message as a cmb property
*
* @return void
*/
function wds_handle_frontend_new_post_form_submission() {
// If no form submission, bail
if ( empty( $_POST ) || ! isset( $_POST['submit-cmb'], $_POST['object_id'] ) ) {
return false;
}
// Get CMB2 metabox object
$cmb = wds_frontend_cmb2_get();
$post_data = array();
// Get our shortcode attributes and set them as our initial post_data args
if ( isset( $_POST['atts'] ) ) {
foreach ( (array) $_POST['atts'] as $key => $value ) {
$post_data[ $key ] = sanitize_text_field( $value );
}
unset( $_POST['atts'] );
}
// Check security nonce
if ( ! isset( $_POST[ $cmb->nonce() ] ) || ! wp_verify_nonce( $_POST[ $cmb->nonce() ], $cmb->nonce() ) ) {
return $cmb->prop( 'submission_error', new WP_Error( 'security_fail', __( 'Security check failed.' ) ) );
}
// Check title submitted
if ( empty( $_POST['submitted_post_title'] ) ) {
return $cmb->prop( 'submission_error', new WP_Error( 'post_data_missing', __( 'New post requires a title.' ) ) );
}
// And that the title is not the default title
if ( $cmb->get_field( 'submitted_post_title' )->default() == $_POST['submitted_post_title'] ) {
return $cmb->prop( 'submission_error', new WP_Error( 'post_data_missing', __( 'Please enter a new title.' ) ) );
}
/**
* Fetch sanitized values
*/
$sanitized_values = $cmb->get_sanitized_values( $_POST );
// Set our post data arguments
$post_data['post_title'] = $sanitized_values['submitted_post_title'];
unset( $sanitized_values['submitted_post_title'] );
$post_data['post_content'] = $sanitized_values['submitted_post_content'];
unset( $sanitized_values['submitted_post_content'] );
// Create the new post
$new_submission_id = wp_insert_post( $post_data, true );
// If we hit a snag, update the user
if ( is_wp_error( $new_submission_id ) ) {
return $cmb->prop( 'submission_error', $new_submission_id );
}
/**
* Other than post_type and post_status, we want
* our uploaded attachment post to have the same post-data
*/
unset( $post_data['post_type'] );
unset( $post_data['post_status'] );
// Loop through remaining (sanitized) data, and save to post-meta
foreach ( $sanitized_values as $key => $value ) {
if ( is_array( $value ) ) {
$value = array_filter( $value );
if( ! empty( $value ) ) {
update_post_meta( $new_submission_id, $key, $value );
}
} else {
update_post_meta( $new_submission_id, $key, $value );
}
}
/*
* Redirect back to the form page with a query variable with the new post ID.
* This will help double-submissions with browser refreshes
*/
wp_redirect( esc_url_raw( add_query_arg( 'post_submitted', $new_submission_id ) ) );
exit;
}
add_action( 'cmb2_after_init', 'wds_handle_frontend_new_post_form_submission' );