287 lines
6.3 KiB
PHP
287 lines
6.3 KiB
PHP
<?php
|
|
/**
|
|
* Base class for the WPCode snippets metabox.
|
|
*
|
|
* @package WPCode
|
|
*/
|
|
|
|
/**
|
|
* WPCode metabox snippets.
|
|
*/
|
|
abstract class WPCode_Metabox_Snippets {
|
|
|
|
/**
|
|
* Id used for registering the metabox using add_meta_box.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $id = 'wpcode-metabox-snippets';
|
|
|
|
/**
|
|
* Title of the metabox.
|
|
*
|
|
* @var string
|
|
*/
|
|
public $title;
|
|
|
|
/**
|
|
* Tabs for this metabox.
|
|
*
|
|
* @var array
|
|
*/
|
|
public $tabs;
|
|
|
|
/**
|
|
* If true, the metabox will scroll into view when the page loads.
|
|
*
|
|
* @var bool
|
|
*/
|
|
protected $scroll_into_view = false;
|
|
|
|
/**
|
|
* Register the metabox.
|
|
*/
|
|
public function __construct() {
|
|
$this->hooks();
|
|
}
|
|
|
|
/**
|
|
* Load the translatable strings.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function load_strings() {
|
|
$this->title = __( 'WPCode Page Scripts', 'insert-headers-and-footers' );
|
|
$this->tabs = array(
|
|
'header' => __( 'Header', 'insert-headers-and-footers' ),
|
|
'footer' => __( 'Footer', 'insert-headers-and-footers' ),
|
|
);
|
|
|
|
$body_supported = function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' );
|
|
|
|
if ( $body_supported ) {
|
|
$this->tabs['body'] = __( 'Body', 'insert-headers-and-footers' );
|
|
}
|
|
|
|
$this->tabs['code'] = __( 'Custom Code Snippet', 'insert-headers-and-footers' );
|
|
$this->tabs['revisions'] = __( 'Revisions', 'insert-headers-and-footers' );
|
|
|
|
}
|
|
|
|
/**
|
|
* Add hooks.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function hooks() {
|
|
add_action( 'admin_init', array( $this, 'load_strings' ) );
|
|
add_action( 'add_meta_boxes', array( $this, 'register_metabox' ) );
|
|
add_action( 'admin_head', array( $this, 'close_metabox_for_current_screen' ) );
|
|
}
|
|
|
|
/**
|
|
* Make sure the metabox is closed by default.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function close_metabox_for_current_screen() {
|
|
// Close the metabox by default.
|
|
$screen = get_current_screen();
|
|
if ( ! isset( $screen->id ) ) {
|
|
return;
|
|
}
|
|
if ( apply_filters( 'wpcode_metabox_scripts_force_collapse', true, $screen ) ) {
|
|
add_filter(
|
|
'get_user_option_closedpostboxes_' . $screen->id,
|
|
array(
|
|
$this,
|
|
'add_metabox_to_user_closed',
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add our metabox id to the array of closed metaboxes when the page loads.
|
|
*
|
|
* @param mixed $closed The array of closed metaboxes.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function add_metabox_to_user_closed( $closed ) {
|
|
// Make sure it's an array.
|
|
if ( ! is_array( $closed ) ) {
|
|
$closed = array();
|
|
}
|
|
$closed[] = $this->id;
|
|
|
|
return $closed;
|
|
}
|
|
|
|
/**
|
|
* Use `add_meta_box` to register the metabox for this class.
|
|
*
|
|
* @param string $post_type The post type of the screen where metaboxes are loaded.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function register_metabox( $post_type ) {
|
|
// Don't show the metabox to users who aren't allowed to manage snippets.
|
|
if ( ! current_user_can( 'wpcode_edit_html_snippets' ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( wpcode()->settings->get_option( 'headers_footers_mode' ) ) {
|
|
// Don't load the metabox when headers & footers mode is enabled.
|
|
return;
|
|
}
|
|
|
|
$post_type_details = get_post_type_object( $post_type );
|
|
|
|
// Add metabox only on public post types.
|
|
if ( empty( $post_type_details->public ) ) {
|
|
return;
|
|
}
|
|
|
|
add_meta_box(
|
|
$this->id,
|
|
$this->title,
|
|
array(
|
|
$this,
|
|
'output_metabox_content',
|
|
),
|
|
$post_type,
|
|
'normal',
|
|
apply_filters( 'wpcode_post_metabox_priority', 'default' )
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Metabox content output callback.
|
|
*
|
|
* @param WP_Post $post The post object.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function output_metabox_content( $post ) {
|
|
$this->metabox_start();
|
|
echo '<div class="wpcode-content">';
|
|
$this->tabs_navigation();
|
|
$this->tabs_content( $post );
|
|
echo '</div>';
|
|
$this->metabox_end();
|
|
}
|
|
|
|
/**
|
|
* Output the menu for switching between tabs.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function tabs_navigation() {
|
|
if ( empty( $this->tabs ) ) {
|
|
return;
|
|
}
|
|
?>
|
|
<div class="wpcode-admin-tabs-navigation">
|
|
<ul class="wpcode-admin-tabs">
|
|
<?php
|
|
$class = '';
|
|
foreach ( $this->tabs as $tab_id => $tab_name ) {
|
|
if ( $this->get_active_tab() === $tab_id ) {
|
|
$class = 'active';
|
|
}
|
|
?>
|
|
<li>
|
|
<button type="button" data-target="<?php echo esc_attr( $this->get_tab_html_id( $tab_id ) ); ?>" class="<?php echo esc_attr( $class ); ?>"><?php echo esc_html( $tab_name ); ?></button>
|
|
</li>
|
|
<?php
|
|
$class = '';
|
|
}
|
|
do_action( 'wpcode_metabox_admin_tabs' )
|
|
?>
|
|
</ul>
|
|
</div>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Output the tabs content using tab-specific methods by their ids.
|
|
*
|
|
* @param WP_Post $post The post object.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function tabs_content( $post ) {
|
|
$tab_ids = array_keys( $this->tabs );
|
|
|
|
foreach ( $tab_ids as $tab_id ) {
|
|
$class = 'wpcode-admin-tab-content';
|
|
|
|
$class .= $this->get_active_tab() === $tab_id ? ' active' : '';
|
|
printf(
|
|
'<div class="%1$s" id="%2$s">',
|
|
esc_attr( $class ),
|
|
esc_attr( $this->get_tab_html_id( $tab_id ) )
|
|
);
|
|
if ( method_exists( $this, 'output_tab_' . $tab_id ) ) {
|
|
call_user_func( array( $this, 'output_tab_' . $tab_id ), $post );
|
|
} else {
|
|
$this->output_tab( $tab_id, $post );
|
|
}
|
|
echo '</div>';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generic tab content output method.
|
|
*
|
|
* @param string $tab_id The tab id.
|
|
* @param WP_Post $post The post object.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function output_tab( $tab_id, $post ) {
|
|
}
|
|
|
|
/**
|
|
* Get the active tab id.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_active_tab() {
|
|
$active_tab = 'header';
|
|
if ( isset( $_GET['wpcode-show'] ) && array_key_exists( sanitize_key( $_GET['wpcode-show'] ), $this->tabs ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
|
$active_tab = sanitize_key( $_GET['wpcode-show'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
|
$this->scroll_into_view = true;
|
|
}
|
|
|
|
return $active_tab;
|
|
}
|
|
|
|
/**
|
|
* Get a standard tab id from the array key.
|
|
*
|
|
* @param string $tab_id The tab id.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_tab_html_id( $tab_id ) {
|
|
return 'wpcode-tab-' . $tab_id;
|
|
}
|
|
|
|
/**
|
|
* Method for running logic at the start of the metabox.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function metabox_start() {
|
|
}
|
|
|
|
/**
|
|
* Method for running logic at the end of the metabox, loading scripts, for example.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function metabox_end() {
|
|
}
|
|
}
|