You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

358 lines
11 KiB

9 months ago
<?php
/**
* The settings.
*
* @package MetaFieldBlock
* @author Phi Phan <mrphipv@gmail.com>
* @copyright Copyright (c) 2023, Phi Phan
*/
namespace MetaFieldBlock;
// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;
if ( ! class_exists( Settings::class ) ) :
/**
* The controller class for the settings.
*/
class Settings extends CoreComponent {
/**
* Setting page's hook suffix.
*
* @var string
*/
private $hook_suffix;
/**
* The plugin title
*
* @var string
*/
private $plugin_title = 'Meta Field Block';
/**
* The first path
*
* @var string
*/
private $first_path = '/options-general.php?page=mfb-settings&tab=getting-started';
/**
* Setting pages
*
* @var array
*/
private $setting_pages = [
'settings_page_mfb-settings-account',
'admin_page_mfb-settings-account',
'admin_page_mfb-settings-account-network',
'settings_page_mfb-settings-contact',
'admin_page_mfb-settings-contact',
'admin_page_mfb-settings-contact-network',
'settings_page_mfb-settings-pricing',
'admin_page_mfb-settings-pricing',
'admin_page_mfb-settings-pricing-network',
];
/**
* Run main hooks
*
* @return void
*/
public function run() {
// Create the settings page.
add_action( 'admin_menu', [ $this, 'add_admin_page' ] );
// Enqueue settings script.
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_settings_scripts' ] );
// Do setting up stuff when the plugin is activated.
add_action( 'meta_field_block_activate', [ $this, 'run_the_plugin_setup' ] );
// Redirect to the getting started page.
add_action( 'admin_init', [ $this, 'meta_field_block_activation_redirect' ] );
// Add the settings page link to plugin list screen.
add_action( 'plugin_action_links_' . plugin_basename( MFB_ROOT_FILE ), [ $this, 'plugin_settings_links' ] );
// Add rest api endpoint to query docs.
add_action( 'rest_api_init', [ $this, 'register_docs_endpoint' ] );
// Add admin toolbar.
add_action( 'in_admin_header', [ $this, 'in_admin_header' ] );
// Change the footer text for the settings pages.
add_action( 'admin_footer_text', [ $this, 'admin_footer_text' ] );
}
/**
* Print the admin toolbar.
*
* @return void
*/
public function in_admin_header() {
$screen = get_current_screen();
if ( $this->hook_suffix === $screen->id || in_array( $screen->id, $this->setting_pages, true ) ) {
// Left links.
$left_links = apply_filters( 'meta_field_block_get_header_left_links', [] );
$right_links = [
[
'url' => 'https://wordpress.org/support/plugin/display-a-meta-field-as-block/',
'title' => __( 'Help & Support ↗', 'display-a-meta-field-as-block' ),
'target' => '_blank',
'icon' => '<span class="dashicons dashicons-editor-help"></span> ',
],
[
'url' => 'https://wordpress.org/support/plugin/display-a-meta-field-as-block/reviews/#new-post',
'title' => __( 'Review ↗', 'display-a-meta-field-as-block' ),
'target' => '_blank',
'icon' => '<span class="dashicons dashicons-star-filled"></span> ',
],
];
$right_links = apply_filters( 'meta_field_block_get_header_right_links', $right_links );
?>
<div class="mfb-settings-header">
<h1><strong><?php esc_html_e( $this->plugin_title ); ?></strong> <code><?php esc_html_e( $this->the_plugin_instance->get_plugin_version() ); ?></code></h1>
<ul class="lelf-links">
<?php foreach ( $left_links as $link ) : ?>
<?php printf( '<li %5$s><a href="%1$s" target="%3$s"%6$s>%4$s%2$s</a></li>', $link['url'], $link['title'], $link['target'], $link['icon'], $screen->id === $link['id'] ? 'class="is-active"' : '', $link['style'] ?? '' ? ' style="' . $link['style'] . '"' : '' ); ?>
<?php endforeach; ?>
</ul>
<ul class="right-links">
<?php foreach ( $right_links as $link ) : ?>
<?php printf( '<li><a href="%1$s" target="%3$s">%4$s%2$s</a></li>', $link['url'], $link['title'], $link['target'], $link['icon'] ); ?>
<?php endforeach; ?>
</ul>
</div>
<?php
}
}
/**
* Create the admin page
*
* @return void
*/
public function add_admin_page() {
$this->hook_suffix = add_options_page(
$this->plugin_title,
$this->plugin_title,
'manage_options',
'mfb-settings',
function () {
?>
<div class="wrap">
<h2 class="screen-reader-text"><?php esc_html_e( $this->plugin_title ); ?></h2>
<div class="mfb-settings js-mfb-settings-root"></div>
</div>
<?php
},
80
);
}
/**
* Enqueue scripts for the settings page.
*
* @param string $hook_suffix
* @return void
*/
public function enqueue_settings_scripts( $hook_suffix ) {
// Only load scripts for the settings page.
if ( $this->hook_suffix === $hook_suffix || in_array( $hook_suffix, $this->setting_pages, true ) ) {
// Settings asset file.
$settings_asset = $this->the_plugin_instance->include_file( 'build/settings.asset.php' );
// Enqueue scripts.
wp_enqueue_script(
'mfb-settings',
$this->the_plugin_instance->get_file_uri( 'build/settings.js' ),
$settings_asset['dependencies'] ?? [],
$this->the_plugin_instance->get_script_version( $settings_asset ),
true
);
wp_set_script_translations( 'mfb-settings', 'display-a-meta-field-as-block' );
// Enqueue style.
wp_enqueue_style(
'mfb-settings',
$this->the_plugin_instance->get_file_uri( 'build/settings.css' ),
[],
$this->the_plugin_instance->get_script_version( $settings_asset )
);
// Load components style.
wp_enqueue_style( 'wp-components' );
}
}
/**
* Run activated stuff
*
* @return void
*/
public function run_the_plugin_setup() {
if ( ! function_exists( 'get_current_screen' ) ) {
return;
}
$screen = get_current_screen();
if ( ! $screen || 'plugins' !== $screen->id ) {
return;
}
// Redirect to the getting started page, ignore bulk activation.
if (
! ( ( isset( $_REQUEST['action'] ) && 'activate-selected' === $_REQUEST['action'] ) &&
( isset( $_POST['checked'] ) && count( $_POST['checked'] ) > 1 ) ) ) {
add_option( 'meta_field_block_activation_redirect', wp_get_current_user()->ID );
}
}
/**
* Redirect to the getting started page.
*
* @return void
*/
public function meta_field_block_activation_redirect() {
// Make sure it's the correct user.
if ( ! wp_doing_ajax() && wp_get_current_user()->ID > 0 && intval( get_option( 'meta_field_block_activation_redirect', false ) ) === wp_get_current_user()->ID ) {
// Make sure we don't redirect again after this one.
delete_option( 'meta_field_block_activation_redirect' );
if ( ! is_network_admin() ) {
wp_safe_redirect( admin_url( $this->first_path ) );
exit;
}
}
}
/**
* Add the settings page link to the plugin admin screen.
*
* @param array $links
* @return array
*/
public function plugin_settings_links( $links ) : array {
array_unshift( $links, sprintf( '<a href="%1$s">%2$s</a>', admin_url( $this->first_path ), esc_html__( 'Settings', 'display-a-meta-field-as-block' ) ) );
return $links;
}
/**
* Build a custom endpoint to query docs.
*
* @return void
*/
public function register_docs_endpoint() {
register_rest_route(
'mfb/v1',
'/getDocs/',
array(
'methods' => 'GET',
'callback' => [ $this, 'get_docs' ],
'permission_callback' => function () {
return current_user_can( 'publish_posts' );
},
)
);
}
/**
* Get docs.
*
* @param WP_REST_Request $request The request object.
* @return void
*/
public function get_docs( $request ) {
$external_url = 'https://metafieldblock.com/docs/';
$data = [
'videos' => [
'basicFields' => [
'url' => $external_url . 'basic-fields.mp4',
'title' => 'How to use it in the Editor.',
'caption' => 'Display core post meta field, ACF Text, Image, Link fields',
],
'siteEditorFields' => [
'url' => $external_url . 'fields-in-site-editor.mp4',
'title' => 'How to display term meta fields in the Site Editor.',
'caption' => 'Display custom fields for terms in a taxonomy template',
],
'settingFields' => [
'url' => $external_url . 'setting-fields.mp4',
'caption' => 'Display core setting field, ACF Text, Image, Relationship, Group fields',
],
'queryFields' => [
'url' => $external_url . 'query-fields.mp4',
'caption' => 'Display ACF Relationship, or Post Object fields',
],
'otherItemFields' => [
'url' => $external_url . 'other-item-fields.mp4',
'caption' => 'Display an ACF field from another post',
],
'repeaterFields' => [
'url' => $external_url . 'repeater-fields.mp4',
'title' => 'How to display the ACF Repeater field.',
'caption' => 'Display an ACF repeater field as a grid',
],
'groupFields' => [
'url' => $external_url . 'group-fields.mp4',
'title' => 'How to display the ACF Group field.',
'caption' => 'Display an ACF group field',
],
'urlFields' => [
'url' => $external_url . 'url-fields.mp4',
'caption' => 'Display an ACF URL field as a link, a core button, or an image block',
],
'emailFileFields' => [
'url' => $external_url . 'email-file-fields.mp4',
'caption' => 'Display ACF Email and File fields',
],
'galleryFields' => [
'url' => $external_url . 'gallery-field.mp4',
'caption' => 'Display an ACF Gallery field',
],
'fileVideoFields' => [
'url' => $external_url . 'file-video-field.mp4',
'caption' => 'Display an ACF File field as a video',
],
],
];
wp_send_json(
[
'data' => $data,
'success' => true,
]
);
}
/**
* Clear transient cache
*
* @return void
*/
public function clear_transient_cache() {
delete_transient( 'mfb_docs' );
}
/**
* Change the footer text for the settings pages
*
* @param string $footer_text
* @return string
*/
public function admin_footer_text( $footer_text ) {
// Get current screen.
$current_screen = get_current_screen();
if ( $this->hook_suffix === $current_screen->id ) {
$footer_text = '<i><strong>' . esc_html__( $this->plugin_title ) . '</strong> <code>' . esc_html__( $this->the_plugin_instance->get_plugin_version() ) . '</code>. Please <a target="_blank" href="https://wordpress.org/support/plugin/display-a-meta-field-as-block/reviews/#new-post" title="Rate the plugin" style="text-decoration:none">rate the plugin <span style="color:#ffb900">★★★★★</span></a> to help us spread the word. Thank you from the <a href="https://metafieldblock.com/?utm_source=Meta+Field+Block&utm_campaign=Meta+Field+Block+visit+site&utm_medium=link&utm_content=footer-text" target="_blank" title="Visit the Plugin website" style="text-decoration:none"><strong>MFB</strong></a> team!</i>';
}
return $footer_text;
}
}
endif;