| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- <?php
- /*******************************************************************************
- * Copyright (c) 2019, Code Atlantic LLC
- ******************************************************************************/
- if ( ! defined( 'ABSPATH' ) ) {
- exit;
- }
- /**
- * Class PUM_Admin_Shortcode_UI
- *
- * This class maintains a global set of all registered PUM shortcodes.
- *
- * @since 1.7.0
- */
- class PUM_Admin_Shortcode_UI {
- private static $initialized = false;
- /**
- * Here for backward compatibility with 3rd party plugins.
- *
- * @deprecated 1.7.0
- */
- public static function instance() {
- self::init();
- }
- public static function init() {
- if ( ! self::$initialized ) {
- add_action( 'admin_init', array( __CLASS__, 'init_editor' ), 20 );
- self::$initialized = true;
- }
- }
- /**
- * Initialize the editor button when needed.
- */
- public static function init_editor() {
- /*
- * Check if the logged in WordPress User can edit Posts or Pages.
- */
- if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
- return;
- }
- /*
- * Check if the logged in WordPress User has the Visual Editor enabled.
- */
- if ( get_user_option( 'rich_editing' ) !== 'true' ) {
- return;
- }
- /*
- * Check if the shortcode ui disabled.
- */
- if ( apply_filters( 'pum_disable_shortcode_ui', false ) || pum_get_option( 'disable_shortcode_ui' ) ) {
- return;
- }
- // Add shortcode ui button & js.
- add_filter( 'mce_buttons', array( __CLASS__, 'mce_buttons' ) );
- add_filter( 'mce_external_plugins', array( __CLASS__, 'mce_external_plugins' ) );
- // Add core site styles for form previews.
- add_editor_style( Popup_Maker::$URL . 'assets/css/pum-site.min.css' );
- // Process live previews.
- add_action( 'wp_ajax_pum_do_shortcode', array( __CLASS__, 'do_shortcode' ) );
- //add_action( 'wp_ajax_pum_do_shortcode', array( __CLASS__, 'wp_ajax_pum_do_shortcode' ) );
- }
- /**
- * Adds our tinymce button
- *
- * @param array $buttons
- *
- * @return array
- */
- public static function mce_buttons( $buttons ) {
- // Enqueue scripts when editor is detected.
- if ( ! did_action( 'admin_enqueue_scripts' ) ) {
- add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ), 120 ); // 120 because core styles are registered at 100 for some reason.
- } else {
- self::enqueue_scripts();
- }
- array_push( $buttons, 'pum_shortcodes' );
- return $buttons;
- }
- /**
- * Enqueues needed assets.
- */
- public static function enqueue_scripts() {
- // Register editor styles.
- add_editor_style( PUM_Admin_Assets::$css_url . 'pum-admin-editor-styles' . PUM_Admin_Assets::$suffix . '.css' );
- wp_enqueue_style( 'pum-admin-shortcode-ui' );
- wp_enqueue_script( 'pum-admin-shortcode-ui' );
- wp_localize_script( 'pum-admin-shortcode-ui', 'pum_shortcode_ui_vars', apply_filters( 'pum_shortcode_ui_vars', array(
- 'nonce' => wp_create_nonce( "pum-shortcode-ui-nonce" ),
- 'I10n' => array(
- 'insert' => __( 'Insert', 'popup-maker' ),
- 'cancel' => __( 'Cancel', 'popup-maker' ),
- 'shortcode_ui_button_tooltip' => __( 'Popup Maker Shortcodes', 'popup-maker' ),
- 'error_loading_shortcode_preview' => __( 'There was an error in generating the preview', 'popup-maker' ),
- ),
- 'shortcodes' => self::shortcode_ui_var(),
- ) ) );
- }
- /**
- * Generates a json object variable to pass to the Shortcode UI front end.
- *
- * @return array
- */
- public static function shortcode_ui_var() {
- $type = pum_typenow();
- $shortcodes = array();
- foreach ( PUM_Shortcodes::instance()->get_shortcodes() as $tag => $shortcode ) {
- $post_types = apply_filters( 'pum_shortcode_post_types', $shortcode->post_types(), $shortcode );
- /**
- * @var $shortcode PUM_Shortcode
- */
- if ( ! in_array( '*', $post_types ) && ! in_array( $type, $post_types ) ) {
- continue;
- }
- $shortcodes[ $tag ] = array(
- 'version' => $shortcode->version,
- 'label' => $shortcode->label(),
- 'description' => $shortcode->description(),
- 'tabs' => $shortcode->_tabs(),
- 'sections' => $shortcode->_subtabs(),
- 'fields' => $shortcode->_fields(),
- 'has_content' => $shortcode->has_content,
- 'ajax_rendering' => $shortcode->ajax_rendering === true,
- );
- }
- return $shortcodes;
- }
- /**
- * Adds our tinymce plugin js
- *
- * @param array $plugin_array
- *
- * @return array
- */
- public static function mce_external_plugins( $plugin_array ) {
- return array_merge( $plugin_array, array(
- 'pum_shortcodes' => add_query_arg( array( 'version'=> Popup_Maker::$VER ), PUM_Admin_Assets::$js_url . 'mce-buttons' . PUM_Admin_Assets::$suffix . '.js' ),
- ) );
- }
- public static function do_shortcode() {
- check_ajax_referer( 'pum-shortcode-ui-nonce', 'nonce' );
- $tag = ! empty( $_REQUEST['tag'] ) ? sanitize_key( $_REQUEST['tag'] ) : false;
- $shortcode = ! empty( $_REQUEST['shortcode'] ) ? stripslashes( sanitize_text_field( $_REQUEST['shortcode'] ) ) : null;
- $post_id = isset( $_REQUEST['post_id'] ) ? intval( $_REQUEST['post_id'] ) : null;
- if ( ! current_user_can( 'edit_post', $post_id ) ) {
- return esc_html__( "You do not have access to preview this post.", 'popup-maker' );
- }
- /** @var PUM_Shortcode $shortcode */
- $shortcode_object = PUM_Shortcodes::instance()->get_shortcode( $tag );
- if ( ! defined( 'PUM_DOING_PREVIEW' ) ) {
- define( 'PUM_DOING_PREVIEW', true );
- }
- /**
- * Often the global $post is not set yet. Set it in case for proper rendering.
- */
- if ( ! empty( $post_id ) ) {
- global $post;
- $post = get_post( $post_id );
- setup_postdata( $post );
- }
- /** @var string $content Rendered shortcode content. */
- $content = PUM_Helpers::do_shortcode( $shortcode );
- /** If no matching tag or $content wasn't rendered die. */
- if ( ! $shortcode_object || $content == $shortcode ) {
- wp_send_json_error();
- }
- /** Generate inline styles when needed. */
- $styles = "<style>" . $shortcode_object->get_template_styles() . "</style>";
- wp_send_json_success( $styles . $content );
- }
- }
|