123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- <?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;
|