Support

Solved

Frontend Form Issues: pre_save_post & save_post

Home Forums Bug Reports Frontend Form Issues: pre_save_post & save_post

    • tatemz

    • August 8, 2013 at 5:07 am

    I have two functions to process a frontend form. These functions used to properly process my form as expected until v4.2.0.

    The pre_save function:

    /**
     * ACF Pre Save Post
     *
     * @return int $post_id The ID of the new post;
     */
    function my_acf_pre_save_post( $post_id ) {
        if( $post_id != 'new' ) return $post_id;
    
        $post_data = array(
            'post_title'  => 'Draft Post',
            'post_status' => 'draft',
            'post_author' => get_current_user_id()
        );
    
        $post_id = wp_insert_post( $post_data );
    
        return $post_id;
    }
    add_filter( 'acf/pre_save_post' , 'my_acf_pre_save_post', 10, 2 );

    … And the save_post function:

    /**
     * Add Post Data to ACF Form Post
     *
     * @return void
     */
    function my_acf_save_post( $post_id ) {
        // Don't do this on the ACF post type
        if ( get_post_type( $post_id ) == 'acf' ) return;
    
        // Get the Fields
        $fields = get_field_objects( $post_id );
    
        // Get the Post Type in the Hidden Field Default Value
        $cpt = $fields["form_field_key_post_type"]['value'];
    
        // Prevent Infinite Looping...
        remove_action( 'acf/save_post', 'my_acf_save_post' );
    
        // Grab Post Data from the Form
        $post = array(
            'ID'           => $post_id,
            'post_type'    => $cpt
            'post_title'   => $fields['form_field_key_post_title']['value'],
            'post_content' => $fields['form_field_key_post_content']['value'],
            'post_status'  => $fields['form_field_key_post_status']['value']
        );
    
        // Update the Post
        wp_update_post( $post );
    
        // Continue save action
        add_action( 'acf/save_post', 'my_save_post' );
    
        // Set the Return URL in Case of 'new' Post
        $_POST['return'] = add_query_arg( 'updated', 'true', get_permalink( $post_id ) );
    }
    add_action( 'acf/save_post', 'my_acf_save_post', 10, 1 );

    Adding these debugging statements into the pre_save_post produced unexpected results considering acf_form_head sets $post_id to the value of $_POST['post_id'].

    See line 1012

    /**
     * ACF Pre Save Post
     *
     * @return int $post_id The ID of the new post;
     */
    function my_acf_pre_save_post( $post_id ) {
        var_dump( $post_id ); // OUTPUT: NULL
        var_dump( $_POST['post_id'] ); // OUTPUT: string(3) "new"
        die();
    
        if( $post_id != 'new' ) return $post_id;
    
        $post_data = array(
            'post_title'  => 'Draft Listing',
            'post_status' => 'draft',
            'post_author' => get_current_user_id()
        );
    
        $post_id = wp_insert_post( $post_data );
    
        return $post_id;
    }
    add_filter( 'acf/pre_save_post' , 'mri_jb_acf_pre_save_post', 10, 2 );
      • elliot

      • August 8, 2013 at 2:51 pm

      Hi @tatemz

      I’m not 100% sure why the $post_id is null, can you take out your custom acf/save_post filter.

      Does the pre_save_post filter work correctly now?

        • elliot

        • August 8, 2013 at 2:51 pm

        Also, can you edit the code file and debug the $post_id param there too?

          • tatemz

          • August 8, 2013 at 3:06 pm

          It is pretty weird huh? I’m absolutely weirded out by this one…

          Okay, the save_post action is commented out and the following debugging statements were added to acf_form_head (results below);

          function acf_form_head()
          {
              // global vars
              global $post_id;
          
              // verify nonce
              if( isset($_POST['acf_nonce']) && wp_verify_nonce($_POST['acf_nonce'], 'input') )
              {
                  var_dump($post_id); // OUTPUT: NULL
          
                  // $post_id to save against
                  $post_id = $_POST['post_id'];
          
                  var_dump($post_id); // OUTPUT: string(3) "new"
          
                  // allow for custom save
                  $post_id = apply_filters('acf/pre_save_post', $post_id);
          
                  var_dump($post_id); // OUTPUT: NULL
          
                  die();
          
                  // save the data
                  do_action('acf/save_post', $post_id);
          
                  // ...
              }
          
              // ...
          }
            • tatemz

            • August 8, 2013 at 3:08 pm

            I haven’t looked deep enough into the code to see how you are using the new save_post_lock & save_post_unlock functions, but off the top of your head, might that have any effect on this situation?

              • tatemz

              • August 8, 2013 at 3:17 pm

              Aha! I commented out your save_post_lock and save_post_unlock filters and all is well.

              Adding a blank return statement to those functions did not solve this issue either…

              However, adding a return $post_id; to those functions did solve that issue.

              No return statements on filter callbacks leaves the filtered variable undefined.

              Thoughts?

                • tatemz

                • August 8, 2013 at 3:21 pm
                function save_post_lock( $post_id )
                {
                    $GLOBALS['acf_save_lock'] = $post_id;
                    return $post_id;
                }
                function save_post_unlock( $post_id )
                {
                    $GLOBALS['acf_save_lock'] = false;
                    return $post_id;
                }
                  • awilder

                  • August 9, 2013 at 8:11 am

                  I’m having what I think is the same issue. I created a front-end form a few days ago and it was working fine. Then my client updated to the latest version of ACF, and suddenly the form no longer saves the data. It doesn’t give any error messages, it just doesn’t actually create the new item.

                  The front-end form is here:

                  http://cookingcontestcentral.com/submit-a-recipe/

                  Let me know how I can help troubleshoot?

                    • tatemz

                    • August 9, 2013 at 8:16 am

                    Edit the two functions above as I did and all should work.

                    WP filters need return statements (unless the NULL value is desired).

                    Hopefully an update will come our way soon, but in the meantime, you will have to be comfortable with editing the plugin itself.

                    Already submitted a pull request ( hopefully I didn’t miss anything ):

                    https://github.com/elliotcondon/acf/pull/131

                      • awilder

                      • August 9, 2013 at 8:24 am

                      Where can I find those functions? I just poked around a few of the theme files but didn’t locate them.

                      Thanks!

                        • tatemz

                        • August 9, 2013 at 8:27 am

                        Here’s the edited forked repo:

                        https://github.com/tatemz/acf

                        Here’s the link to the updated zip file:

                        https://github.com/tatemz/acf/archive/master.zip

                        Changes were made to acf.php

                        • awilder

                        • August 9, 2013 at 8:35 am

                        Hooray! Just replaced the acf.php file with the one from the master.zip and it’s working again.

                        Thanks! :)

                          • elliot

                          • August 10, 2013 at 11:15 am

                          Hi @tatemz

                          You are a genius! Thanks mate. Yes, the locking actions need to return the $post_id, my bad.

                          This will be included in 4.2.1 (should be out in a few days)

                          Viewing 13 posts - 1 through 13 (of 13 total)

                          You must be logged in to reply to this topic.