phpwordpressloopsforeachmeta-key

Wordpress in foreach loop updating meta values


I have done foreach loop to get custom post type to frontend. And i have one custom field called 'order_staatus'. When i look in front end my list in loop, i want to add one button what would change this certain post 'order_staatus' to different value.. my code..

<? foreach ( $postslist as $post ) :
   setup_postdata( $post );
?> 

<div class="profile_order_row">
   <a href="<?php the_permalink(); ?>"> <?php the_author(); ?> <?php the_title(); ?></a>
   <?php
      Global $post;
      if ( isset( $_POST['submit'] ) )
      {   
          if( ! isset( $post ) ) {
              echo 'Post not set';
              die();
          }
          else if( ! isset( $_POST['staatus'] ) && ! empty( $_POST['staatus'] ) ){
          echo 'Error';
          die();
          }

          $postid = $_POST['post_id'];
          update_post_meta($postid,'order_staatus','1');
      }

      $staatus = get_post_meta($post->ID, 'order_staatus', true);

      echo print_r($staatus);
   ?>

   <form method="post" action="">
      <input type="hidden" name="post_id" value="'.$post->ID.'" />
      <input type='text' name='staatus' value='<? echo $staatus ?>' />
      <input type='submit' value='save' />
   </form>

</div>


<?php endforeach; wp_reset_postdata(); ?>

Solution

  • I don't think the issue is with the function update_post_meta. I think the more likely issue is that $_POST['submit'] is not set. When submitting a form, the value of the submit button is not sent. The value attribute is simply for assigning the text of the button.

    I would rewrite the IF block of code like this:

      if ( isset( $_POST ) )
        {   
    
          if( ! isset( $_POST['staatus'] ) && ! empty( $_POST['staatus'] ) ){
            echo 'Error';
            die();
          }
    
          $postid = sanitize_text_field($_POST['post_id']);
          update_post_meta($postid,'order_staatus','1');
      }
    

    Note, that I removed the isset($post) check because you are running this code inside of foreach ( $postslist as $post ) which defines $post so it will always be set within that loop.

    I also added the function sanitize_text_field() to sanitize the post_id. This is an important security measure to avoid SQL injection. All user input, including $_POST, can contain dangerous data and needs to be sanitized before use.

    Hope this helps!