| Server IP : 207.135.97.11 / Your IP : 172.19.0.1 Web Server : LiteSpeed System : Linux 6d372a2d2e33 5.14.0-611.24.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Jan 23 11:42:43 UTC 2026 x86_64 User : nobody ( 65534) PHP Version : 8.3.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /var/www/html/ed.net.au/wp-content/plugins/shortcodes-ultimate/inc/core/ |
Upload File : |
<?php
// phpcs:ignoreFile
/**
* Shortcode Generator
*/
class Su_Generator
{
public function __construct()
{
add_action(
'media_buttons',
array(__CLASS__, 'button_classic_editor'),
1000
);
add_action(
'enqueue_block_editor_assets',
array(__CLASS__, 'button_block_editor')
);
add_action('wp_footer', array(__CLASS__, 'popup'));
add_action('admin_footer', array(__CLASS__, 'popup'));
add_action('wp_ajax_su_generator_settings', array(__CLASS__, 'settings'));
add_action('wp_ajax_su_generator_preview', array(__CLASS__, 'preview'));
add_action('su/generator/actions', array(__CLASS__, 'presets'));
add_action('wp_ajax_su_generator_get_icons', array(__CLASS__, 'ajax_get_icons'));
add_action('wp_ajax_su_generator_get_terms', array(__CLASS__, 'ajax_get_terms'));
add_action('wp_ajax_su_generator_get_taxonomies', array(__CLASS__, 'ajax_get_taxonomies'));
add_action('wp_ajax_su_generator_search_posts', array(__CLASS__, 'ajax_search_posts'));
add_action('wp_ajax_su_generator_search_users', array(__CLASS__, 'ajax_search_users'));
add_action('wp_ajax_su_generator_add_preset', array(__CLASS__, 'ajax_add_preset'));
add_action('wp_ajax_su_generator_remove_preset', array(__CLASS__, 'ajax_remove_preset'));
add_action('wp_ajax_su_generator_get_preset', array(__CLASS__, 'ajax_get_preset'));
}
/**
* @deprecated 5.1.0 Replaced with Su_Generator::classic_editor_button()
*/
public static function button($args = array())
{
return self::button_html_editor($args);
}
public static function classic_editor_button($args = array())
{
return self::button_html_editor($args);
}
public static function button_html_editor($args = array())
{
if (!self::access_check()) {
return;
}
self::enqueue_generator();
$args = wp_parse_args(
$args,
array(
'target' => '',
'tag' => 'button',
'text' => __('Insert shortcode', 'shortcodes-ultimate'),
'class' => 'button',
'icon' => true,
'echo' => true,
'shortcode' => '',
)
);
if ($args['icon']) {
$args['icon'] = '<svg style="vertical-align:middle;position:relative;top:-1px;opacity:.8;width:18px;height:18px" viewBox="0 0 20 20" width="18" height="18" aria-hidden="true"><path fill="currentcolor" d="M8.48 2.75v2.5H5.25v9.5h3.23v2.5H2.75V2.75h5.73zm9.27 14.5h-5.73v-2.5h3.23v-9.5h-3.23v-2.5h5.73v14.5z"/></svg>';
}
$onclick = sprintf(
"SUG.App.insert('html',{editorID:'%s',shortcode:'%s'});return false;",
esc_attr($args['target']),
esc_attr($args['shortcode'])
);
$button = sprintf(
'<%6$s
type="button"
href="javascript:;"
class="su-generator-button %1$s"
title="%2$s"
onclick="%3$s"
>%4$s %5$s</%6$s>',
esc_attr($args['class']),
esc_attr($args['text']),
$onclick,
$args['icon'],
esc_html($args['text']),
sanitize_key($args['tag'])
);
if ($args['echo']) {
echo $button;
}
return $button;
}
public static function button_classic_editor($target)
{
if (!self::access_check()) {
return;
}
self::enqueue_generator();
$onclick = sprintf(
"SUG.App.insert('classic',{editorID:'%s',shortcode:''});",
esc_attr($target)
);
$icon = '<svg style="vertical-align:middle;position:relative;top:-1px;opacity:.8;width:18px;height:18px" viewBox="0 0 20 20" width="18" height="18" aria-hidden="true"><path fill="currentcolor" d="M8.48 2.75v2.5H5.25v9.5h3.23v2.5H2.75V2.75h5.73zm9.27 14.5h-5.73v-2.5h3.23v-9.5h-3.23v-2.5h5.73v14.5z"/></svg>';
$button = sprintf(
'<button
type="button"
class="su-generator-button button"
title="%1$s"
onclick="%2$s"
>
%3$s %1$s
</button>',
__('Insert shortcode', 'shortcodes-ultimate'),
$onclick,
$icon
);
echo $button;
}
public static function button_block_editor()
{
if (!self::access_check()) {
return;
}
self::enqueue_generator();
wp_enqueue_script(
'shortcodes-ultimate-block-editor',
plugins_url('includes/js/block-editor/index.js', SU_PLUGIN_FILE),
array('wp-element', 'wp-components', 'wp-edit-post', 'wp-plugins', 'wp-blocks', 'wp-data'),
SU_PLUGIN_VERSION,
true
);
wp_enqueue_style(
'shortcodes-ultimate-block-editor',
plugins_url('includes/css/block-editor.css', SU_PLUGIN_FILE),
array(),
SU_PLUGIN_VERSION
);
wp_localize_script(
'shortcodes-ultimate-block-editor',
'SUBlockEditorL10n',
array(
'insertShortcode' => __('Insert shortcode', 'shortcodes-ultimate'),
'livePreviewTitle' => __('Live Preview', 'shortcodes-ultimate'),
'livePreviewDescription' => __('This is a Live Preview. Click this button to open the shortcode generator and try the plugin.', 'shortcodes-ultimate'),
)
);
wp_localize_script(
'shortcodes-ultimate-block-editor',
'SUBlockEditorSettings',
array(
'supportedBlocks' => get_option('su_option_supported_blocks', array()),
'showToolbarButton' => get_option('su_option_show_toolbar_button', 'on'),
'showBlockControlsButton' => get_option('su_option_show_block_controls_button', 'on'),
'isLivePreview' => su_is_live_preview_request(),
)
);
}
public static function enqueue_generator()
{
do_action('su/generator/enqueue');
self::enqueue_assets();
}
public static function enqueue_assets()
{
wp_enqueue_media();
su_query_asset(
'css',
array(
'simpleslider',
'farbtastic',
'magnific-popup',
'su-icons',
'su-generator',
)
);
su_query_asset(
'js',
array(
'jquery',
'jquery-ui-core',
'jquery-ui-widget',
'jquery-ui-mouse',
'jquery-ui-sortable',
'simpleslider',
'farbtastic',
'magnific-popup',
'su-generator',
)
);
}
public static function normalize_shortcode($shortcode)
{
$shortcode = is_array($shortcode) ? $shortcode : array();
foreach (array('name' => 'untitled-shortcode', 'desc' => '', 'group' => 'other', 'atts' => array()) as $key => $value) {
if (!isset($shortcode[$key])) {
$shortcode[$key] = $value;
}
}
return $shortcode;
}
public static function get_choice_icon($shortcode_id, $shortcode)
{
$shortcode = self::normalize_shortcode($shortcode);
if (!isset($shortcode['icon'])) {
$shortcode['icon'] = 'puzzle-piece';
}
$svg_icon_path = 'admin/images/shortcodes/svgs/' . $shortcode_id . '.svg';
$svg_file = su_get_plugin_path() . $svg_icon_path;
$svg_url = su_get_plugin_url() . $svg_icon_path;
if (file_exists($svg_file)) {
$shortcode['icon'] = $svg_url . '?v=' . SU_PLUGIN_VERSION;
}
if (strpos($shortcode['icon'], '/') === false) {
$shortcode['icon'] = 'icon:' . $shortcode['icon'];
}
return su_html_icon($shortcode['icon']);
}
/**
* Generator popup form
*/
public static function popup()
{
if (!did_action('su/generator/enqueue')) {
return;
}
$tools = apply_filters('su/generator/tools', array(
'<a href="' . admin_url('admin.php?page=shortcodes-ultimate-settings') . '" target="_blank" title="' . __('Settings', 'shortcodes-ultimate') . '">' . __('Plugin settings', 'shortcodes-ultimate') . '</a>',
'<a href="https://getshortcodes.com/" target="_blank" title="' . __('Plugin homepage', 'shortcodes-ultimate') . '">' . __('Plugin homepage', 'shortcodes-ultimate') . '</a>',
));
if (!su_fs()->can_use_premium_code() && !su_has_all_active_addons()) {
$tools[] = '<a href="' . esc_attr(su_get_utm_link('https://getshortcodes.com/pricing/', 'wp-dashboard', 'generator', 'badge')) . '" target="_blank" title="' . __('Upgrade to PRO', 'shortcodes-ultimate') . '" class="su-add-ons">★ ' . __('Upgrade to PRO', 'shortcodes-ultimate') . '</a>';
}
?>
<div id="su-generator-wrap" style="display:none">
<div id="su-generator">
<div class="su-generator-header">
<!-- <div id="su-generator-tools"><?php echo implode(' <span></span> ', $tools); ?></div> -->
<div class="su-generator-header-title">
<?php _e('Insert Shortcode', 'shortcodes-ultimate'); ?>
</div>
<div id="su-generator-search-wrapper">
<input type="text" name="su_generator_search" id="su-generator-search" value="" placeholder="<?php _e('Search for shortcodes', 'shortcodes-ultimate'); ?>" />
<button type="button" id="su-generator-search-clear" title="<?php esc_attr_e('Clear search', 'shortcodes-ultimate'); ?>" aria-label="<?php esc_attr_e('Clear search', 'shortcodes-ultimate'); ?>">
<i class="sui sui-times" aria-hidden="true"></i>
</button>
</div>
</div>
<!-- <p id="su-generator-search-pro-tip"><?php printf('<strong>%s:</strong> %s', __('Pro Tip', 'shortcodes-ultimate'), __('Hit enter to select highlighted shortcode, while searching', 'shortcodes-ultimate')) ?></p> -->
<?php if (!su_fs()->can_use_premium_code() && !su_has_all_active_addons()): ?>
<div class="su-generator-pro-nag">
<?php
// translators: %s is replaced with "Shortcodes Ultimate Pro link"
printf(
__('Unlock 15 additional shortcodes, 60+ styles, and create your own shortcodes with %s', 'shortcodes-ultimate'),
sprintf(
'<a href="%s" target="_blank">%s ›</a>',
esc_attr(su_get_utm_link('https://getshortcodes.com/pricing/', 'wp-dashboard', 'generator', 'pro-nag')),
__('Shortcodes Ultimate Pro', 'shortcodes-ultimate')
)
);
?>
<a href="<?php echo esc_attr(su_get_utm_link('https://getshortcodes.com/pricing/', 'wp-dashboard', 'generator', 'pro-nag')) ?>" target="_blank" class="su-generator-pro-nag-block-link" tabindex="-1" aria-hidden="true"><?php _e('Shortcodes Ultimate Pro', 'shortcodes-ultimate') ?></a>
</div>
<?php endif; ?>
<div id="su-generator-choices">
<?php foreach (self::get_shortcodes_grouped() as $group_id => $group): ?>
<div class="su-generator-choices-group">
<div class="su-generator-choices-group-title">
<?php echo esc_html($group['title']); ?>
</div>
<div class="su-generator-choices-group-items">
<?php foreach ($group['shortcodes'] as $shortcode_id => $shortcode): ?>
<?php $is_pro_choice = !su_fs()->can_use_premium_code() && isset($shortcode['is_pro']) && $shortcode['is_pro']; ?>
<div class="su-generator-choice<?php echo $is_pro_choice ? ' su-generator-choice-is-pro' : ''; ?>" data-name="<?php echo esc_attr($shortcode['name']); ?>" data-shortcode="<?php echo esc_attr($shortcode_id); ?>" title="<?php echo esc_attr($shortcode['desc']); ?>" data-desc="<?php echo esc_attr($shortcode['desc']); ?>" data-group="<?php echo esc_attr($shortcode['group']); ?>">
<?php echo self::get_choice_icon($shortcode_id, $shortcode); ?>
<span><?php echo esc_html($shortcode['name']); ?></span>
<?php if ($is_pro_choice): ?>
<span class="su-generator-choice-pro-icon" aria-hidden="true">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" focusable="false"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294zM5 21h14"/></svg>
</span>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endforeach; ?>
</div>
<div id="su-generator-settings"></div>
<input type="hidden" name="su-generator-selected" id="su-generator-selected" value="<?php echo plugins_url('', SU_PLUGIN_FILE); ?>" />
<input type="hidden" name="su-generator-url" id="su-generator-url" value="<?php echo plugins_url('', SU_PLUGIN_FILE); ?>" />
<input type="hidden" name="su-compatibility-mode-prefix" id="su-compatibility-mode-prefix" value="<?php echo su_get_shortcode_prefix(); ?>" />
<input type="hidden" name="su-generator-option-skip" id="su-generator-option-skip" value="<?php echo esc_attr(get_option('su_option_skip', '')); ?>" />
<?php wp_nonce_field('su_generator_preset', 'su_generator_presets_nonce'); ?>
<?php wp_nonce_field('su_generator_preview', 'su_generator_preview_nonce'); ?>
<div id="su-generator-result" style="display:none"></div>
</div>
</div>
<?php
}
/**
* Normalize shortcode generator tabs.
*/
private static function get_generator_tabs($shortcode)
{
if (
empty($shortcode['tabs']) ||
!is_array($shortcode['tabs'])
) {
return array();
}
$tabs = array();
foreach ($shortcode['tabs'] as $tab_id => $tab_info) {
$tab_id = sanitize_key($tab_id);
if (!$tab_id) {
continue;
}
if (is_string($tab_info)) {
$tab_info = array(
'title' => $tab_info,
);
}
if (!is_array($tab_info)) {
continue;
}
$tabs[$tab_id] = wp_parse_args(
$tab_info,
array(
'title' => $tab_id,
'icon' => '',
)
);
}
return $tabs;
}
private static function get_generator_tab_icon($tab)
{
if (empty($tab['icon'])) {
return '';
}
$icon = $tab['icon'];
if (strpos($icon, '/') === false && strpos($icon, 'icon:') !== 0) {
$icon = 'icon:' . $icon;
}
return su_html_icon($icon);
}
private static function render_generator_tabs($tabs)
{
if (empty($tabs)) {
return '';
}
$return = '<div class="su-generator-tabs" role="tablist">';
$count = 0;
foreach ($tabs as $tab_id => $tab) {
$active = $count === 0;
$tab_dom_id = 'su-generator-tab-' . sanitize_html_class($tab_id);
$panel_dom_id = 'su-generator-tab-panel-' . sanitize_html_class($tab_id);
$icon = self::get_generator_tab_icon($tab);
$return .= '<button type="button" class="su-generator-tab' . ($active ? ' su-generator-tab-active' : '') . '" data-tab="' . esc_attr($tab_id) . '" id="' . esc_attr($tab_dom_id) . '" role="tab" aria-selected="' . ($active ? 'true' : 'false') . '" aria-controls="' . esc_attr($panel_dom_id) . '">';
if ($icon) {
$return .= '<span class="su-generator-tab-icon" aria-hidden="true">' . $icon . '</span>';
}
$return .= '<span class="su-generator-tab-title">' . esc_html($tab['title']) . '</span>';
$return .= '</button>';
$count++;
}
$return .= '</div>';
return $return;
}
private static function render_generator_tab_panels($tabs, $panels)
{
if (empty($tabs)) {
return '';
}
$return = '<div class="su-generator-tab-panels">';
$count = 0;
foreach ($tabs as $tab_id => $tab) {
$active = $count === 0;
$tab_dom_id = 'su-generator-tab-' . sanitize_html_class($tab_id);
$panel_dom_id = 'su-generator-tab-panel-' . sanitize_html_class($tab_id);
$content = isset($panels[$tab_id]) ? $panels[$tab_id] : '';
$return .= '<div class="su-generator-tab-panel' . ($active ? ' su-generator-tab-panel-active' : '') . '" data-tab="' . esc_attr($tab_id) . '" id="' . esc_attr($panel_dom_id) . '" role="tabpanel" aria-labelledby="' . esc_attr($tab_dom_id) . '" aria-hidden="' . ($active ? 'false' : 'true') . '">';
$return .= $content;
$return .= '</div>';
$count++;
}
$return .= '</div>';
return $return;
}
private static function render_generator_attribute($attr_name, $attr_info, $skip)
{
if (isset($attr_info['hidden']) && $attr_info['hidden']) {
return '';
}
// Prepare default value
$default = (string) (isset($attr_info['default'])) ? $attr_info['default'] : '';
$attr_info['name'] = (isset($attr_info['name'])) ? $attr_info['name'] : $attr_name;
$return = '<div class="su-generator-attr-container' . $skip . '" data-default="' . esc_attr($default) . '">';
$return .= '<h5>' . $attr_info['name'] . '</h5>';
// Create field types
if (!isset($attr_info['type']) && isset($attr_info['values']) && is_array($attr_info['values']) && count($attr_info['values']))
$attr_info['type'] = 'select';
elseif (!isset($attr_info['type']))
$attr_info['type'] = 'text';
if (is_callable(array('Su_Generator_Views', $attr_info['type'])))
$return .= call_user_func(array('Su_Generator_Views', $attr_info['type']), $attr_name, $attr_info);
elseif (isset($attr_info['callback']) && is_callable($attr_info['callback']))
$return .= call_user_func($attr_info['callback'], $attr_name, $attr_info);
if (isset($attr_info['desc']))
$return .= '<div class="su-generator-attr-desc">' . str_replace(array('<b%value>', '<b_>'), '<b class="su-generator-set-value" title="' . __('Click to set this value', 'shortcodes-ultimate') . '">', $attr_info['desc']) . '</div>';
$return .= '</div>';
return $return;
}
private static function render_generator_content_field($shortcode)
{
if (!isset($shortcode['content'])) {
$shortcode['content'] = '';
}
if (is_array($shortcode['content'])) {
$shortcode['content'] = self::get_shortcode_code($shortcode['content']);
}
return '<div class="su-generator-attr-container"><h5>' . __('Content', 'shortcodes-ultimate') . '</h5><textarea name="su-generator-content" id="su-generator-content" rows="5">' . esc_attr(str_replace(array('%prefix_', '__'), su_get_shortcode_prefix(), $shortcode['content'])) . '</textarea></div>';
}
/**
* Process AJAX request
*/
public static function settings()
{
self::access();
// Param check
if (empty($_REQUEST['shortcode']))
wp_die(__('Shortcode not specified', 'shortcodes-ultimate'));
// Request queried shortcode
$shortcode = self::normalize_shortcode(su_get_shortcode(sanitize_key($_REQUEST['shortcode'])));
// Call custom callback
if (
isset($shortcode['generator_callback']) &&
is_callable($shortcode['generator_callback'])
) {
call_user_func($shortcode['generator_callback'], $shortcode);
exit;
}
// Prepare skip-if-default option
$skip = (get_option('su_option_skip') === 'on') ? ' su-generator-skip' : '';
// Prepare actions
$actions = apply_filters('su/generator/actions', array(
'insert' => '<a href="javascript:void(0);" class="button button-primary button-large su-generator-insert"><i class="sui sui-check"></i> ' . __('Insert shortcode', 'shortcodes-ultimate') . '</a>',
'copy' => '<button type="button" class="button button-large su-generator-copy" data-label="' . esc_attr__( 'Copy shortcode', 'shortcodes-ultimate' ) . '" data-copied-label="' . esc_attr__( 'Copied', 'shortcodes-ultimate' ) . '" aria-label="' . esc_attr__( 'Copy shortcode', 'shortcodes-ultimate' ) . '"><i class="sui sui-copy" aria-hidden="true"></i><span class="su-generator-copy-label">' . esc_html__( 'Copy shortcode', 'shortcodes-ultimate' ) . '</span></button>',
'reset' => '<button type="button" class="button button-large su-generator-reset" aria-label="' . esc_attr__( 'Reset Settings', 'shortcodes-ultimate' ) . '"><i class="sui sui-undo" aria-hidden="true"></i>' . esc_html__( 'Reset Settings', 'shortcodes-ultimate' ) . '</button>',
));
$return = '<div class="su-generator-settings-body">';
$return .= '<div class="su-generator-settings-fields">';
$tabs = self::get_generator_tabs($shortcode);
$first_tab = empty($tabs) ? '' : key($tabs);
$tab_panels = array();
foreach ($tabs as $tab_id => $tab) {
$tab_panels[$tab_id] = '';
}
// Shortcode header
$return .= '<div id="su-generator-breadcrumbs">';
$return .= apply_filters('su/generator/breadcrumbs', '<a href="javascript:void(0);" class="su-generator-home" title="' . __('Click to return to the shortcodes list', 'shortcodes-ultimate') . '">' . __('All shortcodes', 'shortcodes-ultimate') . '</a> → <span>' . $shortcode['name'] . '</span> <small class="alignright">' . $shortcode['desc'] . '</small><div class="su-generator-clear"></div>');
$return .= '</div>';
// Shortcode note
if (isset($shortcode['note'])) {
$return .= '<div class="su-generator-note"><i class="sui sui-info-circle"></i><div class="su-generator-note-content">' . wpautop($shortcode['note']) . '</div></div>';
}
// Shortcode CTA
if (isset($shortcode['generator_cta'])) {
$return .= '<div class="su-generator-cta"><div class="su-generator-cta-content">' . $shortcode['generator_cta'] . '</div></div>';
}
// Shortcode has atts
if (isset($shortcode['atts']) && count($shortcode['atts'])) {
// Loop through shortcode parameters
foreach ($shortcode['atts'] as $attr_name => $attr_info) {
if (empty($tabs)) {
$return .= self::render_generator_attribute($attr_name, $attr_info, $skip);
continue;
}
$tab_id = isset($attr_info['tab']) ? sanitize_key($attr_info['tab']) : $first_tab;
if (!isset($tab_panels[$tab_id])) {
$tab_id = $first_tab;
}
$tab_panels[$tab_id] .= self::render_generator_attribute($attr_name, $attr_info, $skip);
}
}
// Single shortcode (not closed)
if ($shortcode['type'] == 'single')
$return .= '<input type="hidden" name="su-generator-content" id="su-generator-content" value="false" />';
// Wrapping shortcode
else {
if (empty($tabs)) {
$return .= self::render_generator_content_field($shortcode);
} else {
$tab_panels[$first_tab] .= self::render_generator_content_field($shortcode);
}
}
$return .= self::render_generator_tabs($tabs);
$return .= self::render_generator_tab_panels($tabs, $tab_panels);
$return .= '</div>';
$return .= '<div class="su-generator-preview-panel"><div id="su-generator-preview"></div></div>';
$return .= '</div>';
$return .= '<div class="su-generator-actions su-generator-clearfix">' . implode(' ', array_values($actions)) . '</div>';
echo $return;
exit;
}
/**
* Process AJAX request and generate preview HTML
*/
public static function preview()
{
// Check nonce
if (
empty($_POST['nonce']) ||
!wp_verify_nonce($_POST['nonce'], 'su_generator_preview')
) {
return;
}
// Check authentication
self::access();
// Output results
do_action('su/generator/preview/before');
$shortcode = wp_unslash($_POST['shortcode']);
echo '<h5>' . __('Preview', 'shortcodes-ultimate') . '</h5>';
echo apply_filters('su/generator/preview/output', do_shortcode($shortcode), $shortcode);
echo '<div style="clear:both"></div>';
do_action('su/generator/preview/after');
die();
}
public static function access()
{
if (!self::access_check())
wp_die(__('Access denied', 'shortcodes-ultimate'));
}
public static function access_check()
{
$required_capability = (string) get_option(
'su_option_generator_access',
'manage_options'
);
return current_user_can($required_capability);
}
public static function ajax_get_icons()
{
self::access();
$icons = array();
foreach (su_get_config('icons') as $icon) {
$icons[] = '<i class="sui sui-' . $icon . '" title="' . $icon . '"></i>';
}
die(implode('', $icons));
}
public static function ajax_get_terms()
{
self::access();
$args = array();
if (isset($_REQUEST['tax']))
$args['options'] = (array) self::get_terms(sanitize_key($_REQUEST['tax']));
if (isset($_REQUEST['class']))
$args['class'] = (string) sanitize_key($_REQUEST['class']);
if (isset($_REQUEST['multiple']))
$args['multiple'] = (bool) sanitize_key($_REQUEST['multiple']);
if (isset($_REQUEST['size']))
$args['size'] = (int) sanitize_key($_REQUEST['size']);
if (isset($_REQUEST['noselect']))
$args['noselect'] = (bool) sanitize_key($_REQUEST['noselect']);
die(su_html_dropdown($args));
}
public static function ajax_get_taxonomies()
{
self::access();
$args = array();
$args['options'] = self::get_taxonomies();
die(su_html_dropdown($args));
}
public static function ajax_search_posts()
{
self::access();
$ids = array();
if (isset($_REQUEST['ids'])) {
$ids = is_array($_REQUEST['ids'])
? $_REQUEST['ids']
: explode(',', (string) wp_unslash($_REQUEST['ids']));
$ids = array_filter(array_map('absint', $ids));
}
$args = array(
'no_found_rows' => true,
'post_status' => 'publish',
'post_type' => self::get_searchable_post_types(),
'posts_per_page' => 20,
'suppress_filters' => false,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
);
if (!empty($ids)) {
$args['orderby'] = 'post__in';
$args['post__in'] = $ids;
$args['posts_per_page'] = count($ids);
} else {
$search = isset($_REQUEST['search'])
? sanitize_text_field(wp_unslash($_REQUEST['search']))
: '';
if (strlen($search) < 2) {
wp_send_json_success(array('results' => array()));
}
$args['s'] = $search;
}
$query = new WP_Query($args);
$results = array();
foreach ($query->posts as $post) {
$results[] = self::format_post_search_result($post);
}
wp_send_json_success(array('results' => $results));
}
private static function get_searchable_post_types()
{
$post_types = array();
foreach (get_post_types(array(), 'objects') as $post_type) {
if (true === $post_type->show_ui) {
$post_types[] = $post_type->name;
}
}
return array_values(
(array) apply_filters(
'su/generator/search_posts/post_types',
$post_types
)
);
}
private static function format_post_search_result($post)
{
$post_type = get_post_type_object($post->post_type);
$post_type_label = $post_type ? $post_type->labels->singular_name : $post->post_type;
$title = get_the_title($post);
if ('' === $title) {
$title = __('(no title)', 'shortcodes-ultimate');
}
return array(
'value' => (string) $post->ID,
'label' => sprintf(
'%1$s (#%2$d, %3$s)',
$title,
$post->ID,
$post_type_label
),
);
}
public static function ajax_search_users()
{
self::access();
$ids = array();
if (isset($_REQUEST['ids'])) {
$ids = is_array($_REQUEST['ids'])
? $_REQUEST['ids']
: explode(',', (string) wp_unslash($_REQUEST['ids']));
$ids = array_filter(array_map('absint', $ids));
}
$args = array(
'fields' => 'all',
'number' => 20,
);
if (!empty($ids)) {
$args['include'] = $ids;
$args['number'] = count($ids);
$args['orderby'] = 'include';
} else {
$search = isset($_REQUEST['search'])
? sanitize_text_field(wp_unslash($_REQUEST['search']))
: '';
if (strlen($search) < 2) {
wp_send_json_success(array('results' => array()));
}
$args['search'] = '*' . $search . '*';
$args['search_columns'] = array(
'user_login',
'user_nicename',
'display_name',
'user_email',
);
}
$results = array();
foreach (get_users($args) as $user) {
$results[] = self::format_user_search_result($user);
}
wp_send_json_success(array('results' => $results));
}
private static function format_user_search_result($user)
{
$label = $user->display_name ? $user->display_name : $user->user_login;
return array(
'value' => (string) $user->ID,
'label' => sprintf(
'%1$s (%2$s, #%3$d)',
$label,
$user->user_login,
$user->ID
),
);
}
public static function presets($actions)
{
ob_start();
?>
<div class="su-generator-presets alignright" data-shortcode="<?php echo sanitize_key($_REQUEST['shortcode']); ?>">
<a href="javascript:void(0);" class="button button-large su-gp-button"><i class="sui sui-bars"></i> <?php _e('Presets', 'shortcodes-ultimate'); ?></a>
<div class="su-gp-popup">
<div class="su-gp-head">
<a href="javascript:void(0);" class="button button-small button-primary su-gp-new"><?php _e('Save current settings as preset', 'shortcodes-ultimate'); ?></a>
</div>
<div class="su-gp-list">
<?php self::presets_list(); ?>
</div>
</div>
</div>
<?php
$actions['presets'] = ob_get_contents();
ob_end_clean();
return $actions;
}
public static function presets_list($shortcode = false)
{
// Shortcode isn't specified, try to get it from $_REQUEST
if (!$shortcode)
$shortcode = $_REQUEST['shortcode'];
// Shortcode name is still doesn't exists, exit
if (!$shortcode)
return;
// Shortcode has been specified, sanitize it
$shortcode = sanitize_key($shortcode);
// Get presets
$presets = get_option('su_presets_' . $shortcode);
// Presets has been found
if (is_array($presets) && count($presets)) {
// Print the presets
foreach ($presets as $preset) {
echo '<span data-id="' . $preset['id'] . '"><em>' . stripslashes($preset['name']) . '</em> <i class="sui sui-times"></i></span>';
}
// Hide default text
echo sprintf('<b style="display:none">%s</b>', __('Presets not found', 'shortcodes-ultimate'));
}
// Presets doesn't found
else
echo sprintf('<b>%s</b>', __('Presets not found', 'shortcodes-ultimate'));
}
public static function ajax_add_preset()
{
self::access();
// Check incoming data
if (empty($_POST['id']))
return;
if (empty($_POST['name']))
return;
if (empty($_POST['settings']))
return;
if (empty($_POST['shortcode']))
return;
// Check Nonce
if (
empty($_POST['nonce']) ||
!is_string($_POST['nonce']) ||
!wp_verify_nonce($_POST['nonce'], 'su_generator_preset')
) {
return;
}
// Clean-up incoming data
$id = sanitize_key($_POST['id']);
$name = sanitize_text_field($_POST['name']);
$shortcode = sanitize_key($_POST['shortcode']);
// Validate and sanitize settings
$settings = is_array($_POST['settings']) ? stripslashes_deep($_POST['settings']) : array();
$settings = array_map('wp_kses_post', $settings);
// Prepare option name
$option = 'su_presets_' . $shortcode;
// Get the existing presets
$current = get_option($option);
// Create array with new preset
$new = array(
'id' => $id,
'name' => $name,
'settings' => $settings,
);
// Add new array to the option value
if (!is_array($current))
$current = array();
$current[$id] = $new;
// Save updated option
update_option($option, $current);
// Clear cache
delete_transient('su/generator/settings/' . $shortcode);
}
public static function ajax_remove_preset()
{
self::access();
// Check incoming data
if (empty($_POST['id']))
return;
if (empty($_POST['shortcode']))
return;
// Check Nonce
if (
empty($_POST['nonce']) ||
!is_string($_POST['nonce']) ||
!wp_verify_nonce($_POST['nonce'], 'su_generator_preset')
) {
return;
}
// Clean-up incoming data
$id = sanitize_key($_POST['id']);
$shortcode = sanitize_key($_POST['shortcode']);
// Prepare option name
$option = 'su_presets_' . $shortcode;
// Get the existing presets
$current = get_option($option);
// Check that preset is exists
if (!is_array($current) || empty($current[$id]))
return;
// Remove preset
unset($current[$id]);
// Save updated option
update_option($option, $current);
// Clear cache
delete_transient('su/generator/settings/' . $shortcode);
}
public static function ajax_get_preset()
{
self::access();
// Check incoming data
if (empty($_GET['id']))
return;
if (empty($_GET['shortcode']))
return;
// Check Nonce
if (
empty($_GET['nonce']) ||
!is_string($_GET['nonce']) ||
!wp_verify_nonce($_GET['nonce'], 'su_generator_preset')
) {
return;
}
// Clean-up incoming data
$id = sanitize_key($_GET['id']);
$shortcode = sanitize_key($_GET['shortcode']);
// Default data
$data = array();
// Get the existing presets
$presets = get_option('su_presets_' . $shortcode);
// Check that preset is exists
if (is_array($presets) && isset($presets[$id]['settings']))
$data = $presets[$id]['settings'];
// Print results
die(json_encode($data));
}
/**
* Helper function to create shortcode code with default settings.
*
* Example output: "[su_button color="#ff0000" ... ] Click me [/su_button]".
*
* @param mixed $args Array with settings
* @since 5.0.0
* @return string Shortcode code
*/
public static function get_shortcode_code($args)
{
$defaults = array(
'id' => '',
'number' => 1,
'nested' => false,
);
// Accept shortcode ID as a string
if (is_string($args)) {
$args = array('id' => $args);
}
$args = wp_parse_args($args, $defaults);
// Check shortcode ID
if (empty($args['id'])) {
return '';
}
// Get shortcode data
$shortcode = self::normalize_shortcode(su_get_shortcode($args['id']));
// Prepare shortcode prefix
$prefix = get_option('su_option_prefix');
// Prepare attributes container
$attributes = '';
// Loop through attributes
foreach ($shortcode['atts'] as $attr_id => $attribute) {
// Skip hidden attributes
if (isset($attribute['hidden']) && $attribute['hidden']) {
continue;
}
// Add attribute
$attributes .= sprintf(' %s="%s"', esc_html($attr_id), esc_attr($attribute['default']));
}
// Create opening tag with attributes
$output = "[{$prefix}{$args['id']}{$attributes}]";
// Indent nested shortcodes
if ($args['nested']) {
$output = "\t" . $output;
}
// Insert shortcode content
if (isset($shortcode['content'])) {
if (is_string($shortcode['content'])) {
$output .= $shortcode['content'];
}
// Create complex content
else if (is_array($shortcode['content']) && $args['id'] !== $shortcode['content']['id']) {
$shortcode['content']['nested'] = true;
$output .= self::get_shortcode_code($shortcode['content']);
}
}
// Add closing tag
if (isset($shortcode['type']) && $shortcode['type'] === 'wrap') {
$output .= "[/{$prefix}{$args['id']}]";
}
// Repeat shortcode
if ($args['number'] > 1) {
$output = implode("\n", array_fill(0, $args['number'], $output));
}
// Add line breaks around nested shortcodes
if ($args['nested']) {
$output = "\n{$output}\n";
}
return $output;
}
/**
* Helper function to check if all available addons were activated.
*
* @since 5.0.5
* @return boolean True if all addons active, False otherwise.
*/
public static function is_addons_active()
{
return false;
}
/**
* Get available shortcodes, skipping deprecated ones.
*
* @since 5.0.5
* @return array Available shortcodes data.
*/
public static function get_shortcodes()
{
$shortcodes = su_get_all_shortcodes();
if (get_option('su_option_hide_deprecated')) {
$shortcodes = array_filter(
$shortcodes,
array(__CLASS__, 'filter_deprecated_shortcodes')
);
}
foreach ($shortcodes as $shortcode_id => $shortcode) {
$shortcodes[$shortcode_id] = self::normalize_shortcode($shortcode);
}
return $shortcodes;
}
public static function get_shortcodes_grouped()
{
$result = [];
$groups = su_get_groups();
$shortcodes = self::get_shortcodes();
foreach ($groups as $group => $group_title) {
$group_shortcodes = array_filter($shortcodes, function ($shortcode) use ($group) {
return $shortcode['group'] === $group;
});
if (count($group_shortcodes)) {
$result[$group] = [
'id' => $group,
'title' => $group_title,
'shortcodes' => $group_shortcodes,
];
}
}
return $result;
}
/**
* Filter shortcodes and skip deprecated ones.
*
* @since 5.0.5
* @param array $shortcode A single shortcode data.
* @return boolean False if shortcode deprecated, True otherwise.
*/
public static function filter_deprecated_shortcodes($shortcode)
{
return !isset($shortcode['deprecated']);
}
/**
* Get list of taxonomies as key-value pairs.
*
* @since 5.0.5
* @return array List of taxonomies.
*/
public static function get_taxonomies()
{
$taxes = array();
foreach ((array) get_taxonomies('', 'objects') as $tax) {
$taxes[$tax->name] = $tax->label;
}
return $taxes;
}
/**
* Get list of terms as key-value pairs.
*
* @since 5.0.5
* @return array List of terms.
*/
public static function get_terms($tax = 'category', $key = 'id')
{
$terms = array();
if ($key === 'id') {
foreach ((array) get_terms($tax, array('hide_empty' => false)) as $term) {
$terms[$term->term_id] = $term->name;
}
} elseif ($key === 'slug') {
foreach ((array) get_terms($tax, array('hide_empty' => false)) as $term) {
$terms[$term->slug] = $term->name;
}
}
return $terms;
}
}
new Su_Generator;
class Shortcodes_Ultimate_Generator extends Su_Generator
{
function __construct()
{
parent::__construct();
}
}