0

I've been researching frontend post-editing/creating forms, but I can't seem to find anything about having multiple forms on the same page. Please excuse my shaky understanding of POST methods.

Here is a page that does a query for all the current user's drafts of post_type classified. It then iterates through all the posts and creates an edit form for each.

<?php
/**
 * Template Name: Edit Post
 *
 * This is the default template.  It is used when a more specific template can't be found to display
 * posts.  It is unlikely that this template will ever be used, but there may be rare cases.
 */
get_header(); // Loads the header.php template.

do_action( 'before_content' ); // supreme_before_content
do_action( 'templ_before_container_breadcrumb' );

?>
<title>Edit your classifieds</title>
<section id="content" class="large-9 small-12 columns">
<?php do_action( 'open_content' ); ?>

<?php
$user = wp_get_current_user()->data;
$user_id = $user->ID;

$query = new WP_Query(array(
    'post_type' => 'classified',
    'post_status' => 'draft',
    'author' => $user_id,
    // 'posts_per_page' => -1
));
echo "<h1>Edit your pending classifieds</h1><br>";
echo "<p>The following posts are your pending classifieds. After you edit a classified, it will be reviewed by our team before publishing.</p>";
?>
<div class="accordion" id="post-listing"><?php
    while ($query->have_posts()) {

        $query->the_post();

        // process form
        // if ( 'POST' == $_SERVER['REQUEST_METHOD'] ) {
        if ( 'POST' == $_SERVER['REQUEST_METHOD'] && ! empty($_POST['post_id']) && ! empty($_POST['post_title']) && isset($_POST['postcontent']) ) {

            header('Location: /');

            $post_id = $post->ID;
            $post = array(
                'ID'             => esc_sql($post_id),
                'post_content'   => esc_sql($_POST['postcontent']),
                'post_title'     => esc_sql($_POST['post_title'])
            );
            wp_update_post($post);
            ?><pre><?php var_dump($_POST);?></div>pre><?php
            if ( isset($_POST['owner_name']) ) update_post_meta($post_id, 'owner_name', esc_sql($_POST['owner_name']) );
            if ( isset($_POST['phone']) ) update_post_meta($post_id, 'phone', true );
            if ( isset($_POST['address']) ) update_post_meta($post_id, 'address', true );
            if ( isset($_POST['zip_code']) ) update_post_meta($post_id, 'zip_code', true );
            if ( isset($_POST['add_coupon']) ) update_post_meta($post_id, 'add_coupon', true );
        }


        wp_nonce_field( 'update_post_'. get_the_ID(), 'update_post_nonce' );


        $fields = get_post_meta($post->ID);

        $name    = $fields["owner_name"][0];
        $phone   = $fields["phone"][0];
        $address = $fields["address"][0];
        $zip     = $fields["zip_code"][0];
        $coupon  = $fields["add_coupon"][0];
        ?>
        <div class="accordion-navigation step-wrapper">
            <a class="step-heading" href="#" onclick="toggle(edit_post_<?php echo $post->ID; ?>);"><span style="float: none;max-width: unset;text-align: left;padding-left: 26px;"><h4 style="margin: 0">Edit <?php echo $post->post_title; ?></h4></span></a>
            <div class="step-post content  clearfix" id="edit_post_<?php echo $post->ID; ?>" href="#">
                <form id="post" class="dropzone form_front_style" method="post" enctype="multipart/form-data">

                    <input type="hidden" name="post_id" value="<?php the_ID(); ?>" />
                    <div class="step-post content  clearfix current">
                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="post_title">Title</label>
                        <input class="textfield" type="text" id="post_title" name="post_title" value="<?php echo $post->post_title; ?>" /></div>

                        <h3>Classified Information</h3>
                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="post_title">Detail</label>
                        <span style="color: #333"><?php wp_editor( $post->post_content, 'postcontent' ); ?></span></div>

                        <h3>Seller Contact Information</h3>
                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="post_title">Owner Name</label>
                        <input class="textfield" type="text" id="name" name="owner_name" value="<?php echo $name; ?>" /></div>

                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="post_title">Phone</label>
                        <input class="textfield" type="text" id="phone" name="phone" value="<?php echo $phone; ?>" /></div>

                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="post_title">Address</label>
                        <input class="textfield" type="text" id="address" name="address" value="<?php echo $address; ?>" /></div>

                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="post_title">Zip</label>
                        <input class="textfield" type="text" id="zip_code" name="zip_code" value="<?php echo $zip; ?>" /></div>

                        <h3>Coupons</h3>
                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="post_title">Add Coupon</label>
                        <input class="textfield" <?php echo $coupon ? "disabled style='background-color:#f8f8f8;color:#bdbcbc;'" : ""; ?> type="text" id="add_coupon" name="add_coupon" value="<?php echo $coupon; ?>" /></div>

                        <input class="textfield" type="submit" id="submit" value="Update" />
                    </div>
                </form>
            </div>
        </div>
    <?php
    }
    ?>
