, Ruben Garcia * @since 1.0.0 */ // Exit if accessed directly if( !defined( 'ABSPATH' ) ) exit; class GamiPress_Shortcode { public $name = ''; public $description = ''; public $slug = ''; public $icon = ''; public $group = ''; public $output_callback = ''; public $tabs = array(); public $fields = array(); public function __construct( $slug, $args = array() ) { $this->slug = $slug; // Setup this shortcode's properties $this->_set_properties( $args ); // Register this shortcode with WP and GamiPress add_shortcode( $this->slug, $this->output_callback ); add_filter( 'gamipress_shortcodes', array( $this, 'register_shortcode' ) ); } /** * Shortcode form with defaults. */ public function show_form() { $cmb2 = $this->cmb2(); $cmb2->object_id( $this->slug ); CMB2_Hookup::enqueue_cmb_css(); CMB2_Hookup::enqueue_cmb_js(); $cmb2->show_form(); } /** * Creates a new instance of CMB2 and adds the fields * * @since 1.0.0 * * @return CMB2 $cmb2 */ public function cmb2( $saving = false ) { foreach( $this->tabs as $tab_id => $tab ) { // Generate the id of the tab based on shortcode slug $tab['id'] = $this->slug . '_' . $tab_id; foreach( $tab['fields'] as $tab_field_index => $tab_field ) { // Update the id of the tab field based on shortcode slug $tab['fields'][$tab_field_index] = $this->slug . '_' . $tab_field; } $this->tabs[$tab_id] = $tab; } // Create a new box to render the form $cmb2 = new CMB2( array( 'id' => $this->slug .'_box', // Option name is taken from the WP_Widget class. 'classes' => 'gamipress-form gamipress-shortcode-form', 'tabs' => $this->tabs, 'hookup' => false, 'show_on' => array( 'key' => 'options-page', // Tells CMB2 to handle this as an option 'value' => array( $this->slug ) ), ), $this->slug ); foreach( $this->fields as $field_id => $field ) { // Set the id of the field based on shortcode slug $field['id'] = $this->slug . '_' . $field_id; // Loop through group fields if( $field['type'] === 'group' && ! empty( $field['fields'] ) ) { foreach( $field['fields'] as $group_field_id => $group_field ) { // Set the id of the group field based on shortcode slug $field['fields'][$group_field_id]['id'] = $this->slug . '_' . $group_field_id; } } $cmb2->add_field( $field ); } return $cmb2; } private function _set_properties( $args = array() ) { $args = wp_parse_args( $args, array( 'name' => '', 'description' => '', 'icon' => 'gamipress', 'group' => 'others', 'output_callback' => '', 'tabs' => array(), 'fields' => array(), ) ); $this->name = $args['name']; $this->description = $args['description']; $this->icon = $args['icon']; $this->group = $args['group']; $this->output_callback = $args['output_callback']; // Filter to register custom shortcode tabs $this->tabs = apply_filters( "gamipress_{$this->slug}_shortcode_tabs", $args['tabs'] ); // Filter to register custom shortcode fields $this->fields = apply_filters( "gamipress_{$this->slug}_shortcode_fields", $args['fields'] ); // Make some adjustments to fields attributes foreach( $this->fields as $field_id => $field ) { // Update tooltip position to left if( isset( $field['tooltip'] ) ) { if( ! is_array( $field['tooltip'] ) ) { // tooltip => description $field['tooltip'] = array( 'desc' => $field['tooltip'], 'position' => 'left', ); } } $this->fields[$field_id] = $field; } } public function register_shortcode( $shortcodes = array() ) { $shortcodes[ $this->slug ] = $this; return $shortcodes; } }