342 lines
8.1 KiB
PHP
342 lines
8.1 KiB
PHP
|
<?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;
|
||
|
|
||
|
$acf_post_types = acf_get_internal_post_types();
|
||
|
|
||
|
foreach ( $acf_post_types as $post_type ) {
|
||
|
remove_meta_box( 'submitdiv', $post_type, 'side' );
|
||
|
}
|
||
|
|
||
|
// restrict specific post types
|
||
|
$restricted = array_merge( $acf_post_types, array( 'acf-taxonomy', '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;
|