diff --git a/display-featured-image-genesis.php b/display-featured-image-genesis.php index 50b0bf0..c8187b3 100644 --- a/display-featured-image-genesis.php +++ b/display-featured-image-genesis.php @@ -45,6 +45,7 @@ function display_featured_image_genesis_require() { 'class-displayfeaturedimagegenesis-rss', 'class-displayfeaturedimagegenesis-settings', 'class-displayfeaturedimagegenesis-taxonomies', + 'sixtenpress-shortcodes/sixtenpress-shortcodes', ); foreach ( $files as $file ) { diff --git a/includes/class-displayfeaturedimagegenesis-getsetting.php b/includes/class-displayfeaturedimagegenesis-getsetting.php index 86f5026..3d8058c 100644 --- a/includes/class-displayfeaturedimagegenesis-getsetting.php +++ b/includes/class-displayfeaturedimagegenesis-getsetting.php @@ -2,14 +2,14 @@ /** * Class DisplayFeaturedImageGenesisDoSetting - * @package Display_Featured_Image_Genesis + * @package Display_Featured_Image_Genesis * @copyright 2016 Robin Cornett */ class DisplayFeaturedImageGenesisGetSetting { /** * Define the default plugin settings. - * @return mixed|void + * @return array * @since 2.6.0 */ public function defaults() { @@ -30,6 +30,11 @@ class DisplayFeaturedImageGenesisGetSetting { 'centeredX' => 1, 'centeredY' => 1, 'fade' => 750, + 'shortcode' => array( + 'displayfeaturedimagegenesis_term' => 0, + 'displayfeaturedimagegenesis_author' => 0, + 'displayfeaturedimagegenesis_post_type' => 0, + ), ) ); } @@ -42,6 +47,7 @@ class DisplayFeaturedImageGenesisGetSetting { public function get_display_setting() { $defaults = $this->defaults(); $setting = get_option( 'displayfeaturedimagegenesis', $defaults ); + return wp_parse_args( $setting, $defaults ); } diff --git a/includes/class-displayfeaturedimagegenesis-helper.php b/includes/class-displayfeaturedimagegenesis-helper.php index e93afa7..322aa41 100644 --- a/includes/class-displayfeaturedimagegenesis-helper.php +++ b/includes/class-displayfeaturedimagegenesis-helper.php @@ -134,14 +134,12 @@ class Display_Featured_Image_Genesis_Helper extends DisplayFeaturedImageGenesisG * @param $args */ public function do_checkbox_array( $args ) { - $post_types = $this->get_content_types_built_in(); - foreach ( $post_types as $post_type ) { - $object = get_post_type_object( $post_type ); + foreach ( $args['options'] as $key => $value ) { $type_args = array( - 'setting' => "{$args['setting']}][{$post_type}", - 'label' => $object->label, + 'setting' => "{$args['setting']}][{$key}", + 'label' => $value, 'setting_name' => $args['setting'], - 'name' => $post_type, + 'name' => $key, ); $this->do_checkbox( $type_args ); } diff --git a/includes/class-displayfeaturedimagegenesis-settings.php b/includes/class-displayfeaturedimagegenesis-settings.php index 09c0bd5..3cbb1dc 100644 --- a/includes/class-displayfeaturedimagegenesis-settings.php +++ b/includes/class-displayfeaturedimagegenesis-settings.php @@ -23,7 +23,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen /** * The plugin setting. - * @var $setting string + * @var $setting array */ protected $setting; @@ -107,6 +107,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen $previous_user = get_option( 'displayfeaturedimagegenesis', false ); if ( ! $previous_user ) { update_option( 'displayfeaturedimagegenesis_updatedterms', true ); + return; } $this->term_option_query = $this->check_term_images(); @@ -140,12 +141,14 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen /** * Settings for options screen - * @return array settings for backstretch image options * * @since 1.1.0 */ public function register_settings() { - register_setting( 'displayfeaturedimagegenesis', 'displayfeaturedimagegenesis', array( $this, 'do_validation_things' ) ); + register_setting( 'displayfeaturedimagegenesis', 'displayfeaturedimagegenesis', array( + $this, + 'do_validation_things', + ) ); } /** @@ -155,9 +158,18 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen */ protected function define_tabs() { return array( - 'main' => array( 'id' => 'main', 'tab' => __( 'Main', 'display-featured-image-genesis' ) ), - 'style' => array( 'id' => 'style', 'tab' => __( 'Backstretch Output', 'display-featured-image-genesis' ) ), - 'cpt' => array( 'id' => 'cpt', 'tab' => __( 'Content Types', 'display-featured-image-genesis' ) ), + 'main' => array( + 'id' => 'main', + 'tab' => __( 'Main', 'display-featured-image-genesis' ), + ), + 'style' => array( + 'id' => 'style', + 'tab' => __( 'Backstretch Output', 'display-featured-image-genesis' ), + ), + 'cpt' => array( + 'id' => 'cpt', + 'tab' => __( 'Content Types', 'display-featured-image-genesis' ), + ), ); } @@ -168,7 +180,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen */ protected function register_sections() { return array( - 'main' => array( + 'main' => array( 'id' => 'main', 'title' => __( 'Optional Sitewide Settings', 'display-featured-image-genesis' ), ), @@ -176,7 +188,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen 'id' => 'style', 'title' => __( 'Display Settings', 'display-featured-image-genesis' ), ), - 'cpt' => array( + 'cpt' => array( 'id' => 'cpt', 'title' => __( 'Featured Images for Custom Content Types', 'display-featured-image-genesis' ), ), @@ -211,49 +223,84 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen 'title' => __( 'Always Use Default', 'display-featured-image-genesis' ), 'callback' => 'do_checkbox', 'section' => 'main', - 'args' => array( 'setting' => 'always_default', 'label' => __( 'Always use the default image, even if a featured image is set.', 'display-featured-image-genesis' ) ), + 'args' => array( + 'setting' => 'always_default', + 'label' => __( 'Always use the default image, even if a featured image is set.', 'display-featured-image-genesis' ), + ), ), array( 'id' => 'exclude_front', 'title' => __( 'Skip Front Page', 'display-featured-image-genesis' ), 'callback' => 'do_checkbox', 'section' => 'main', - 'args' => array( 'setting' => 'exclude_front', 'label' => __( 'Do not show the Featured Image on the Front Page of the site.', 'display-featured-image-genesis' ) ), + 'args' => array( + 'setting' => 'exclude_front', + 'label' => __( 'Do not show the Featured Image on the Front Page of the site.', 'display-featured-image-genesis' ), + ), ), array( 'id' => 'keep_titles', 'title' => __( 'Do Not Move Titles', 'display-featured-image-genesis' ), 'callback' => 'do_checkbox', 'section' => 'main', - 'args' => array( 'setting' => 'keep_titles', 'label' => __( 'Do not move the titles to overlay the backstretch Featured Image.', 'display-featured-image-genesis' ) ), + 'args' => array( + 'setting' => 'keep_titles', + 'label' => __( 'Do not move the titles to overlay the backstretch Featured Image.', 'display-featured-image-genesis' ), + ), ), array( 'id' => 'move_excerpts', 'title' => __( 'Move Excerpts/Archive Descriptions', 'display-featured-image-genesis' ), 'callback' => 'do_checkbox', 'section' => 'main', - 'args' => array( 'setting' => 'move_excerpts', 'label' => __( 'Move excerpts (if used) on single pages and move archive/taxonomy descriptions to overlay the Featured Image.', 'display-featured-image-genesis' ) ), + 'args' => array( + 'setting' => 'move_excerpts', + 'label' => __( 'Move excerpts (if used) on single pages and move archive/taxonomy descriptions to overlay the Featured Image.', 'display-featured-image-genesis' ), + ), ), array( 'id' => 'is_paged', 'title' => __( 'Show Featured Image on Subsequent Blog Pages', 'display-featured-image-genesis' ), 'callback' => 'do_checkbox', 'section' => 'main', - 'args' => array( 'setting' => 'is_paged', 'label' => __( 'Show featured image on pages 2+ of blogs and archives.', 'display-featured-image-genesis' ) ), + 'args' => array( + 'setting' => 'is_paged', + 'label' => __( 'Show featured image on pages 2+ of blogs and archives.', 'display-featured-image-genesis' ), + ), ), array( 'id' => 'feed_image', 'title' => __( 'Add Featured Image to Feed?', 'display-featured-image-genesis' ), 'callback' => 'do_checkbox', 'section' => 'main', - 'args' => array( 'setting' => 'feed_image', 'label' => __( 'Optionally, add the featured image to your RSS feed.', 'display-featured-image-genesis' ) ), + 'args' => array( + 'setting' => 'feed_image', + 'label' => __( 'Optionally, add the featured image to your RSS feed.', 'display-featured-image-genesis' ), + ), ), array( 'id' => 'thumbnails', 'title' => __( 'Archive Thumbnails', 'display-featured-image-genesis' ), 'callback' => 'do_checkbox', 'section' => 'main', - 'args' => array( 'setting' => 'thumbnails', 'label' => __( 'Use term/post type fallback images for content archives?', 'display-featured-image-genesis' ) ), + 'args' => array( + 'setting' => 'thumbnails', + 'label' => __( 'Use term/post type fallback images for content archives?', 'display-featured-image-genesis' ), + ), + ), + array( + 'id' => 'shortcode', + 'title' => __( 'Add Shortcode Buttons', 'display-featured-image-genesis' ), + 'callback' => 'do_checkbox_array', + 'section' => 'main', + 'args' => array( + 'setting' => 'shortcode', + 'options' => array( + 'displayfeaturedimagegenesis_term' => __( 'Featured Term Widget', 'display-featured-image-genesis' ), + 'displayfeaturedimagegenesis_author' => __( 'Featured Author Widget', 'display-featured-image-genesis' ), + 'displayfeaturedimagegenesis_post_type' => __( 'Featured Post Type Widget', 'display-featured-image-genesis' ), + ), + ), ), ); } @@ -266,21 +313,31 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen return array( array( 'id' => 'less_header', - 'title' => __( 'Height' , 'display-featured-image-genesis' ), + 'title' => __( 'Height', 'display-featured-image-genesis' ), 'callback' => 'do_number', 'section' => 'style', - 'args' => array( 'setting' => 'less_header', 'label' => __( 'pixels to remove', 'display-featured-image-genesis' ), 'min' => 0, 'max' => 400 ), + 'args' => array( + 'setting' => 'less_header', + 'label' => __( 'pixels to remove', 'display-featured-image-genesis' ), + 'min' => 0, + 'max' => 400, + ), ), array( 'id' => 'max_height', - 'title' => __( 'Maximum Height' , 'display-featured-image-genesis' ), + 'title' => __( 'Maximum Height', 'display-featured-image-genesis' ), 'callback' => 'do_number', 'section' => 'style', - 'args' => array( 'setting' => 'max_height', 'label' => __( 'pixels', 'display-featured-image-genesis' ), 'min' => 100, 'max' => 1000 ), + 'args' => array( + 'setting' => 'max_height', + 'label' => __( 'pixels', 'display-featured-image-genesis' ), + 'min' => 100, + 'max' => 1000, + ), ), array( 'id' => 'centeredX', - 'title' => __( 'Center Horizontally' , 'display-featured-image-genesis' ), + 'title' => __( 'Center Horizontally', 'display-featured-image-genesis' ), 'callback' => 'do_radio_buttons', 'section' => 'style', 'args' => array( @@ -291,7 +348,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen ), array( 'id' => 'centeredY', - 'title' => __( 'Center Vertically' , 'display-featured-image-genesis' ), + 'title' => __( 'Center Vertically', 'display-featured-image-genesis' ), 'callback' => 'do_radio_buttons', 'section' => 'style', 'args' => array( @@ -302,10 +359,15 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen ), array( 'id' => 'fade', - 'title' => __( 'Fade' , 'display-featured-image-genesis' ), + 'title' => __( 'Fade', 'display-featured-image-genesis' ), 'callback' => 'do_number', 'section' => 'style', - 'args' => array( 'setting' => 'fade', 'label' => __( 'milliseconds', 'display-featured-image-genesis' ), 'min' => 0, 'max' => 20000 ), + 'args' => array( + 'setting' => 'fade', + 'label' => __( 'milliseconds', 'display-featured-image-genesis' ), + 'min' => 0, + 'max' => 20000, + ), ), ); } @@ -335,14 +397,17 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen 'title' => __( 'Skip Content Types', 'display-featured-image-genesis' ), 'callback' => 'do_checkbox_array', 'section' => 'cpt', - 'args' => array( 'setting' => 'skip' ), + 'args' => array( + 'setting' => 'skip', + 'options' => $this->get_post_types(), + ), ), ); if ( $this->post_types ) { foreach ( $this->post_types as $post ) { - $object = get_post_type_object( $post ); + $object = get_post_type_object( $post ); $fields[] = array( 'id' => 'post_types][' . esc_attr( $object->name ), 'title' => esc_attr( $object->label ), @@ -352,6 +417,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen ); } } + return $fields; } @@ -432,6 +498,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen */ protected function default_image_description() { $large = $this->common->minimum_backstretch_width(); + return sprintf( esc_html__( 'If you would like to use a default image for the featured image, upload it here. Must be at least %1$s pixels wide.', 'display-featured-image-genesis' ), absint( $large + 1 ) @@ -489,9 +556,26 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen ); } + /** + * Get the post types as options. + * @return array + */ + protected function get_post_types() { + $post_types = $this->get_content_types_built_in(); + $options = array(); + foreach ( $post_types as $post_type ) { + $object = get_post_type_object( $post_type ); + $options[ $post_type ] = $object->label; + } + + return $options; + } + /** * validate all inputs + * * @param string $new_value various settings + * * @return string number or URL * * @since 1.4.0 @@ -519,6 +603,10 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen $new_value[ $field['id'] ] = $this->check_value( $new_value[ $field['id'] ], $this->setting[ $field['id'] ], $field['args']['min'], $field['args']['max'] ); } elseif ( 'do_radio_buttons' === $field['callback'] ) { $new_value[ $field['id'] ] = absint( $new_value[ $field['id'] ] ); + } elseif ( 'do_checkbox_array' === $field['callback'] ) { + foreach ( $field['args']['options'] as $option ) { + $new_value[ $field['id'] ][ $option ] = $this->one_zero( $new_value[ $field['id'] ][ $option ] ); + } } } @@ -569,11 +657,13 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen } /** - * Check the numeric value against the allowed range. If it's within the range, return it; otherwise, return the old value. + * Check the numeric value against the allowed range. If it's within the range, return it; otherwise, return the + * old value. + * * @param $new_value int new submitted value * @param $old_value int old setting value - * @param $min int minimum value - * @param $max int maximum value + * @param $min int minimum value + * @param $max int maximum value * * @return int */ @@ -581,6 +671,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen if ( $new_value >= $min && $new_value <= $max ) { return (int) $new_value; } + return (int) $old_value; } @@ -601,21 +692,22 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen $rows = $this->term_option_query; if ( ! $rows ) { update_option( 'displayfeaturedimagegenesis_updatedterms', true ); + return; } - $message = sprintf( '

%s

', __( 'WordPress 4.4 introduces term metadata for categories, tags, and other taxonomies. This is your opportunity to optionally update all impacted terms on your site to use the new metadata.', 'display-featured-image-genesis' ) ); + $message = sprintf( '

%s

', __( 'WordPress 4.4 introduces term metadata for categories, tags, and other taxonomies. This is your opportunity to optionally update all impacted terms on your site to use the new metadata.', 'display-featured-image-genesis' ) ); $message .= sprintf( '

%s

', __( 'This will modify your database (potentially many entries at once), so if you\'d rather do it yourself, you can. Here\'s a list of the affected terms:', 'display-featured-image-genesis' ) ); $message .= ''; $message .= sprintf( '

%s

', __( 'To get rid of this notice, you can 1) update your terms by hand; 2) click the update button (please check your terms afterward); or 3) click the dismiss button.', 'display-featured-image-genesis' ) ); - $faq = sprintf( __( 'For more information, please visit the plugin\'s Frequently Asked Questions on WordPress.org.', 'display-featured-image-genesis' ), esc_url( 'https://wordpress.org/plugins/display-featured-image-genesis/faq/' ) ); + $faq = sprintf( __( 'For more information, please visit the plugin\'s Frequently Asked Questions on WordPress.org.', 'display-featured-image-genesis' ), esc_url( 'https://wordpress.org/plugins/display-featured-image-genesis/faq/' ) ); $message .= sprintf( '

%s

', $faq ); echo '
' . wp_kses_post( $message ); echo '
'; @@ -679,9 +771,11 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen /** * Get IDs of terms with featured images - * @param array $term_ids empty array + * + * @param array $term_ids empty array + * * @return array all terms with featured images - * @since 2.4.0 + * @since 2.4.0 * @deprecated 2.6.1 by check_term_images() due to heavy load on sites with many terms */ protected function get_affected_terms( $affected_terms = array() ) { @@ -707,6 +801,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen } } } + return $affected_terms; } @@ -718,6 +813,7 @@ class Display_Featured_Image_Genesis_Settings extends Display_Featured_Image_Gen */ protected function terms_have_been_updated() { $updated = get_option( 'displayfeaturedimagegenesis_updatedterms', false ); + return (bool) $updated; } diff --git a/includes/class-displayfeaturedimagegenesis.php b/includes/class-displayfeaturedimagegenesis.php index 4ba8ba1..9eebc4a 100644 --- a/includes/class-displayfeaturedimagegenesis.php +++ b/includes/class-displayfeaturedimagegenesis.php @@ -337,6 +337,9 @@ class Display_Featured_Image_Genesis { foreach ( array( 'author', 'post_type', 'term' ) as $shortcode ) { add_shortcode( "displayfeaturedimagegenesis_{$shortcode}", array( $shortcode_class, "shortcode_{$shortcode}" ) ); } + add_filter( 'sixtenpress_shortcode_inline_css', array( $shortcode_class, 'inline_css' ) ); + add_action( 'sixtenpress_shortcode_init', array( $shortcode_class, 'shortcode_buttons' ) ); + add_action( 'sixtenpress_shortcode_modal', array( $shortcode_class, 'do_modal' ) ); } /** diff --git a/includes/sixtenpress-shortcodes/README.md b/includes/sixtenpress-shortcodes/README.md new file mode 100644 index 0000000..e5b0cbb --- /dev/null +++ b/includes/sixtenpress-shortcodes/README.md @@ -0,0 +1,124 @@ +# Six/Ten Press Shortcodes + +This project is meant to be dropped into an existing WordPress plugin or theme and used to allow developers to easily create a button for their shortcode. With fields added to the new shortcode modal, the shortcode will be parsed and inserted into the WordPress editor. + +## Installation + +To use this, add the entire folder to your plugin/theme project. Include the main file with something like this: + +```php +include plugin_dir_path( __FILE__ ) . 'sixtenpress-shortcodes/sixtenpress-shortcodes.php'; +``` + +## Frequently Asked Questions + +### How do I get started? + +To add a new shortcode button to your editor, you'll need at least two functions: one to register your custom button and one to populate the modal. + +To register your custom button, use this code. Some of the parameters are optional, but more information is better than less. + +```php +add_action( 'sixtenpress_shortcode_init', 'prefix_register_shortcode_button' ); +/** + * Register the grid shortcode button. + */ +function prefix_register_shortcode_button() { + sixtenpress_shortcode_register( + 'prefix_my_shortcode', // your actual shortcode + array( + 'modal' => 'prefix_custom_shortcode', // this will be used to create a custom ID and class for your modal + 'button' => array( + 'id' => 'prefix-button', // the unique ID for your custom button + 'class' => 'prefix-build-shortcode', // unique class, which you may want to include for styling + 'dashicon' => 'dashicons-grid-view', // optional, if you want to use a Dashicon + 'label' => __( 'Add My Shortcode', 'prefix-textdomain' ), // Custom label for your button + ), + 'self' => true, // set to false if your shortcode is not self-closing + 'labels' => array( + 'title' => __( 'Create Shortcode', 'prefix-textdomain' ), // optionally customize the title of the modal window + 'insert' => __( 'Insert Shortcode', 'prefix-textdomain' ), // optionally change the text for the modal insert button + ), + 'group_fields' => array( 'show' ), // optional: use this if you have multi-check fields (groups of checkboxes) + ) ); +} +``` + +Fill your new modal with a great form. There are several ways to approach this--basically, any way you can create a form, do it. Here's an example using CMB2 fields: + +```php +add_action( 'sixtenpress_shortcode_modal_prefix_my_shortcode', 'prefix_shortcode_modal' ); +/** + * Add the form to the modal. + * + * @param $shortcode + */ +function prefix_shortcode_modal( $shortcode ) { + $object = cmb2_get_metabox( prefix_custom_shortcode_config(), 'prefix_custom_shortcode' ); + $form = '%3$s
'; + cmb2_metabox_form( $object, 'prefix-build-shortcode', array( + 'form_format' => $form, + ) ); +} + +/** + * Define the fields for the modal CMB2 form. + * @return array + */ +function prefix_custom_shortcode_config() { + return array( + 'id' => 'prefix_custom_shortcode', // Required for CMB2 + 'fields' => array( + array( + 'name' => __( 'Test Text Small', 'prefix-textdomain' ), + 'desc' => __( 'field description (optional)', 'prefix-textdomain' ), + 'default' => __( 'default shortcode param value', 'prefix-textdomain' ), + 'id' => 'shortcode_param', + 'type' => 'text_small', + ), + ), + ); +} +``` + +Depending on how your form is built, you may need to also enqueue additional scripts and/or styles. + +With this example, your shortcode will be output like this: + +[prefix_custom_shortcode shortcode_param="text value"] + +### Current Notes and Limitations + +If your shortcode form that defaults to `true` and should be included as `false` if it is unchecked, make the checkbox a required field. Otherwise, the attribute is assumed to be optional and will be omitted from the final shortcode. + +Currently, CMB2 image fields do not play well in the modal form. The preview fails due to a JavaScript error, and since the form creates both an image and an image_id input, both are passed as attributes, when presumably only the ID is desired. + +CMB2 WYSIWYG fields fail completely, with no errors. If content is needed using CMB2, a textarea is currently a better choice. + +If an image ID is required, Six/Ten Press image fields in a group will work, as in the Leaven Proofing plugin. Images in groups are saved as ID only. + +## Credits +* built by [Robin Cornett](https://robincornett.com) + +### Changelog + +#### 0.3.2 +* reduced unnecessary CSS +* tweaked filter for hooks on which to load the modal buttons + +#### 0.3.1 +* added: filter to restrict media buttons to certain editors + +#### 0.3.0 +* added: reset inputs to default/original parameters + +#### 0.2.0 +* change modal show/hide (enables easier implementation of tinyMCE) +* allow required fields (originally, unchecked checkboxes were not passed to output string) +* improve checkbox validation + +#### 0.1.1 +* fix inline style running multiple times + +#### 0.1.0 +* initial release diff --git a/includes/sixtenpress-shortcodes/includes/class-sixtenpress-shortcodes.php b/includes/sixtenpress-shortcodes/includes/class-sixtenpress-shortcodes.php new file mode 100644 index 0000000..2da926e --- /dev/null +++ b/includes/sixtenpress-shortcodes/includes/class-sixtenpress-shortcodes.php @@ -0,0 +1,230 @@ +shortcode = $shortcode; + $this->shortcode_args = $this->merge( $shortcode_args, $this->defaults() ); + if ( ! $this->shortcode_args ) { + return; + } + foreach ( $this->hooks() as $hook ) { + add_action( $hook, array( $this, 'start_editor' ) ); + } + } + + /** + * Select which hooks to call the shortcode buttons on. + * load-{post}.php is the earliest. + * + * @return array + */ + protected function hooks() { + return apply_filters( 'sixtenpress_shortcode_hooks', array( 'load-post.php', 'load-post-new.php' ) ); + } + + /** + * Merge any custom args with the defaults. + * + * @param $custom_args + * @param $defaults + * + * @return array + */ + protected function merge( $custom_args, $defaults ) { + foreach ( array( 'button', 'labels' ) as $key ) { + if ( array_key_exists( $key, $custom_args ) ) { + $custom_args[ $key ] = wp_parse_args( $custom_args[ $key ], $defaults[ $key ] ); + } + } + $custom_args['slug'] = ! isset( $custom_args['slug'] ) && isset( $custom_args['modal'] ) ? $custom_args['modal'] : $custom_args['slug']; + + return wp_parse_args( $custom_args, $defaults ); + } + + /** + * Default shortcode args. + * + * @return array + */ + protected function defaults() { + return array( + 'modal' => false, + 'button' => array( + 'id' => $this->prefix, + 'class' => $this->prefix, + 'dashicon' => false, + 'label' => __( 'Add Element', 'sixtenpress-shortcodes' ), + ), + 'self' => true, + 'labels' => array( + 'title' => __( 'Create', 'sixtenpress-shortcodes' ), + 'close' => __( 'Close', 'sixtenpress-shortcodes' ), + 'cancel' => __( 'Cancel', 'sixtenpress-shortcodes' ), + 'insert' => __( 'Insert', 'sixtenpress-shortcodes' ), + ), + 'slug' => $this->prefix, + 'group' => array(), + ); + } + + /** + * Load all needful functions for the editor. + */ + public function start_editor() { + add_filter( 'sixtenpress_shortcode_localization', array( $this, 'localization_args' ) ); + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue' ) ); + add_action( 'media_buttons', array( $this, 'media_buttons' ), 98 ); + add_action( 'admin_footer', array( $this, 'widget_builder_modal' ) ); + add_filter( 'sixtenpress_admin_color_picker', '__return_true' ); + add_action( 'admin_print_scripts', array( $this, 'localize' ) ); + } + + /** + * Adds a custom button beside the media uploader button. + * + * @since 1.0.0 + * + * @param string $id The TinyMCE Editor ID + */ + public function media_buttons( $id ) { + // Allow devs to override/cancel media button output. + $show = apply_filters( 'sixtenpress_shortcode_media_button', true, $this->shortcode, $id ); + if ( ! $show ) { + return; + } + printf( '', + esc_attr( $this->shortcode_args['button']['id'] ), + esc_attr( $this->shortcode_args['button']['class'] ), + $this->shortcode_args['button']['dashicon'] ? sprintf( ' ', esc_attr( $this->shortcode_args['button']['dashicon'] ) ) : '', + esc_html( $this->shortcode_args['button']['label'] ), + esc_attr( $id ) + ); + } + + /** + * Enqueue the scripts and styles needed for the modal. + */ + public function enqueue() { + $minify = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + wp_enqueue_script( 'sixtenpress-editor-script', plugin_dir_url( __FILE__ ) . "js/shortcode-editor{$minify}.js", array( 'jquery' ), SIXTENPRESSSHORTCODES_VERSION, true ); + + add_filter( 'sixtenpress_admin_style', '__return_true' ); + wp_enqueue_style( 'sixtenpress-editor', plugin_dir_url( __FILE__ ) . 'css/sixtenpress-editor.css', array(), SIXTENPRESSSHORTCODES_VERSION, 'screen' ); + + $css = apply_filters( 'sixtenpress_shortcode_inline_css', '' ); + if ( $css ) { + wp_add_inline_style( 'sixtenpress-editor', $this->minify_css( $css ) ); + } + } + + /** + * Minify inline CSS a bit before outputting as inline style. + * + * @param $css + * + * @return string + */ + protected function minify_css( $css ) { + $css = str_replace( "\t", '', $css ); + $css = str_replace( array( "\n", "\r" ), ' ', $css ); + + return sanitize_text_field( strip_tags( $css ) ); + } + + /** + * Get the data for the script. + */ + public function localize() { + wp_localize_script( 'sixtenpress-editor-script', 'SixTenShortcodes', apply_filters( 'sixtenpress_shortcode_localization', array() ) ); + } + + /** + * Build the array of args for our script. + * + * @param $args + * + * @return array + */ + public function localization_args( $args ) { + $new[ $this->shortcode ] = array( + 'modal' => $this->shortcode_args['modal'], + 'button' => $this->shortcode_args['button']['class'], + 'shortcode' => $this->shortcode, + 'self' => $this->shortcode_args['self'], + 'slug' => $this->shortcode_args['slug'], + 'group' => (array) $this->shortcode_args['group'], + ); + + return array_merge( $args, $new ); + } + + /** + * Outputs the widget builder modal to insert a widget into an editor. + * + * @since 0.1.0 + */ + public function widget_builder_modal() { + + if ( $this->loaded ) { + return; + } + + $this->loaded = true; + include( plugin_dir_path( __FILE__ ) . 'modal.php' ); + } +} diff --git a/includes/sixtenpress-shortcodes/includes/css/sixtenpress-editor.css b/includes/sixtenpress-shortcodes/includes/css/sixtenpress-editor.css new file mode 100644 index 0000000..2f876b0 --- /dev/null +++ b/includes/sixtenpress-shortcodes/includes/css/sixtenpress-editor.css @@ -0,0 +1 @@ +.sixtenpress-default-ui{-webkit-box-sizing:border-box;box-sizing:border-box}.sixtenpress-default-ui input,.sixtenpress-default-ui select,.sixtenpress-default-ui img{max-width:100%!important}.sixtenpress-default-ui .media-modal-content{margin:0 auto;max-width:800px}.sixtenpress-default-ui .media-frame-content{padding:24px}.sixtenpress-default-ui .media-frame-toolbar{left:0} \ No newline at end of file diff --git a/includes/sixtenpress-shortcodes/includes/js/shortcode-editor.js b/includes/sixtenpress-shortcodes/includes/js/shortcode-editor.js new file mode 100644 index 0000000..5acb214 --- /dev/null +++ b/includes/sixtenpress-shortcodes/includes/js/shortcode-editor.js @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2017 Robin Cornett + */ + +;(function ( document, $, undefined ) { + 'use strict'; + + var SixTenShortcodesEditor = {}; + + /** + * Initialize. Cycle through the parameters for each shortcode button. + */ + SixTenShortcodesEditor.init = function () { + + Object.keys( SixTenShortcodesEditor.params ).forEach( function ( key ) { + if ( SixTenShortcodesEditor.params.hasOwnProperty( key ) ) { + var IndividualObject = SixTenShortcodesEditor.params[key], + sixtenpress_trigger_target = false, + sixtenpress_editor_frame = false, + modal = '.' + IndividualObject.modal, + inputs = $( '#' + IndividualObject.modal ).find( ":input" ), + defaults = _defaults( inputs ); + + $( '.' + IndividualObject.button ).click( _open ); + $( '.sixtenpress-default-ui .sixtenpress-insert' ).click( _insert ); + } + + /** + * Open the modal. + */ + function _open( e ) { + e.preventDefault(); + + // Store the trigger target. + sixtenpress_trigger_target = e.target; + sixtenpress_editor_frame = true; + $( modal ).show(); + + $( '.media-modal-close, .media-modal-backdrop, .sixtenpress-cancel-insertion' ).click( _hide ); + $( document ).on( 'keydown', function ( e ) { + if ( 27 === e.keyCode && sixtenpress_editor_frame ) { + _hide( e ); + } + } ); + } + + /** + * Insert the parsed shortcode into the editor and hide the modal. + */ + function _insert( e ) { + e.preventDefault(); + if ( $( sixtenpress_trigger_target ).hasClass( IndividualObject.button ) ) { + var string = _getAttributes( inputs, IndividualObject.group ), + multi = IndividualObject.group ? _getMulti( IndividualObject.group, IndividualObject.slug ) : '', + output = ''; + if ( string ) { + output = '[' + IndividualObject.shortcode + multi + string + ']'; + if ( ! IndividualObject.self ) { + output += _getContent( IndividualObject.slug, IndividualObject.modal ) + '[/' + IndividualObject.shortcode + ']'; + } + tinymce.get( $( sixtenpress_trigger_target ).attr( 'data-editor' ) ).execCommand( 'mceInsertContent', false, output ); + } + } + + _hide( e ); + } + + /** + * Hide the modal. + * @param e + * @private + */ + function _hide( e ) { + e.preventDefault(); + $( modal ).hide(); + _reset(); + sixtenpress_trigger_target = sixtenpress_editor_frame = false; + } + + /** + * Attempt to reset all inputs to their default state. + * @private + */ + function _reset() { + $( inputs ).each( function ( index ) { + var id = $( this ).attr( 'id' ), + type = this.type; + if ( 'checkbox' === type ) { + var checked = ( 'checked' === defaults[id] ); + $( this ).attr( 'checked', checked ); + } else { + $( this ).val( defaults[id] ); + } + } ); + + $( modal + ' .upload-file-preview' ).remove(); + + _colorPickers(); + _tinymceClear(); + } + + /** + * Clear and reset color pickers. + * @private + */ + function _colorPickers() { + var $colorPicker = $( modal ).find( '.wp-picker-container' ); + + if ( $colorPicker.length ) { + $colorPicker.each( function () { + var $pickerParent = $( this ).parent(); + $pickerParent.html( $pickerParent.find( 'input[type="text"].color-field' ).attr( 'style', '' ) ); + $pickerParent.find( 'input[type="text"].wp-color-picker' ).each( function () { + var $this = $( this ), + settings = $this.data( 'colorpicker' ) || {}; + $this.wpColorPicker( $.extend( {}, false, settings ) ); + } ); + } ); + } + } + + /** + * Clear any tinymce editors. + * @private + */ + function _tinymceClear() { + var $id = $( modal ).find( "textarea[id*='" + IndividualObject.slug + "']" ); + + if ( $id.length ) { + var editor = $id.attr( 'id' ); + tinymce.get( editor ).setContent( '' ); + } + } + } ); + }; + + /** + * Get the default values for each input. + * + * @param inputs + * @returns {Array} + * @private + */ + function _defaults( inputs ) { + var defaults = []; + $( inputs ).each( function ( index ) { + var id = $( this ).attr( 'id' ); + if ( undefined !== id ) { + defaults[id] = $( this ).val(); + } + if ( $( this ).is( ':checked' ) ) { + defaults[id] = 'checked'; + } + } ); + return defaults; + } + + /** + * Get the shortcode attributes as a string. + * + * @param inputs + * @param group + * @returns {string} + * @private + */ + function _getAttributes( inputs, group ) { + var output = ''; + $( inputs ).each( function ( index ) { + var original_id = $( this ).attr( 'id' ), + value = $( this ).val(), + type = this.type; + if ( original_id ) { + var id = original_id.substr( original_id.lastIndexOf( '-' ) + 1 ); + if ( id.includes( 'nonce' ) ) { + value = ''; + } + if ( 'checkbox' === type ) { + if ( group.length && id.includes( group ) ) { + value = ''; + } else if ( $( this ).is( ':checked' ) ) { + var truthy = [ 1, '1', 'on' ], + inArray = truthy.indexOf( value ); + value = ( -1 !== inArray ) ? 'true' : value; + } else if ( $( this ).is( ':required' ) ) { + value = 'false'; + } else { + value = ''; + } + } + if ( 'button' === type ) { + value = ''; + } + if ( 'textarea' === type ) { + value = ''; + } + if ( value || $( this ).is( ':required' ) ) { + output += ' ' + id + '="' + value + '"'; + } + } + } ); + + return output; + } + + /** + * We assume that a textarea or wysiwg will be content for a + * not self-closing shortcode, so values from either of those + * will be handled differently and output within the shortcode tags. + * + * @param slug + * @param modal + * @private + */ + function _getContent( slug, modal ) { + var $id = $( '#' + modal ), + content = $id.find( 'textarea' ).val(); + if ( ! content ) { + var editor = $id.find( "textarea[id*='" + slug + "']" ).attr( 'id' ); + if ( editor !== 'undefined' && editor.length ) { + content = tinymce.get( editor ).getContent( {format: 'text'} ); + } + } + return content; + } + + /** + * Convert a multi checkbox array to a comma separated string. + * Must be defined in the shortcode button args. + * + * @param fields + * @param slug + * @returns {string} + * @private + */ + function _getMulti( fields, slug ) { + var output = ''; + $( fields ).each( function ( index, value ) { + var id = $( '#' + slug ).find( "[id*='" + value + "']" ), + array = []; + $( id ).each( function ( index ) { + if ( $( this ).is( ':checked' ) ) { + array.push( $( this ).val() ); + } + } ); + output += array.length ? ' ' + value + '="' + array.toString() + '"' : ''; + } ); + return output; + } + + $( document ).ready( function () { + SixTenShortcodesEditor.params = typeof SixTenShortcodes === 'undefined' ? '' : SixTenShortcodes; + + if ( typeof SixTenShortcodesEditor.params !== 'undefined' ) { + SixTenShortcodesEditor.init(); + } + } ); +})( document, jQuery ); diff --git a/includes/sixtenpress-shortcodes/includes/js/shortcode-editor.min.js b/includes/sixtenpress-shortcodes/includes/js/shortcode-editor.min.js new file mode 100644 index 0000000..2ea3b98 --- /dev/null +++ b/includes/sixtenpress-shortcodes/includes/js/shortcode-editor.min.js @@ -0,0 +1 @@ +!function(t,e,i){"use strict";function n(t){var n=[];return e(t).each(function(t){var r=e(this).attr("id");i!==r&&(n[r]=e(this).val()),e(this).is(":checked")&&(n[r]="checked")}),n}function r(t,i){var n="";return e(t).each(function(t){var r=e(this).attr("id"),a=e(this).val(),c=this.type;if(r){var o=r.substr(r.lastIndexOf("-")+1);if(o.includes("nonce")&&(a=""),"checkbox"===c)if(i.length&&o.includes(i))a="";else if(e(this).is(":checked")){var s=[1,"1","on"],d=s.indexOf(a);a=-1!==d?"true":a}else a=e(this).is(":required")?"false":"";"button"===c&&(a=""),"textarea"===c&&(a=""),(a||e(this).is(":required"))&&(n+=" "+o+'="'+a+'"')}}),n}function a(t,i){var n=e("#"+i),r=n.find("textarea").val();if(!r){var a=n.find("textarea[id*='"+t+"']").attr("id");"undefined"!==a&&a.length&&(r=tinymce.get(a).getContent({format:"text"}))}return r}function c(t,i){var n="";return e(t).each(function(t,r){var a=e("#"+i).find("[id*='"+r+"']"),c=[];e(a).each(function(t){e(this).is(":checked")&&c.push(e(this).val())}),n+=c.length?" "+r+'="'+c.toString()+'"':""}),n}var o={};o.init=function(){Object.keys(o.params).forEach(function(i){function s(i){i.preventDefault(),v=i.target,m=!0,e(k).show(),e(".media-modal-close, .media-modal-backdrop, .sixtenpress-cancel-insertion").click(u),e(t).on("keydown",function(t){27===t.keyCode&&m&&u(t)})}function d(t){if(t.preventDefault(),e(v).hasClass(p.button)){var i=r(x,p.group),n=p.group?c(p.group,p.slug):"",o="";i&&(o="["+p.shortcode+n+i+"]",p.self||(o+=a(p.slug,p.modal)+"[/"+p.shortcode+"]"),tinymce.get(e(v).attr("data-editor")).execCommand("mceInsertContent",!1,o))}u(t)}function u(t){t.preventDefault(),e(k).hide(),f(),v=m=!1}function f(){e(x).each(function(t){var i=e(this).attr("id");if("checkbox"===this.type){var n="checked"===g[i];e(this).attr("checked",n)}else e(this).val(g[i])}),e(k+" .upload-file-preview").remove(),h(),l()}function h(){var t=e(k).find(".wp-picker-container");t.length&&t.each(function(){var t=e(this).parent();t.html(t.find('input[type="text"].color-field').attr("style","")),t.find('input[type="text"].wp-color-picker').each(function(){var t=e(this),i=t.data("colorpicker")||{};t.wpColorPicker(e.extend({},!1,i))})})}function l(){var t=e(k).find("textarea[id*='"+p.slug+"']");if(t.length){var i=t.attr("id");tinymce.get(i).setContent("")}}if(o.params.hasOwnProperty(i)){var p=o.params[i],v=!1,m=!1,k="."+p.modal,x=e("#"+p.modal).find(":input"),g=n(x);e("."+p.button).click(s),e(".sixtenpress-default-ui .sixtenpress-insert").click(d)}})},e(t).ready(function(){o.params="undefined"==typeof SixTenShortcodes?"":SixTenShortcodes,void 0!==o.params&&o.init()})}(document,jQuery); \ No newline at end of file diff --git a/includes/sixtenpress-shortcodes/includes/modal.php b/includes/sixtenpress-shortcodes/includes/modal.php new file mode 100644 index 0000000..2e19aa8 --- /dev/null +++ b/includes/sixtenpress-shortcodes/includes/modal.php @@ -0,0 +1,40 @@ + diff --git a/includes/sixtenpress-shortcodes/languages/sixtenpress-shortcodes.pot b/includes/sixtenpress-shortcodes/languages/sixtenpress-shortcodes.pot new file mode 100644 index 0000000..1370beb --- /dev/null +++ b/includes/sixtenpress-shortcodes/languages/sixtenpress-shortcodes.pot @@ -0,0 +1,29 @@ +# Copyright (C) 2017 A drop in class for adding shortcode buttons to the editor. +# This file is distributed under the same license as the A drop in class for adding shortcode buttons to the editor. package. +msgid "" +msgstr "" +"Project-Id-Version: A drop in class for adding shortcode buttons to the editor.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: includes/class-sixtenpress-shortcodes.php:111 +msgid "Add Element" +msgstr "" + +#: includes/class-sixtenpress-shortcodes.php:115 +msgid "Create" +msgstr "" + +#: includes/class-sixtenpress-shortcodes.php:116 +msgid "Close" +msgstr "" + +#: includes/class-sixtenpress-shortcodes.php:117 +msgid "Cancel" +msgstr "" + +#: includes/class-sixtenpress-shortcodes.php:118 +msgid "Insert" +msgstr "" diff --git a/includes/sixtenpress-shortcodes/sixtenpress-shortcodes.php b/includes/sixtenpress-shortcodes/sixtenpress-shortcodes.php new file mode 100644 index 0000000..5702af5 --- /dev/null +++ b/includes/sixtenpress-shortcodes/sixtenpress-shortcodes.php @@ -0,0 +1,156 @@ + + * @copyright 2016 Robin Cornett + * @license GPL-2.0+ + * @version 0.3.2 + * @link https://gitlab.com/robincornett/sixtenpress-shortcodes + * @since 0.1.0 + */ + +/** + * Copyright (c) 2017 Robin Cornett (email : hello@robincornett.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2 or, at + * your discretion, any later version, as published by the Free + * Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * Loader versioning: http://jtsternberg.github.io/wp-lib-loader/ + */ + +if ( ! class_exists( 'SixTenPressShortcodes_032', false ) ) { + + /** + * Versioned loader class-name + * + * This ensures each version is loaded/checked. + * + * @category WordPressLibrary + * @package SixTenPressShortcodes + * @author Robin Cornett + * @license GPL-2.0+ + * @version 0.3.2 + * @link https://gitlab.com/robincornett/sixtenpress-shortcodes + * @since 0.1.0 + */ + class SixTenPressShortcodes_032 { + + /** + * SixTenPressShortcodes version number + * @var string + * @since 0.1.0 + */ + const VERSION = '0.3.2'; + + /** + * Current version hook priority. + * Will decrement with each release + * + * @var int + * @since 0.1.0 + */ + const PRIORITY = 9992; + + /** + * Starts the version checking process. + * Creates SIXTENPRESSSHORTCODES_LOADED definition for early detection by + * other scripts. + * + * Hooks SixTenPressShortcodes inclusion to the sixtenpressshortcodes_load hook + * on a high priority which decrements (increasing the priority) with + * each version release. + * + * @since 0.1.0 + */ + public function __construct() { + if ( ! defined( 'SIXTENPRESSSHORTCODES_LOADED' ) ) { + /** + * A constant you can use to check if SixTenPressShortcodes is loaded + * for your plugins/themes with SixTenPressShortcodes dependency. + * + * Can also be used to determine the priority of the hook + * in use for the currently loaded version. + */ + define( 'SIXTENPRESSSHORTCODES_LOADED', self::PRIORITY ); + } + + // Use the hook system to ensure only the newest version is loaded. + add_action( 'sixtenpressshortcodes_load', array( $this, 'include_lib' ), self::PRIORITY ); + + /* + * Hook in to the first hook we have available and + * fire our `sixtenpressshortcodes_load' hook. + */ + add_action( 'muplugins_loaded', array( __CLASS__, 'fire_hook' ), 9 ); + add_action( 'plugins_loaded', array( __CLASS__, 'fire_hook' ), 9 ); + add_action( 'after_setup_theme', array( __CLASS__, 'fire_hook' ), 9 ); + } + + /** + * Fires the sixtenpressshortcodes_load action hook. + * + * @since 0.1.0 + */ + public static function fire_hook() { + if ( ! did_action( 'sixtenpressshortcodes_load' ) ) { + // Then fire our hook. + do_action( 'sixtenpressshortcodes_load' ); + } + } + + /** + * A final check if SixTenPressShortcodes exists before kicking off + * our SixTenPressShortcodes loading. + * + * SIXTENPRESSSHORTCODES_VERSION and SIXTENPRESSSHORTCODES_DIR constants are + * set at this point. + * + * @since 0.1.0 + */ + public function include_lib() { + if ( class_exists( 'SixTenPressShortcodes', false ) ) { + return; + } + + if ( ! defined( 'SIXTENPRESSSHORTCODES_VERSION' ) ) { + /** + * Defines the currently loaded version of SixTenPressShortcodes. + */ + define( 'SIXTENPRESSSHORTCODES_VERSION', self::VERSION ); + } + + if ( ! defined( 'SIXTENPRESSSHORTCODES_DIR' ) ) { + /** + * Defines the directory of the currently loaded version of SixTenPressShortcodes. + */ + define( 'SIXTENPRESSSHORTCODES_DIR', dirname( __FILE__ ) . '/' ); + } + + // Include and initiate SixTenPressShortcodes. + require_once SIXTENPRESSSHORTCODES_DIR . 'includes/class-sixtenpress-shortcodes.php'; + } + + } + + // Kick it off. + new SixTenPressShortcodes_032(); +} diff --git a/includes/widgets/class-displayfeaturedimagegenesis-widgets-shortcodes.php b/includes/widgets/class-displayfeaturedimagegenesis-widgets-shortcodes.php index f711216..8e5192d 100644 --- a/includes/widgets/class-displayfeaturedimagegenesis-widgets-shortcodes.php +++ b/includes/widgets/class-displayfeaturedimagegenesis-widgets-shortcodes.php @@ -6,6 +6,8 @@ class DisplayFeaturedImageGenesisWidgetsShortcodes { /** + * Build the featured author widget shortcode. + * * @param $atts * * @return string @@ -20,6 +22,8 @@ class DisplayFeaturedImageGenesisWidgetsShortcodes { } /** + * Build the featured post type widget shortcode. + * * @param $atts * * @return string @@ -34,6 +38,8 @@ class DisplayFeaturedImageGenesisWidgetsShortcodes { } /** + * Build the featured term widget shortcode. + * * @param $atts * * @return string @@ -48,6 +54,68 @@ class DisplayFeaturedImageGenesisWidgetsShortcodes { } /** + * Add media shortcode buttons to the editor. + */ + public function shortcode_buttons() { + $widgets = array( + 'displayfeaturedimagegenesis_term' => __( 'Add Featured Term Widget', 'display-featured-image-genesis' ), + 'displayfeaturedimagegenesis_author' => __( 'Add Featured Author Widget', 'display-featured-image-genesis' ), + 'displayfeaturedimagegenesis_post_type' => __( 'Add Featured Post Type Widget', 'display-featured-image-genesis' ), + ); + $setting = displayfeaturedimagegenesis_get_setting(); + foreach ( $widgets as $widget => $button_label ) { + if ( ! $setting['shortcode'][ $widget ] ) { + continue; + } + sixtenpress_shortcode_register( $widget, array( + 'modal' => $widget, + 'button' => array( + 'id' => "{$widget}-create", + 'class' => "{$widget}-create", + 'label' => $button_label, + ), + 'self' => true, + 'labels' => array( + 'title' => __( 'Create Widget', 'display-featured-image-genesis' ), + 'insert' => __( 'Insert Widget', 'display-featured-image-genesis' ), + ), + ) ); + } + } + + /** + * Add the widget forms to the modal. + * @param $shortcode + */ + public function do_modal( $shortcode ) { + $widgets = array( + 'displayfeaturedimagegenesis_term' => 'Display_Featured_Image_Genesis_Widget_Taxonomy', + 'displayfeaturedimagegenesis_author' => 'Display_Featured_Image_Genesis_Author_Widget', + 'displayfeaturedimagegenesis_post_type' => 'Display_Featured_Image_Genesis_Widget_CPT', + ); + foreach ( $widgets as $shortcode_text => $widget ) { + if ( $shortcode_text === $shortcode ) { + $class = new $widget(); + $class->form( array() ); + } + } + } + + /** + * Modify our modals' CSS. + * + * @param $css + * + * @return string + */ + public function inline_css( $css ) { + return '.displayfeaturedimagegenesis_term .media-modal-content, .displayfeaturedimagegenesis_post_type .media-modal-content {max-width: 500px;max-height:475px;} + .displayfeaturedimagegenesis_author .media-modal-content {max-width: 300px;}'; + } + + /** + * Get the widget defaults. + * * @param $class * * @return mixed @@ -59,6 +127,7 @@ class DisplayFeaturedImageGenesisWidgetsShortcodes { } /** + * Return the shortcode output. * @param $atts * @param $class * @@ -76,6 +145,8 @@ class DisplayFeaturedImageGenesisWidgetsShortcodes { } /** + * Validate the shortcode. + * * @param $atts * @param $class *