166 lines
3.8 KiB
PHP
166 lines
3.8 KiB
PHP
<?php
|
|
/**
|
|
* Block editor (Gutenberg)
|
|
*
|
|
* @author UX Themes
|
|
* @category Gutenberg
|
|
* @package Flatsome\Admin
|
|
* @since 3.7.0
|
|
*/
|
|
|
|
namespace Flatsome\Admin;
|
|
|
|
defined( 'ABSPATH' ) || exit;
|
|
|
|
/**
|
|
* Class Gutenberg
|
|
*
|
|
* @package Flatsome\Admin
|
|
*/
|
|
class Gutenberg {
|
|
|
|
/**
|
|
* Current version
|
|
*
|
|
* @var string
|
|
*/
|
|
private $version;
|
|
|
|
/**
|
|
* Holds assets directory.
|
|
*
|
|
* @var string
|
|
*/
|
|
private $assets;
|
|
|
|
/**
|
|
* Gutenberg constructor.
|
|
*/
|
|
public function __construct() {
|
|
$theme = wp_get_theme( get_template() );
|
|
|
|
$this->version = $theme->get( 'Version' );
|
|
$this->assets = get_template_directory_uri() . '/inc/admin/gutenberg/assets';
|
|
|
|
$this->init();
|
|
}
|
|
|
|
/**
|
|
* Initialise
|
|
*/
|
|
private function init() {
|
|
if ( $this->is_block_editor_available() ) {
|
|
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_styles' ] );
|
|
add_action( 'enqueue_block_editor_assets', [ $this, 'add_edit_button' ], 11 );
|
|
add_action( 'enqueue_block_editor_assets', [ $this, 'add_block_settings' ] );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Check if block editor is available.
|
|
*
|
|
* @return bool
|
|
*/
|
|
private function is_block_editor_available() {
|
|
return function_exists( 'register_block_type' );
|
|
}
|
|
|
|
/**
|
|
* Whether a post type should display the Gutenberg/block editor.
|
|
*
|
|
* @param string $post_type The name of the post type.
|
|
*
|
|
* @return bool
|
|
*/
|
|
private function is_post_type_gutenberg( $post_type ) {
|
|
if ( function_exists( 'use_block_editor_for_post_type' ) ) {
|
|
// WP 5.0 or greater.
|
|
return use_block_editor_for_post_type( $post_type );
|
|
} elseif ( function_exists( 'gutenberg_can_edit_post_type' ) ) {
|
|
// Lower then WP 5.0 and Gutenberg plugin is installed.
|
|
return gutenberg_can_edit_post_type( $post_type );
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Register and enqueue main styles.
|
|
*/
|
|
public function enqueue_styles() {
|
|
wp_register_style( 'flatsome-gutenberg', $this->assets . '/css/style.css', [], $this->version );
|
|
wp_enqueue_style( 'flatsome-gutenberg' );
|
|
}
|
|
|
|
/**
|
|
* Add 'Edit with UX Builder' inside gutenberg editor header.
|
|
*/
|
|
public function add_edit_button() {
|
|
global $typenow;
|
|
if ( ! $this->is_post_type_gutenberg( $typenow ) ) {
|
|
return;
|
|
}
|
|
wp_enqueue_script( 'flatsome-gutenberg-edit-button', $this->assets . '/js/edit-button.js', array( 'wp-edit-post' ), $this->version, true );
|
|
|
|
$page_id = get_the_ID();
|
|
|
|
$params = [
|
|
'edit_button' => [
|
|
'enabled' => $this->is_edit_button_visible( $page_id ),
|
|
'text' => __( 'Edit with UX Builder', 'flatsome' ),
|
|
'url' => ux_builder_edit_url( $page_id ),
|
|
],
|
|
];
|
|
|
|
wp_localize_script( 'flatsome-gutenberg-edit-button', 'flatsome_gutenberg', $params );
|
|
}
|
|
|
|
/**
|
|
* Generates the `window.flatsomeBlockSettings` object.
|
|
*/
|
|
public function add_block_settings() {
|
|
$blocks_js = $this->assets . '/js/blocks.js';
|
|
$blocks_deps = array(
|
|
'wp-data',
|
|
'wp-blocks',
|
|
'wp-element',
|
|
'wp-edit-post',
|
|
'wp-components',
|
|
'wp-block-editor',
|
|
);
|
|
$block_settings = array_filter(
|
|
get_block_editor_server_block_settings(),
|
|
function( $block, $name ) {
|
|
return strpos( $name, 'flatsome/' ) === 0;
|
|
},
|
|
ARRAY_FILTER_USE_BOTH
|
|
);
|
|
|
|
wp_enqueue_script( 'flatsome-blocks', $blocks_js, $blocks_deps, $this->version, true );
|
|
wp_localize_script( 'flatsome-blocks', 'flatsomeBlockSettings', $block_settings );
|
|
}
|
|
|
|
/**
|
|
* Determines when the edit button should be visible or not.
|
|
*
|
|
* @param int $page_id The ID of the current post.
|
|
*
|
|
* @return bool
|
|
*/
|
|
private function is_edit_button_visible( $page_id ) {
|
|
// Do not show UX Builder link on Shop page.
|
|
if ( function_exists( 'is_woocommerce' ) && $page_id == wc_get_page_id( 'shop' ) ) {
|
|
return false;
|
|
}
|
|
|
|
// Do not show UX Builder link on Posts Page.
|
|
$page_for_posts = get_option( 'page_for_posts' );
|
|
if ( $page_id == $page_for_posts ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
new Gutenberg();
|