Files
roi-theme/wp-content/plugins/advanced-ads/includes/admin/class-shortcode-creator.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

203 lines
5.0 KiB
PHP
Executable File

<?php
/**
* Admin Shortcode Creator.
*
* @package AdvancedAds
* @author Advanced Ads <info@wpadvancedads.com>
* @since 1.50.0
*/
namespace AdvancedAds\Admin;
use _WP_Editors;
use AdvancedAds\Utilities\Data;
use AdvancedAds\Utilities\Conditional;
use AdvancedAds\Framework\Interfaces\Integration_Interface;
defined( 'ABSPATH' ) || exit;
/**
* Admin Shortcode Creator.
*/
class Shortcode_Creator implements Integration_Interface {
/**
* Contains ids of the editors that contains the Advanced Ads button.
*
* @var array
*/
private $editors = [];
/**
* Hook into WordPress.
*
* @return void
*/
public function hooks(): void {
if (
true !== boolval( get_user_option( 'rich_editing' ) ) ||
! Conditional::user_can( 'advanced_ads_place_ads' ) ||
defined( 'ADVANCED_ADS_DISABLE_SHORTCODE_BUTTON' ) ||
apply_filters( 'advanced-ads-disable-shortcode-button', false )
) {
return;
}
add_filter( 'mce_buttons', [ $this, 'register_buttons' ], 10, 2 );
add_filter( 'tiny_mce_plugins', [ $this, 'register_plugin' ] );
add_filter( 'tiny_mce_before_init', [ $this, 'tiny_mce_before_init' ], 10, 2 );
add_action( 'wp_tiny_mce_init', [ $this, 'print_shortcode_plugin' ] );
add_action( 'print_default_editor_scripts', [ $this, 'print_shortcode_plugin' ] );
add_action( 'wp_ajax_advads_content_for_shortcode_creator', [ $this, 'get_content_for_shortcode_creator' ] );
}
/**
* Add button to tinyMCE window
*
* @param array $buttons Array with existing buttons.
* @param string $editor_id Unique editor identifier.
*
* @return array
*/
public function register_buttons( $buttons, $editor_id ): array {
if ( ! $this->hooks_exist() ) {
return $buttons;
}
if ( ! is_array( $buttons ) ) {
$buttons = [];
}
$this->editors[] = $editor_id;
$buttons[] = 'advads_shortcode_button';
return $buttons;
}
/**
* Add the plugin to the array of default TinyMCE plugins.
*
* @param array $plugins An array of default TinyMCE plugins.
*
* @return array
*/
public function register_plugin( $plugins ): array {
if ( ! $this->hooks_exist() ) {
return $plugins;
}
$plugins[] = 'advads_shortcode';
return $plugins;
}
/**
* Delete the plugin added by the {@see `tiny_mce_plugins`} method when necessary hooks do not exist.
*
* @param array $mce_init An array with TinyMCE config.
* @param string $editor_id Unique editor identifier.
*
* @return array
*/
public function tiny_mce_before_init( $mce_init, $editor_id = '' ): array {
// Early bail!!
if ( ! isset( $mce_init['plugins'] ) || ! is_string( $mce_init['plugins'] ) ) {
return $mce_init;
}
$plugins = explode( ',', $mce_init['plugins'] );
$found = array_search( 'advads_shortcode', $plugins, true );
if ( ! $found || ( '' !== $editor_id && in_array( $editor_id, $this->editors, true ) ) ) {
return $mce_init;
}
unset( $plugins[ $found ] );
$mce_init['plugins'] = implode( ',', $plugins );
return $mce_init;
}
/**
* Print shortcode plugin inline.
*
* @param array|null $mce_settings TinyMCE settings array.
*
* @return void
*/
public function print_shortcode_plugin( $mce_settings = [] ): void {
static $printed = null;
if ( null !== $printed ) {
return;
}
$printed = true;
// The `tinymce` argument of the `wp_editor()` function is set to `false`.
if ( empty( $mce_settings ) && ! ( doing_action( 'print_default_editor_scripts' ) && user_can_richedit() ) ) {
return;
}
if ( empty( $this->editors ) ) {
return;
}
?>
<script type="text/javascript">
<?php echo $this->get_l10n(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
<?php echo file_get_contents( ADVADS_ABSPATH . 'assets/js/admin/shortcode.js' ); // phpcs:ignore ?>
</script>
<?php
}
/**
* Prints html select field for shortcode creator
*
* @return void
*/
public function get_content_for_shortcode_creator(): void {
if ( ! ( current_user_can( 'edit_posts' ) || current_user_can( 'edit_pages' ) ) ) {
return;
}
Data::items_dropdown( [ 'id' => 'advads-select-for-shortcode' ] );
exit();
}
/**
* Check if needed actions have not been removed by a plugin.
*
* @return array
*/
private function hooks_exist() {
if (
has_action( 'wp_tiny_mce_init', [ $this, 'print_shortcode_plugin' ] ) ||
has_action( 'print_default_editor_scripts', [ $this, 'print_shortcode_plugin' ] )
) {
return true;
}
return false;
}
/**
* Get localization strings.
*
* @return string
*/
private function get_l10n() {
$strings = [
'title' => esc_html_x( 'Add an ad', 'shortcode creator', 'advanced-ads' ),
'ok' => esc_html_x( 'Add shortcode', 'shortcode creator', 'advanced-ads' ),
'cancel' => esc_html_x( 'Cancel', 'shortcode creator', 'advanced-ads' ),
'image' => ADVADS_BASE_URL . 'assets/img/icons/tinymce-icon.png',
];
$locale = _WP_Editors::get_mce_locale();
return 'tinyMCE.addI18n("' . $locale . '.advads_shortcode", ' . wp_json_encode( $strings ) . ");\n";
}
}