123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- <?php
- if ( ! defined( 'ABSPATH' ) ) {
- exit; // Exit if accessed directly
- }
- if ( ! class_exists( 'ACF_Form_Post' ) ) :
- class ACF_Form_Post {
- /** @var string The first field groups style CSS. */
- var $style = '';
- /**
- * __construct
- *
- * Sets up the class functionality.
- *
- * @date 5/03/2014
- * @since 5.0.0
- *
- * @param void
- * @return void
- */
- function __construct() {
- // initialize on post edit screens
- add_action( 'load-post.php', array( $this, 'initialize' ) );
- add_action( 'load-post-new.php', array( $this, 'initialize' ) );
- // save
- add_filter( 'wp_insert_post_empty_content', array( $this, 'wp_insert_post_empty_content' ), 10, 2 );
- add_action( 'save_post', array( $this, 'save_post' ), 10, 2 );
- }
- /**
- * initialize
- *
- * Sets up Form functionality.
- *
- * @date 19/9/18
- * @since 5.7.6
- *
- * @param void
- * @return void
- */
- function initialize() {
- // globals
- global $typenow;
- remove_meta_box( 'submitdiv', 'acf-field-group', 'side' );
- // restrict specific post types
- $restricted = array( 'acf-field-group', 'attachment' );
- if ( in_array( $typenow, $restricted ) ) {
- return;
- }
- // enqueue scripts
- acf_enqueue_scripts(
- array(
- 'uploader' => 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 '<style type="text/css" id="acf-style">' . $this->style . '</style>';
- }
- /**
- * 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;
|