178 lines
4.3 KiB
PHP
178 lines
4.3 KiB
PHP
<?php
|
|
|
|
if( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly.
|
|
|
|
if( ! class_exists('ACF_Form_Gutenberg') ) :
|
|
|
|
class ACF_Form_Gutenberg {
|
|
|
|
/**
|
|
* __construct
|
|
*
|
|
* Setup for class functionality.
|
|
*
|
|
* @date 13/12/18
|
|
* @since 5.8.0
|
|
*
|
|
* @param void
|
|
* @return void
|
|
*/
|
|
|
|
function __construct() {
|
|
|
|
// Add actions.
|
|
add_action('enqueue_block_editor_assets', array($this, 'enqueue_block_editor_assets'));
|
|
|
|
// Ignore validation during meta-box-loader AJAX request.
|
|
add_action('acf/validate_save_post', array($this, 'acf_validate_save_post'), 999);
|
|
}
|
|
|
|
/**
|
|
* enqueue_block_editor_assets
|
|
*
|
|
* Allows a safe way to customize Guten-only functionality.
|
|
*
|
|
* @date 14/12/18
|
|
* @since 5.8.0
|
|
*
|
|
* @param void
|
|
* @return void
|
|
*/
|
|
function enqueue_block_editor_assets() {
|
|
|
|
// Remove edit_form_after_title.
|
|
add_action( 'add_meta_boxes', array($this, 'add_meta_boxes'), 20, 0 );
|
|
|
|
// Call edit_form_after_title manually.
|
|
add_action( 'block_editor_meta_box_hidden_fields', array($this, 'block_editor_meta_box_hidden_fields') );
|
|
|
|
// Cusotmize editor metaboxes.
|
|
add_filter( 'filter_block_editor_meta_boxes', array($this, 'filter_block_editor_meta_boxes') );
|
|
}
|
|
|
|
/**
|
|
* add_meta_boxes
|
|
*
|
|
* Modify screen for Gutenberg.
|
|
*
|
|
* @date 13/12/18
|
|
* @since 5.8.0
|
|
*
|
|
* @param void
|
|
* @return void
|
|
*/
|
|
function add_meta_boxes() {
|
|
|
|
// Remove 'edit_form_after_title' action.
|
|
remove_action('edit_form_after_title', array(acf_get_instance('ACF_Form_Post'), 'edit_form_after_title'));
|
|
}
|
|
|
|
/**
|
|
* block_editor_meta_box_hidden_fields
|
|
*
|
|
* Modify screen for Gutenberg.
|
|
*
|
|
* @date 13/12/18
|
|
* @since 5.8.0
|
|
*
|
|
* @param void
|
|
* @return void
|
|
*/
|
|
function block_editor_meta_box_hidden_fields() {
|
|
|
|
// Manually call 'edit_form_after_title' function.
|
|
acf_get_instance('ACF_Form_Post')->edit_form_after_title();
|
|
}
|
|
|
|
/**
|
|
* filter_block_editor_meta_boxes
|
|
*
|
|
* description
|
|
*
|
|
* @date 5/4/19
|
|
* @since 5.7.14
|
|
*
|
|
* @param type $var Description. Default.
|
|
* @return type Description.
|
|
*/
|
|
function filter_block_editor_meta_boxes( $wp_meta_boxes ) {
|
|
|
|
// Globals
|
|
global $current_screen;
|
|
|
|
// Move 'acf_after_title' metaboxes into 'normal' location.
|
|
if( isset($wp_meta_boxes[ $current_screen->id ][ 'acf_after_title' ]) ) {
|
|
|
|
// Extract locations.
|
|
$locations = $wp_meta_boxes[ $current_screen->id ];
|
|
|
|
// Ensure normal location exists.
|
|
if( !isset($locations['normal']) ) $locations['normal'] = array();
|
|
if( !isset($locations['normal']['high']) ) $locations['normal']['high'] = array();
|
|
|
|
// Append metaboxes.
|
|
foreach( $locations['acf_after_title'] as $priority => $meta_boxes ) {
|
|
$locations['normal']['high'] = array_merge( $meta_boxes, $locations['normal']['high'] );
|
|
}
|
|
|
|
// Update original data.
|
|
$wp_meta_boxes[ $current_screen->id ] = $locations;
|
|
unset( $wp_meta_boxes[ $current_screen->id ]['acf_after_title'] );
|
|
|
|
// Avoid conflicts with saved metabox order.
|
|
add_filter( 'get_user_option_meta-box-order_' . $current_screen->id, array($this, 'modify_user_option_meta_box_order') );
|
|
}
|
|
|
|
// Return
|
|
return $wp_meta_boxes;
|
|
}
|
|
|
|
/**
|
|
* modify_user_option_meta_box_order
|
|
*
|
|
* Filters the `meta-box-order_{$post_type}` value by prepending "acf_after_title" data to "normal".
|
|
* Fixes a bug where metaboxes with position "acf_after_title" do not appear in the block editor.
|
|
*
|
|
* @date 11/7/19
|
|
* @since 5.8.2
|
|
*
|
|
* @param array $stored_meta_box_order User's existing meta box order.
|
|
* @return array Modified array with meta boxes moved around.
|
|
*/
|
|
function modify_user_option_meta_box_order( $locations ) {
|
|
if( !empty($locations['acf_after_title']) ) {
|
|
if( !empty($locations['normal']) ) {
|
|
$locations['normal'] = $locations['acf_after_title'] . ',' . $locations['normal'];
|
|
} else {
|
|
$locations['normal'] = $locations['acf_after_title'];
|
|
}
|
|
unset($locations['acf_after_title']);
|
|
}
|
|
return $locations;
|
|
}
|
|
|
|
/**
|
|
* acf_validate_save_post
|
|
*
|
|
* Ignore errors during the Gutenberg "save metaboxes" AJAX request.
|
|
* Allows data to save and prevent UX issues.
|
|
*
|
|
* @date 16/12/18
|
|
* @since 5.8.0
|
|
*
|
|
* @param void
|
|
* @return void
|
|
*/
|
|
function acf_validate_save_post() {
|
|
|
|
// Check if current request came from Gutenberg.
|
|
if( isset($_GET['meta-box-loader']) ) {
|
|
acf_reset_validation_errors();
|
|
}
|
|
}
|
|
}
|
|
|
|
acf_new_instance('ACF_Form_Gutenberg');
|
|
|
|
endif;
|