</div>
</section>
<!-- #content -->
<?php do_action( 'after_content' );
$page_for_posts = get_option( 'page_for_posts' );

if ( $page_for_posts != '' ) {
   apply_filters( 'supreme-post-listing-sidebar',supreme_post_listing_sidebar() 
);// load the side bar of listing page
} else {    
  get_sidebar();
}
get_footer();
?>

<script>
// open accordion when anchor link directly above is clicked
function toggle(target) {
  var   i,
  active_elements = document.getElementsByClassName("active"),
  clicked = document.getElementById(target['id']);

  if (!clicked.classList.contains("active")) {
    for (i = 0; i < active_elements.length; i++) {
        active_elements[i].classList.remove("active");
    }
  }
  clicked.classList.toggle("active");
}
</script>

The form seems to be working, but when a user updates the post_title or post_content, all the posts get updated with that value.

(Also, the meta fields - phone, address, etc - don't get updated at all..)

Any help is appreciated!

2
  • Is it intentional that every form element has the same ID? IDs are meant to be unique
    – Tom J Nowell
    Jul 2, 2018 at 13:24
  • Thanks for catching that @TomJNowell that was not intentional. Jul 2, 2018 at 13:30

1 Answer 1

1

What was happening was, the global variable $post wasn't ending up on the POST page - so in the conditional below where the form was being processes,

if ( 'POST' == $_SERVER['REQUEST_METHOD'] && ! empty($_POST['post_id']) && ! empty($_POST['post_title']) && isset($_POST['postcontent']) ) {

        header('Location: /');

        $post_id = $post->ID;
        $post = array(
            'ID'             => esc_sql($post_id),
            'post_content'   => esc_sql($_POST['postcontent']),
            'post_title'     => esc_sql($_POST['post_title'])
        );
        wp_update_post($post);

        if ( isset($_POST['owner_name']) ) update_post_meta($post_id, 'owner_name', esc_sql($_POST['owner_name']) );
        if ( isset($_POST['phone']) ) update_post_meta($post_id, 'phone', true );
        if ( isset($_POST['address']) ) update_post_meta($post_id, 'address', true );
        if ( isset($_POST['zip_code']) ) update_post_meta($post_id, 'zip_code', true );
        if ( isset($_POST['add_coupon']) ) update_post_meta($post_id, 'add_coupon', true );
    }

$post_id evaluated to null.

My solution was to get the ID from the $_POST object. Here's the revised code:

    if ( 'POST' == $_SERVER['REQUEST_METHOD'] && ! empty($_POST['post_id']) && ! empty($_POST['post_title']) && isset($_POST['postcontent']) ) {

            header('Location: /');

            $post_id = $post->ID;
            $post = array(
                'ID'             => $_POST['post_id'], // use $_POST object instead of global $post
                'post_content'   => esc_sql($_POST['postcontent']),
                'post_title'     => esc_sql($_POST['post_title'])
            );

            wp_update_post($post);


            if ( isset($_POST['owner_name']) ) update_post_meta($_POST['post_id'], 'owner_name', esc_sql($_POST['owner_name']) );
            if ( isset($_POST['phone']) ) update_post_meta($_POST['post_id'], 'phone', esc_sql($_POST['phone']) );
            if ( isset($_POST['address']) ) update_post_meta($_POST['post_id'], 'address', esc_sql($_POST['address']) );
            if ( isset($_POST['zip_code']) ) update_post_meta($_POST['post_id'], 'zip_code', esc_sql($_POST['zip_code']) );
            if ( isset($_POST['add_coupon']) ) update_post_meta($_POST['post_id'], 'add_coupon', esc_sql($_POST['add_coupon']) );
        }

And the full page for reference

<?php
/**
 * Template Name: Edit Post
 *
 * This is the default template.  It is used when a more specific template can't be found to display
 * posts.  It is unlikely that this template will ever be used, but there may be rare cases.
 */
get_header(); // Loads the header.php template.

do_action( 'before_content' ); // supreme_before_content
do_action( 'templ_before_container_breadcrumb' );

?>
<title>Edit your classifieds</title>
<section id="content" class="large-9 small-12 columns">
<?php do_action( 'open_content' ); ?>

<?php
$user = wp_get_current_user()->data;
$user_id = $user->ID;

$query = new WP_Query(array(
    'post_type' => 'classified',
    'post_status' => 'draft',
    'author' => $user_id,
    // 'posts_per_page' => -1
));
echo "<h1>Edit your pending classifieds</h1><br>";
echo "<p>The following posts are your pending classifieds. After you edit a classified, it will be reviewed by our team before publishing.</p>";
?>
<div class="accordion" id="post-listing"><?php
    while ($query->have_posts()) {

        $query->the_post();

        // process form
        // if ( 'POST' == $_SERVER['REQUEST_METHOD'] ) {
    if ( 'POST' == $_SERVER['REQUEST_METHOD'] && ! empty($_POST['post_id']) && ! empty($_POST['post_title']) && isset($_POST['postcontent']) ) {

            // header('Location: /');

            $post_id = $post->ID;
            $post = array(
                'ID'             => $_POST['post_id'],
                'post_content'   => esc_sql($_POST['postcontent']),
                'post_title'     => esc_sql($_POST['post_title'])
            );

            wp_update_post($post);
            // var_dump($post);
            // var_dump($post_id);

            if ( isset($_POST['owner_name']) ) update_post_meta($_POST['post_id'], 'owner_name', esc_sql($_POST['owner_name']) );
            if ( isset($_POST['phone']) ) update_post_meta($_POST['post_id'], 'phone', esc_sql($_POST['phone']) );
            if ( isset($_POST['address']) ) update_post_meta($_POST['post_id'], 'address', esc_sql($_POST['address']) );
            if ( isset($_POST['zip_code']) ) update_post_meta($_POST['post_id'], 'zip_code', esc_sql($_POST['zip_code']) );
            if ( isset($_POST['add_coupon']) ) update_post_meta($_POST['post_id'], 'add_coupon', esc_sql($_POST['add_coupon']) );
        }


        wp_nonce_field( 'update_post_'. get_the_ID(), 'update_post_nonce' );


        $fields = get_post_meta($post->ID);

        $name    = $fields["owner_name"][0];
        $phone   = $fields["phone"][0];
        $address = $fields["address"][0];
        $zip     = $fields["zip_code"][0];
        $coupon  = $fields["add_coupon"][0];
        ?>
        <!-- <pre><?// php var_dump($post->ID);?></pre> -->
        <div class="accordion-navigation step-wrapper">
            <a class="step-heading" href="#" onclick="toggle(edit_post_<?php echo $post->ID; ?>);"><span style="float: none;max-width: unset;text-align: left;padding-left: 26px;"><h4 style="margin: 0">Edit <?php echo $post->post_title; ?></h4></span></a>
            <div class="step-post content  clearfix" id="edit_post_<?php echo $post->ID; ?>" href="#">
                <div class="step-post content  clearfix current">
                    <form id="post" class="dropzone form_front_style" method="post" enctype="multipart/form-data">

                    <input type="hidden" name="post_id" value="<?php the_ID(); ?>" />
                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="post_title">Title</label>
                        <input class="textfield" type="text" id="post_title" name="post_title" value="<?php echo $post->post_title; ?>" /></div>

                        <h3>Classified Information</h3>
                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="postcontent">Detail</label>
                        <span style="color: #333"><?php wp_editor( $post->post_content, 'postcontent' ); ?></span></div>

                        <h3>Seller Contact Information</h3>
                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="name">Owner Name</label>
                        <input class="textfield" type="text" id="name" name="owner_name" value="<?php echo $name; ?>" /></div>

                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="phone">Phone</label>
                        <input class="textfield" type="text" id="phone" name="phone" value="<?php echo $phone; ?>" /></div>

                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="address">Address</label>
                        <input class="textfield" type="text" id="address" name="address" value="<?php echo $address; ?>" /></div>

                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="zip_code">Zip</label>
                        <input class="textfield" type="text" id="zip_code" name="zip_code" value="<?php echo $zip; ?>" /></div>

                        <h3>Coupons</h3>
                        <div class="form_row clearfix custom_fileds"><label class="r_lbl" for="add_coupon">Add Coupon</label>
                        <input class="textfield" <?php echo $coupon ? "disabled style='background-color:#f8f8f8;color:#bdbcbc;'" : ""; ?> type="text" id="add_coupon" name="add_coupon" value="<?php echo $coupon; ?>" /></div>

                        <input class="textfield" type="submit" id="submit" value="Update" />
                    </div>
                </form>
            </div>
        </div>
        <?php
        }
        ?>
    </div>
</section>
<!-- #content -->
<?php do_action( 'after_content' );
$page_for_posts = get_option( 'page_for_posts' );

if ( $page_for_posts != '' ) {
    apply_filters( 'supreme-post-listing-sidebar',supreme_post_listing_sidebar() );// load the side bar of listing page
} else {    
    get_sidebar();
}
get_footer();
?>
<script>
// open accordion when anchor link directly above is clicked
function toggle(target) {
    var i,
    active_elements = document.getElementsByClassName("active"),
    clicked = document.getElementById(target['id']);

    if (!clicked.classList.contains("active")) {
        for (i = 0; i < active_elements.length; i++) {
            active_elements[i].classList.remove("active");
            console.log("removed");
        }
    }
    clicked.classList.toggle("active");
}
</script>
1
  • Upvoted for answering own question so others in the same situation can see what the solution was
    – Tom J Nowell
    Jul 2, 2018 at 15:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.