191 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			4.8 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' ) );
 | |
| 
 | |
| 			// Customize editor metaboxes.
 | |
| 			add_filter( 'filter_block_editor_meta_boxes', array( $this, 'filter_block_editor_meta_boxes' ) );
 | |
| 
 | |
| 			// Trigger ACF enqueue scripts as the site editor doesn't trigger this from form-post.php
 | |
| 			acf_enqueue_scripts(
 | |
| 				array(
 | |
| 					'uploader' => true,
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		/**
 | |
| 		 *  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'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Verified elsewhere.
 | |
| 				acf_reset_validation_errors();
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	acf_new_instance( 'ACF_Form_Gutenberg' );
 | |
| 
 | |
| endif;
 |