You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
4.7 KiB
PHTML
192 lines
4.7 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* Class Meta_Boxes.
|
||
|
*
|
||
|
* @link https://github.com/googleforcreators/web-stories-wp
|
||
|
*
|
||
|
* @copyright 2020 Google LLC
|
||
|
* @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Copyright 2020 Google LLC
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
declare(strict_types = 1);
|
||
|
|
||
|
namespace Google\Web_Stories\Admin;
|
||
|
|
||
|
use Google\Web_Stories\Service_Base;
|
||
|
use Google\Web_Stories\Story_Post_Type;
|
||
|
|
||
|
/**
|
||
|
* Class Meta_Boxes.
|
||
|
*/
|
||
|
class Meta_Boxes extends Service_Base {
|
||
|
/**
|
||
|
* Supported meta box locations.
|
||
|
*/
|
||
|
public const LOCATIONS = [ 'normal', 'advanced', 'side' ];
|
||
|
|
||
|
/**
|
||
|
* Meta box priorities.
|
||
|
*/
|
||
|
public const PRIORITIES = [ 'high', 'sorted', 'core', 'default', 'low' ];
|
||
|
|
||
|
/**
|
||
|
* Init.
|
||
|
*
|
||
|
* @since 1.2.0
|
||
|
*/
|
||
|
public function register(): void {
|
||
|
add_action( 'add_meta_boxes_' . Story_Post_Type::POST_TYPE_SLUG, [ $this, 'remove_meta_boxes' ], PHP_INT_MAX );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes all meta boxes with '__back_compat_meta_box' set to 'true'.
|
||
|
*
|
||
|
* This removes things like the post author meta box, as this feature is
|
||
|
* already included in the editor.
|
||
|
*
|
||
|
* Mimics what do_meta_boxes() does for the block editor.
|
||
|
*
|
||
|
* @since 1.2.0
|
||
|
*
|
||
|
* @see do_meta_boxes()
|
||
|
*/
|
||
|
public function remove_meta_boxes(): void {
|
||
|
global $wp_meta_boxes;
|
||
|
|
||
|
$screen = get_current_screen();
|
||
|
|
||
|
if ( ! $screen ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
foreach ( self::LOCATIONS as $context ) {
|
||
|
if ( ! isset( $wp_meta_boxes[ $screen->id ][ $context ] ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
foreach ( self::PRIORITIES as $priority ) {
|
||
|
if ( ! isset( $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
foreach ( (array) $wp_meta_boxes[ $screen->id ][ $context ][ $priority ] as $meta_box ) {
|
||
|
if ( false === $meta_box || ! $meta_box['title'] ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (
|
||
|
// We don't currently support the 'Custom Fields' meta box.
|
||
|
'postcustom' === $meta_box['id'] ||
|
||
|
( \is_array( $meta_box['args'] ) && ! empty( $meta_box['args']['__back_compat_meta_box'] ) )
|
||
|
) {
|
||
|
remove_meta_box( $meta_box['id'], $screen, $context );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the admin URL for handling meta boxes.
|
||
|
*
|
||
|
* @since 1.2.0
|
||
|
*
|
||
|
* @param int $story_id Story ID.
|
||
|
* @return string Meta box URL.
|
||
|
*/
|
||
|
public function get_meta_box_url( int $story_id ): string {
|
||
|
$meta_box_url = admin_url( 'post.php' );
|
||
|
$meta_box_url = add_query_arg(
|
||
|
[
|
||
|
'post' => $story_id,
|
||
|
'action' => 'edit',
|
||
|
'meta-box-loader' => true,
|
||
|
'meta-box-loader-nonce' => wp_create_nonce( 'meta-box-loader' ),
|
||
|
],
|
||
|
$meta_box_url
|
||
|
);
|
||
|
|
||
|
return $meta_box_url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns list of custom meta boxes per location.
|
||
|
*
|
||
|
* Used to disable empty meta boxes in the editor.
|
||
|
*
|
||
|
* @since 1.2.0
|
||
|
*
|
||
|
* @see the_block_editor_meta_boxes()
|
||
|
*
|
||
|
* @return array<string, array<int, array{id: string, title: string}>> List of meta boxes per location.
|
||
|
*/
|
||
|
public function get_meta_boxes_per_location(): array {
|
||
|
global $wp_meta_boxes;
|
||
|
|
||
|
$screen = get_current_screen();
|
||
|
|
||
|
if ( ! $screen ) {
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
$_wp_meta_boxes = $wp_meta_boxes ?? [];
|
||
|
|
||
|
/**
|
||
|
* Filters meta box data before making it available to the editor.
|
||
|
*
|
||
|
* This allows for the modifications of meta boxes that are already
|
||
|
* present by this point. Do not use as a means of adding meta box data.
|
||
|
*
|
||
|
* @since 1.3.0
|
||
|
*
|
||
|
* @param array $wp_meta_boxes Global meta box state.
|
||
|
*/
|
||
|
$_wp_meta_boxes = apply_filters( 'web_stories_editor_meta_boxes', $_wp_meta_boxes );
|
||
|
|
||
|
$meta_boxes_per_location = [];
|
||
|
foreach ( self::LOCATIONS as $context ) {
|
||
|
$meta_boxes_per_location[ $context ] = [];
|
||
|
|
||
|
if ( ! isset( $_wp_meta_boxes[ $screen->id ][ $context ] ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
foreach ( self::PRIORITIES as $priority ) {
|
||
|
if ( ! isset( $_wp_meta_boxes[ $screen->id ][ $context ][ $priority ] ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$meta_boxes = (array) $_wp_meta_boxes[ $screen->id ][ $context ][ $priority ];
|
||
|
foreach ( $meta_boxes as $meta_box ) {
|
||
|
if ( false === $meta_box || ! $meta_box['title'] ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$meta_boxes_per_location[ $context ][] = [
|
||
|
'id' => $meta_box['id'],
|
||
|
'title' => $meta_box['title'],
|
||
|
];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $meta_boxes_per_location;
|
||
|
}
|
||
|
}
|