Files
2026-08-14 07:59:43 +00:00

239 lines
9.6 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* WP Multi Modul: Custom Shortcodes
*
* Automatisch aus wp-multi.php ausgelagert. Wird über den Loader in
* wp-multi.php eingebunden (nur wenn das WP Multi Toolkit aktiv ist).
*/
if (!defined('ABSPATH')) { exit; }
/*
* custom shortcodes
*/
// Funktion, um die Datenbanktabelle für Shortcodes zu erstellen
function wp_multi_create_shortcodes_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'wp_multi_shortcodes'; // Name der Tabelle mit Präfix
$charset_collate = $wpdb->get_charset_collate();
// SQL-Abfrage zum Erstellen der Tabelle
$sql = "CREATE TABLE $table_name (
id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
shortcode_name varchar(255) NOT NULL,
shortcode_content text NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY shortcode_name (shortcode_name)
) $charset_collate;";
// Datenbank abfragen und ausführen
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
register_activation_hook( WP_MULTI_FILE, 'wp_multi_create_shortcodes_table' );
// Der Shortcodes-Menüpunkt wird zentral in wp_multi_register_admin_menus() registriert.
// Callback-Funktion für das Shortcode-Verwaltungs-Interface
function wp_multi_shortcode_page() {
global $wpdb;
$message = ''; // Variable für benutzerdefinierte Nachrichten
// Verarbeite das Speichern von Shortcodes
if (isset($_POST['wp_multi_shortcode_name']) && isset($_POST['wp_multi_shortcode_content'])) {
check_admin_referer('wp_multi_save_shortcode', 'wp_multi_shortcode_nonce');
// Hole die übermittelten Shortcodes
$name = sanitize_key($_POST['wp_multi_shortcode_name']);
$content = wp_kses_post(wp_unslash($_POST['wp_multi_shortcode_content']));
// Prüfen, ob der Shortcode bereits existiert
$existing_shortcode = $wpdb->get_var($wpdb->prepare("SELECT id FROM {$wpdb->prefix}wp_multi_shortcodes WHERE shortcode_name = %s", $name));
if ($existing_shortcode) {
// Aktualisiere den Shortcode, falls er bereits existiert
$wpdb->update(
$wpdb->prefix . 'wp_multi_shortcodes',
['shortcode_content' => $content],
['shortcode_name' => $name]
);
$message = 'Shortcode wurde aktualisiert!';
} else {
// Andernfalls einen neuen Shortcode einfügen
$wpdb->insert(
$wpdb->prefix . 'wp_multi_shortcodes',
[
'shortcode_name' => $name,
'shortcode_content' => $content
]
);
$message = 'Shortcode wurde hinzugefügt!';
}
}
// Shortcode löschen
if (isset($_GET['delete_shortcode']) && !empty($_GET['delete_shortcode'])) {
check_admin_referer('wp_multi_delete_shortcode_' . intval($_GET['delete_shortcode']));
$delete_id = intval($_GET['delete_shortcode']);
$wpdb->delete(
$wpdb->prefix . 'wp_multi_shortcodes',
['id' => $delete_id]
);
$message = 'Shortcode wurde gelöscht!';
}
// Holen der gespeicherten Shortcodes aus der Datenbank
$custom_shortcodes = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wp_multi_shortcodes");
wpmt_admin_page_open(
__('Shortcodes', 'wp-multi'),
__('Eigene Shortcodes erstellen, die im Editor eingefügt werden können', 'wp-multi')
);
if (!empty($message)) {
wpmt_admin_notice('success', $message);
}
wpmt_admin_card_open(__('Shortcode anlegen / aktualisieren', 'wp-multi'));
?>
<form method="post">
<?php wp_nonce_field('wp_multi_save_shortcode', 'wp_multi_shortcode_nonce'); ?>
<div class="wpm-field">
<label class="wpm-field__label" for="wp_multi_shortcode_name"><?php _e('Name des Shortcodes', 'wp-multi'); ?>
<small class="wpm-field__hint"><?php _e('Nur Kleinbuchstaben, Zahlen und Unterstriche.', 'wp-multi'); ?></small>
</label>
<input type="text" name="wp_multi_shortcode_name" id="wp_multi_shortcode_name" required />
</div>
<div class="wpm-field">
<label class="wpm-field__label" for="wp_multi_shortcode_content"><?php _e('Inhalt des Shortcodes', 'wp-multi'); ?></label>
<textarea name="wp_multi_shortcode_content" id="wp_multi_shortcode_content" rows="5" required></textarea>
</div>
<?php submit_button(__('Shortcode speichern', 'wp-multi')); ?>
</form>
<?php
wpmt_admin_card_close();
wpmt_admin_card_open(__('Verfügbare Shortcodes', 'wp-multi'));
if (!empty($custom_shortcodes)) {
?>
<div class="wpm-table-wrap">
<table class="wpm-table">
<thead>
<tr>
<th><?php _e('Shortcode', 'wp-multi'); ?></th>
<th><?php _e('Inhalt', 'wp-multi'); ?></th>
<th><?php _e('Aktionen', 'wp-multi'); ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($custom_shortcodes as $shortcode) :
$delete_url = wp_nonce_url(
admin_url('admin.php?page=wp_multi_shortcodes&delete_shortcode=' . $shortcode->id),
'wp_multi_delete_shortcode_' . $shortcode->id
);
?>
<tr>
<td><code>[<?php echo esc_html($shortcode->shortcode_name); ?>]</code></td>
<td><?php echo esc_html(wp_trim_words($shortcode->shortcode_content, 15)); ?></td>
<td><a href="<?php echo esc_url($delete_url); ?>" class="wpm-btn wpm-btn--danger" onclick="return confirm('<?php esc_attr_e('Möchten Sie diesen Shortcode wirklich löschen?', 'wp-multi'); ?>');"><?php _e('Löschen', 'wp-multi'); ?></a></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php
} else {
wpmt_admin_notice('info', __('Keine benutzerdefinierten Shortcodes gefunden.', 'wp-multi'));
}
wpmt_admin_card_close();
wpmt_admin_page_close();
}
// Shortcode-Verwaltung: Ermöglicht Benutzern das Erstellen eigener Shortcodes
function wp_multi_register_custom_shortcodes() {
global $wpdb;
// Holen der gespeicherten Shortcodes aus der Datenbank
$custom_shortcodes = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}wp_multi_shortcodes");
// Wenn keine benutzerdefinierten Shortcodes vorhanden sind, abbrechen
if (empty($custom_shortcodes)) {
return;
}
// Definiere die Shortcodes in WordPress
foreach ($custom_shortcodes as $shortcode) {
add_shortcode($shortcode->shortcode_name, function() use ($shortcode) {
return wp_kses_post($shortcode->shortcode_content);
});
}
}
add_action('init', 'wp_multi_register_custom_shortcodes');
// Inhalt der Meta-Box anzeigen
function wp_multi_render_shortcode_meta_box($post) {
global $wpdb;
// Alle gespeicherten Shortcodes aus der Datenbank holen
$shortcodes = $wpdb->get_results("SELECT shortcode_name FROM {$wpdb->prefix}wp_multi_shortcodes");
if (!empty($shortcodes)) {
echo '<select id="wp_multi_shortcode_dropdown">';
echo '<option value="">-- Shortcode auswählen --</option>';
foreach ($shortcodes as $shortcode) {
echo '<option value="' . esc_attr($shortcode->shortcode_name) . '">' . esc_html($shortcode->shortcode_name) . '</option>';
}
echo '</select>';
echo '<button type="button" class="button button-primary" id="wp_multi_insert_shortcode">Einfügen</button>';
} else {
echo '<p>Keine Shortcodes vorhanden.</p>';
}
}
// JavaScript für Meta-Box einbinden (Classic Editor: fügt den gewählten Shortcode ein)
function wp_multi_enqueue_admin_scripts($hook) {
if ('post.php' === $hook || 'post-new.php' === $hook) {
wp_enqueue_script('wp-multi-shortcode', plugin_dir_url(WP_MULTI_FILE) . 'js/classic-editor-shortcodes.js', array('jquery'), '1.0', true);
}
}
add_action('admin_enqueue_scripts', 'wp_multi_enqueue_admin_scripts');
// Funktion zum Registrieren des TinyMCE Plugins
function wp_multi_add_shortcode_button() {
add_filter('mce_external_plugins', 'wp_multi_register_tinymce_plugin');
add_filter('mce_buttons', 'wp_multi_add_tinymce_button');
}
add_action('admin_head', 'wp_multi_add_shortcode_button');
// Plugin für TinyMCE registrieren (angepasster Pfad zum JS-File)
function wp_multi_register_tinymce_plugin($plugins) {
$plugins['wp_multi_shortcodes'] = plugin_dir_url(WP_MULTI_FILE) . 'js/tinymce-shortcodes.js';
return $plugins;
}
// Button zur TinyMCE Toolbar hinzufügen
function wp_multi_add_tinymce_button($buttons) {
array_push($buttons, 'wp_multi_shortcodes');
return $buttons;
}
// Shortcodes aus der Datenbank für das JavaScript bereitstellen
function wp_multi_localize_shortcodes() {
global $wpdb;
$shortcodes = $wpdb->get_results("SELECT shortcode_name FROM {$wpdb->prefix}wp_multi_shortcodes", ARRAY_A);
// Shortcodes als JSON an das JS-File übergeben
wp_enqueue_script('wp-multi-tinymce', plugin_dir_url(WP_MULTI_FILE) . 'js/tinymce-shortcodes.js', array('jquery'), null, true);
wp_localize_script('wp-multi-tinymce', 'wpMultiShortcodes', $shortcodes);
}
add_action('admin_enqueue_scripts', 'wp_multi_localize_shortcodes');