true, ) ); // actions add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 10, 2 ); } /** * add_meta_boxes * * Adds ACF metaboxes for the given $post_type and $post. * * @date 19/9/18 * @since 5.7.6 * * @param string $post_type The post type. * @param WP_Post $post The post being edited. * @return void */ function add_meta_boxes( $post_type, $post ) { // Storage for localized postboxes. $postboxes = array(); // Get field groups for this screen. $field_groups = acf_get_field_groups( array( 'post_id' => $post->ID, 'post_type' => $post_type, ) ); // Loop over field groups. if ( $field_groups ) { foreach ( $field_groups as $field_group ) { // vars $id = "acf-{$field_group['key']}"; // acf-group_123 $title = $field_group['title']; // Group 1 $context = $field_group['position']; // normal, side, acf_after_title $priority = 'high'; // high, core, default, low // Reduce priority for sidebar metaboxes for best position. if ( $context == 'side' ) { $priority = 'core'; } /** * Filters the metabox priority. * * @date 23/06/12 * @since 3.1.8 * * @param string $priority The metabox priority (high, core, default, low). * @param array $field_group The field group array. */ $priority = apply_filters( 'acf/input/meta_box_priority', $priority, $field_group ); // Localize data $postboxes[] = array( 'id' => $id, 'key' => $field_group['key'], 'style' => $field_group['style'], 'label' => $field_group['label_placement'], 'edit' => acf_get_field_group_edit_link( $field_group['ID'] ), ); // Add the meta box. add_meta_box( $id, acf_esc_html( $title ), array( $this, 'render_meta_box' ), $post_type, $context, $priority, array( 'field_group' => $field_group ) ); } // Set style from first field group. $this->style = acf_get_field_group_style( $field_groups[0] ); // Localize postboxes. acf_localize_data( array( 'postboxes' => $postboxes, ) ); } // remove postcustom metabox (removes expensive SQL query) if ( acf_get_setting( 'remove_wp_meta_box' ) ) { remove_meta_box( 'postcustom', false, 'normal' ); } // Add hidden input fields. add_action( 'edit_form_after_title', array( $this, 'edit_form_after_title' ) ); /** * Fires after metaboxes have been added. * * @date 13/12/18 * @since 5.8.0 * * @param string $post_type The post type. * @param WP_Post $post The post being edited. * @param array $field_groups The field groups added. */ do_action( 'acf/add_meta_boxes', $post_type, $post, $field_groups ); } /** * edit_form_after_title * * Called after the title adn before the content editor. * * @date 19/9/18 * @since 5.7.6 * * @param void * @return void */ function edit_form_after_title() { // globals global $post, $wp_meta_boxes; // render post data acf_form_data( array( 'screen' => 'post', 'post_id' => $post->ID, ) ); // render 'acf_after_title' metaboxes do_meta_boxes( get_current_screen(), 'acf_after_title', $post ); // render dynamic field group style echo ''; } /** * render_meta_box * * Renders the ACF metabox HTML. * * @date 19/9/18 * @since 5.7.6 * * @param WP_Post $post The post being edited. * @param array metabox The add_meta_box() args. * @return void */ function render_meta_box( $post, $metabox ) { // vars $id = $metabox['id']; $field_group = $metabox['args']['field_group']; // Render fields. $fields = acf_get_fields( $field_group ); acf_render_fields( $fields, $post->ID, 'div', $field_group['instruction_placement'] ); } /** * wp_insert_post_empty_content * * Allows WP to insert a new post without title or post_content if ACF data exists. * * @date 16/07/2014 * @since 5.0.1 * * @param bool $maybe_empty Whether the post should be considered "empty". * @param array $postarr Array of post data. * @return bool */ function wp_insert_post_empty_content( $maybe_empty, $postarr ) { // return false and allow insert if '_acf_changed' exists if ( $maybe_empty && acf_maybe_get_POST( '_acf_changed' ) ) { return false; } // return return $maybe_empty; } /* * allow_save_post * * Checks if the $post is allowed to be saved. * Used to avoid triggering "acf/save_post" on dynamically created posts during save. * * @type function * @date 26/06/2016 * @since 5.3.8 * * @param WP_Post $post The post to check. * @return bool */ function allow_save_post( $post ) { // vars $allow = true; // restrict post types $restrict = array( 'auto-draft', 'revision', 'acf-field', 'acf-field-group' ); if ( in_array( $post->post_type, $restrict ) ) { $allow = false; } // disallow if the $_POST ID value does not match the $post->ID $form_post_id = (int) acf_maybe_get_POST( 'post_ID' ); if ( $form_post_id && $form_post_id !== $post->ID ) { $allow = false; } // revision (preview) if ( $post->post_type == 'revision' ) { // allow if doing preview and this $post is a child of the $_POST ID if ( acf_maybe_get_POST( 'wp-preview' ) == 'dopreview' && $form_post_id === $post->post_parent ) { $allow = true; } } // return return $allow; } /* * save_post * * Triggers during the 'save_post' action to save the $_POST data. * * @type function * @date 23/06/12 * @since 1.0.0 * * @param int $post_id The post ID * @param WP_POST $post the post object. * @return int */ function save_post( $post_id, $post ) { // bail early if no allowed to save this post type if ( ! $this->allow_save_post( $post ) ) { return $post_id; } // verify nonce if ( ! acf_verify_nonce( 'post' ) ) { return $post_id; } // validate for published post (allow draft to save without validation) if ( $post->post_status == 'publish' ) { // bail early if validation fails if ( ! acf_validate_save_post() ) { return; } } // save acf_save_post( $post_id ); // save revision if ( post_type_supports( $post->post_type, 'revisions' ) ) { acf_save_post_revision( $post_id ); } // return return $post_id; } } acf_new_instance( 'ACF_Form_Post' ); endif;