Dateien nach "/" hochladen
This commit is contained in:
376
multi-team-card.php
Normal file
376
multi-team-card.php
Normal file
@@ -0,0 +1,376 @@
|
||||
<?php
|
||||
/**
|
||||
* Plugin Name: Multi Team-Card
|
||||
* Plugin URI: https://git.viper.ipv64.net/M_Viper/wp-multi-teamcard
|
||||
* Description: Erstellt Teamkarten mit Name, Funktion, Zuständigkeit, Bild und Kategorie. Ausgabe per Shortcode [teamcards].
|
||||
* Version: 2.0
|
||||
* Author: M_Viper
|
||||
* Author URI: https://m-viper.de
|
||||
* Requires at least: 6.8
|
||||
* Tested up to: 6.8
|
||||
* PHP Version: 7.4
|
||||
* License: GPL2
|
||||
* License URI: https://www.gnu.org/licenses/gpl-2.0.html
|
||||
* Text Domain: multi-team-card
|
||||
* Tags: team, card, shortcodes, team-management, customizable, responsive
|
||||
* Support: [Discord Support](https://discord.com/invite/FdRs4BRd8D)
|
||||
* Support: [Telegram Support](https://t.me/M_Viper04)
|
||||
*/
|
||||
|
||||
if (!defined('ABSPATH')) exit;
|
||||
|
||||
// Check if the PHP version is sufficient
|
||||
if (version_compare(PHP_VERSION, '7.2', '<')) {
|
||||
die('This plugin requires PHP 7.2 or higher.');
|
||||
}
|
||||
|
||||
// Get the current version of the plugin from the plugin header dynamically
|
||||
function get_current_plugin_version() {
|
||||
if (!function_exists('get_plugin_data')) {
|
||||
require_once(ABSPATH . 'wp-admin/includes/plugin.php');
|
||||
}
|
||||
$plugin_data = get_plugin_data(__FILE__);
|
||||
return $plugin_data['Version'];
|
||||
}
|
||||
|
||||
$gitea_api_url = 'https://git.viper.ipv64.net/api/v1/repos/M_Viper/wp-multi-teamcard/releases/latest';
|
||||
|
||||
function check_for_new_release() {
|
||||
global $gitea_api_url;
|
||||
$current_version = get_current_plugin_version();
|
||||
$response = wp_remote_get($gitea_api_url);
|
||||
|
||||
if (is_wp_error($response)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$body = wp_remote_retrieve_body($response);
|
||||
$release_data = json_decode($body);
|
||||
|
||||
if (isset($release_data->tag_name)) {
|
||||
$latest_version = ltrim($release_data->tag_name, 'v'); // Entfernt 'v' falls vorhanden
|
||||
if (version_compare($latest_version, $current_version, '>')) {
|
||||
add_action('admin_notices', function() use ($latest_version) {
|
||||
echo '<div class="notice notice-info is-dismissible">
|
||||
<p><strong>⚠️ Neue Version von WP Multi Teamcard verfügbar:</strong> Version ' . esc_html($latest_version) . ' ist jetzt auf Gitea verfügbar. <a href="https://git.viper.ipv64.net/M_Viper/wp-multi-teamcard/releases" target="_blank">Hier klicken, um die neue Version herunterzuladen. ⚠️</a></p>
|
||||
</div>';
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
add_action('admin_init', 'check_for_new_release');
|
||||
|
||||
|
||||
// CPT registrieren
|
||||
function teamcard_register_post_type() {
|
||||
register_post_type('teamcard', [
|
||||
'labels' => [
|
||||
'name' => 'Teammitglieder',
|
||||
'singular_name' => 'Teammitglied',
|
||||
'add_new' => 'Neues Teammitglied',
|
||||
'add_new_item' => 'Teammitglied hinzufügen',
|
||||
'edit_item' => 'Teammitglied bearbeiten',
|
||||
],
|
||||
'public' => true,
|
||||
'show_ui' => false, // Wir nutzen eine eigene Admin-Seite
|
||||
'show_in_menu' => false,
|
||||
'menu_icon' => 'dashicons-groups',
|
||||
'supports' => ['title'],
|
||||
'has_archive' => false,
|
||||
'show_in_admin_bar' => false,
|
||||
]);
|
||||
|
||||
register_taxonomy('teamcard_kategorie', 'teamcard', [
|
||||
'labels' => [
|
||||
'name' => 'Kategorien',
|
||||
'singular_name' => 'Kategorie',
|
||||
],
|
||||
'hierarchical' => true,
|
||||
'public' => true,
|
||||
'show_admin_column' => true,
|
||||
'show_ui' => true, // Kategorien im Admin-Menü anzeigen
|
||||
]);
|
||||
}
|
||||
add_action('init', 'teamcard_register_post_type');
|
||||
|
||||
// Admin-Menü hinzufügen
|
||||
function teamcard_add_admin_menu() {
|
||||
add_menu_page(
|
||||
'Team-Cards verwalten',
|
||||
'Team-Cards',
|
||||
'manage_options',
|
||||
'teamcard_management',
|
||||
'teamcard_render_admin_page',
|
||||
'dashicons-groups',
|
||||
30
|
||||
);
|
||||
}
|
||||
add_action('admin_menu', 'teamcard_add_admin_menu');
|
||||
|
||||
// Die Hauptverwaltungsseite mit Tabs
|
||||
function teamcard_render_admin_page() {
|
||||
$active_tab = isset($_GET['tab']) ? sanitize_key($_GET['tab']) : 'team_members';
|
||||
?>
|
||||
<div class="wrap teamcard-admin">
|
||||
<h1>Team-Cards verwalten</h1>
|
||||
|
||||
<nav class="nav-tab-wrapper">
|
||||
<a href="?page=teamcard_management&tab=team_members" class="nav-tab <?php echo $active_tab === 'team_members' ? 'nav-tab-active' : ''; ?>">Teammitglieder</a>
|
||||
<a href="?page=teamcard_management&tab=settings" class="nav-tab <?php echo $active_tab === 'settings' ? 'nav-tab-active' : ''; ?>">Einstellungen</a>
|
||||
<a href="?page=teamcard_management&tab=help" class="nav-tab <?php echo $active_tab === 'help' ? 'nav-tab-active' : ''; ?>">Hilfe</a>
|
||||
</nav>
|
||||
|
||||
<div class="tab-content">
|
||||
<?php
|
||||
switch ($active_tab) {
|
||||
case 'team_members':
|
||||
require_once plugin_dir_path(__FILE__) . 'includes/team-members-tab.php';
|
||||
break;
|
||||
case 'settings':
|
||||
require_once plugin_dir_path(__FILE__) . 'includes/settings-tab.php';
|
||||
break;
|
||||
case 'help':
|
||||
require_once plugin_dir_path(__FILE__) . 'includes/help-tab.php';
|
||||
break;
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
|
||||
// AJAX-Handler zum Speichern der Teammitglieder
|
||||
function teamcard_ajax_handlers() {
|
||||
add_action('wp_ajax_add_teamcard', function() {
|
||||
check_ajax_referer('teamcard_nonce', 'nonce');
|
||||
|
||||
$name = sanitize_text_field($_POST['name']);
|
||||
$funktion = sanitize_text_field($_POST['funktion']);
|
||||
$zustaendigkeit = sanitize_textarea_field($_POST['zustaendigkeit']); // Textarea erlauben
|
||||
$bild_id = intval($_POST['bild_id']);
|
||||
$card_type = sanitize_text_field($_POST['card_type']);
|
||||
|
||||
if (empty($name)) {
|
||||
wp_send_json_error(['message' => 'Bitte gib einen Namen ein.']);
|
||||
}
|
||||
|
||||
$max_order = 0;
|
||||
$posts = get_posts(['post_type' => 'teamcard', 'posts_per_page' => 1, 'orderby' => 'menu_order', 'order' => 'DESC']);
|
||||
if (!empty($posts)) {
|
||||
$max_order = $posts[0]->menu_order;
|
||||
}
|
||||
|
||||
$post_id = wp_insert_post([
|
||||
'post_type' => 'teamcard',
|
||||
'post_title' => $name,
|
||||
'post_status' => 'publish',
|
||||
'menu_order' => $max_order + 1
|
||||
]);
|
||||
|
||||
if ($post_id) {
|
||||
update_post_meta($post_id, '_teamcard_funktion', $funktion);
|
||||
update_post_meta($post_id, '_teamcard_zustaendigkeit', $zustaendigkeit);
|
||||
update_post_meta($post_id, '_teamcard_card_type', $card_type);
|
||||
if ($bild_id > 0) {
|
||||
update_post_meta($post_id, '_teamcard_bild_id', $bild_id);
|
||||
}
|
||||
$bild_url = $bild_id ? wp_get_attachment_image_url($bild_id, 'thumbnail') : '';
|
||||
wp_send_json_success(['id' => $post_id, 'bild_url' => $bild_url]);
|
||||
} else {
|
||||
wp_send_json_error(['message' => 'Fehler beim Erstellen des Teammitglieds.']);
|
||||
}
|
||||
});
|
||||
|
||||
add_action('wp_ajax_update_teamcard', function() {
|
||||
check_ajax_referer('teamcard_nonce', 'nonce');
|
||||
$post_id = intval($_POST['id']);
|
||||
$field = sanitize_text_field($_POST['field']);
|
||||
$value = sanitize_textarea_field($_POST['value']); // Textarea erlauben
|
||||
|
||||
if ($field === 'title') {
|
||||
wp_update_post(['ID' => $post_id, 'post_title' => $value]);
|
||||
} else {
|
||||
update_post_meta($post_id, '_teamcard_' . $field, $value);
|
||||
}
|
||||
wp_send_json_success();
|
||||
});
|
||||
|
||||
add_action('wp_ajax_delete_teamcard', function() {
|
||||
check_ajax_referer('teamcard_nonce', 'nonce');
|
||||
$post_id = intval($_POST['id']);
|
||||
if (wp_delete_post($post_id, true)) {
|
||||
wp_send_json_success();
|
||||
} else {
|
||||
wp_send_json_error(['message' => 'Fehler beim Löschen.']);
|
||||
}
|
||||
});
|
||||
|
||||
add_action('wp_ajax_update_teamcard_image', function() {
|
||||
check_ajax_referer('teamcard_nonce', 'nonce');
|
||||
$post_id = intval($_POST['id']);
|
||||
$bild_id = intval($_POST['bild_id']);
|
||||
update_post_meta($post_id, '_teamcard_bild_id', $bild_id);
|
||||
$bild_url = wp_get_attachment_image_url($bild_id, 'thumbnail');
|
||||
wp_send_json_success(['bild_url' => $bild_url]);
|
||||
});
|
||||
|
||||
add_action('wp_ajax_update_teamcard_order', function() {
|
||||
check_ajax_referer('teamcard_nonce', 'nonce');
|
||||
$order = $_POST['order']; // This is an array of IDs
|
||||
foreach ($order as $position => $post_id) {
|
||||
wp_update_post(['ID' => intval($post_id), 'menu_order' => $position]);
|
||||
}
|
||||
wp_send_json_success();
|
||||
});
|
||||
}
|
||||
add_action('init', 'teamcard_ajax_handlers');
|
||||
|
||||
// Admin-Skripte und Styles laden
|
||||
function teamcard_admin_scripts($hook) {
|
||||
if ($hook !== 'toplevel_page_teamcard_management') return;
|
||||
|
||||
wp_enqueue_media();
|
||||
wp_enqueue_script('jquery-ui-sortable');
|
||||
|
||||
wp_enqueue_style('teamcard-admin-style', plugin_dir_url(__FILE__) . 'assets/css/teamcard-admin.css', [], '2.1');
|
||||
wp_enqueue_script('teamcard-admin-script', plugin_dir_url(__FILE__) . 'assets/js/teamcard-admin.js', ['jquery', 'jquery-ui-sortable'], '2.1', true);
|
||||
|
||||
wp_localize_script('teamcard-admin-script', 'teamcard_data', [
|
||||
'ajax_url' => admin_url('admin-ajax.php'),
|
||||
'nonce' => wp_create_nonce('teamcard_nonce')
|
||||
]);
|
||||
}
|
||||
add_action('admin_enqueue_scripts', 'teamcard_admin_scripts');
|
||||
|
||||
// Frontend-Styles laden
|
||||
function teamcard_frontend_styles() {
|
||||
// Nur laden, wenn der Shortcode auf der Seite ist
|
||||
global $post;
|
||||
if (is_a($post, 'WP_Post') && has_shortcode($post->post_content, 'teamcards')) {
|
||||
wp_enqueue_style('teamcard-frontend-style', plugin_dir_url(__FILE__) . 'assets/css/teamcard-frontend.css', [], '2.1');
|
||||
}
|
||||
}
|
||||
add_action('wp_enqueue_scripts', 'teamcard_frontend_styles');
|
||||
|
||||
|
||||
// Shortcode für die Frontend-Anzeige
|
||||
function teamcard_shortcode($atts) {
|
||||
$atts = shortcode_atts([
|
||||
'kategorie' => '',
|
||||
'type' => get_option('teamcard_default_card_type', 'standard'),
|
||||
'columns' => get_option('teamcard_columns', 2),
|
||||
], $atts, 'teamcards');
|
||||
|
||||
$args = [
|
||||
'post_type' => 'teamcard',
|
||||
'posts_per_page' => -1,
|
||||
'orderby' => 'menu_order',
|
||||
'order' => 'ASC',
|
||||
];
|
||||
|
||||
if (!empty($atts['kategorie'])) {
|
||||
$args['tax_query'] = [[
|
||||
'taxonomy' => 'teamcard_kategorie',
|
||||
'field' => 'slug',
|
||||
'terms' => sanitize_text_field($atts['kategorie']),
|
||||
]];
|
||||
}
|
||||
|
||||
$query = new WP_Query($args);
|
||||
if (!$query->have_posts()) {
|
||||
return '<p>Keine Teammitglieder gefunden.</p>';
|
||||
}
|
||||
|
||||
// Spaltenbreite für das Grid berechnen
|
||||
$column_style = '';
|
||||
if ($atts['columns'] > 1) {
|
||||
$column_width = (100 / $atts['columns']) - 2; // 2% für den gap
|
||||
$column_style = "style='flex-basis: calc({$column_width}% - 20px);'";
|
||||
} else {
|
||||
$column_style = "style='flex-basis: 100%;'";
|
||||
}
|
||||
|
||||
|
||||
ob_start();
|
||||
echo '<div class="teamcard-grid teamcard-grid-' . esc_attr($atts['columns']) . '-cols">';
|
||||
while ($query->have_posts()) {
|
||||
$query->the_post();
|
||||
$post_id = get_the_ID();
|
||||
$meta = [
|
||||
'funktion' => get_post_meta($post_id, '_teamcard_funktion', true),
|
||||
'zustaendigkeit' => get_post_meta($post_id, '_teamcard_zustaendigkeit', true),
|
||||
'bild_id' => get_post_meta($post_id, '_teamcard_bild_id', true),
|
||||
'card_type' => get_post_meta($post_id, '_teamcard_card_type', true),
|
||||
];
|
||||
$meta['bild_url'] = $meta['bild_id'] ? wp_get_attachment_url($meta['bild_id']) : '';
|
||||
|
||||
// Card-Typ aus dem Meta-Feld verwenden, falls vorhanden, sonst den aus dem Shortcode
|
||||
$card_type_to_render = !empty($meta['card_type']) ? $meta['card_type'] : $atts['type'];
|
||||
|
||||
// Sicherstellen, dass die Template-Datei existiert
|
||||
$template_file = plugin_dir_path(__FILE__) . "templates/card-{$card_type_to_render}.php";
|
||||
if (file_exists($template_file)) {
|
||||
include $template_file;
|
||||
} else {
|
||||
// Fallback auf Standard-Template, falls spezifisches nicht existiert
|
||||
include plugin_dir_path(__FILE__) . 'templates/card-standard.php';
|
||||
}
|
||||
}
|
||||
echo '</div>';
|
||||
wp_reset_postdata();
|
||||
return ob_get_clean();
|
||||
}
|
||||
add_shortcode('teamcards', 'teamcard_shortcode');
|
||||
|
||||
// Einstellungs-API registrieren
|
||||
function teamcard_register_settings() {
|
||||
register_setting('teamcard_settings_group', 'teamcard_default_card_type', ['sanitize_callback' => 'sanitize_text_field']);
|
||||
register_setting('teamcard_settings_group', 'teamcard_columns', ['sanitize_callback' => 'absint']);
|
||||
|
||||
add_settings_section(
|
||||
'teamcard_settings_section',
|
||||
'Anzeige-Einstellungen',
|
||||
'__return_false', // Keine Beschreibung nötig
|
||||
'teamcard_settings'
|
||||
);
|
||||
|
||||
add_settings_field(
|
||||
'teamcard_default_card_type',
|
||||
'Standard Card-Typ',
|
||||
'teamcard_default_card_type_callback',
|
||||
'teamcard_settings',
|
||||
'teamcard_settings_section'
|
||||
);
|
||||
|
||||
add_settings_field(
|
||||
'teamcard_columns',
|
||||
'Anzahl der Spalten',
|
||||
'teamcard_columns_callback',
|
||||
'teamcard_settings',
|
||||
'teamcard_settings_section'
|
||||
);
|
||||
}
|
||||
add_action('admin_init', 'teamcard_register_settings');
|
||||
|
||||
function teamcard_default_card_type_callback() {
|
||||
$default_card_type = get_option('teamcard_default_card_type', 'standard');
|
||||
?>
|
||||
<select name="teamcard_default_card_type">
|
||||
<option value="standard" <?php selected($default_card_type, 'standard'); ?>>Standard Card</option>
|
||||
<option value="compact" <?php selected($default_card_type, 'compact'); ?>>Compact Card</option>
|
||||
<option value="featured" <?php selected($default_card_type, 'featured'); ?>>Featured Card</option>
|
||||
<!-- NEUE OPTIONEN -->
|
||||
<option value="flip" <?php selected($default_card_type, 'flip'); ?>>Flip Card</option>
|
||||
<option value="profile" <?php selected($default_card_type, 'profile'); ?>>Profile Card</option>
|
||||
</select>
|
||||
<p class="description">Dieser Typ wird verwendet, wenn für ein Mitglied kein spezifischer Typ festgelegt ist.</p>
|
||||
<?php
|
||||
}
|
||||
|
||||
function teamcard_columns_callback() {
|
||||
$columns = get_option('teamcard_columns', 2);
|
||||
?>
|
||||
<input type="number" name="teamcard_columns" value="<?php echo esc_attr($columns); ?>" min="1" max="4" step="1">
|
||||
<p class="description">Anzahl der Spalten für die Teammitglieder-Anzeige (1-4).</p>
|
||||
<?php
|
||||
}
|
||||
48
uninstall.php
Normal file
48
uninstall.php
Normal file
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
// Sicherstellen, dass die Datei nur bei Plugin-Deinstallation direkt von WordPress aufgerufen wird
|
||||
if (!defined('WP_UNINSTALL_PLUGIN')) {
|
||||
exit;
|
||||
}
|
||||
|
||||
// Funktion zum Löschen aller Plugin-Daten
|
||||
function delete_teamcard_data() {
|
||||
// Alle Teamcard-Posts abrufen
|
||||
$teamcards = get_posts([
|
||||
'post_type' => 'teamcard',
|
||||
'posts_per_page' => -1,
|
||||
'post_status' => 'any',
|
||||
]);
|
||||
|
||||
// Jeden Post und zugehörige Bilder löschen
|
||||
foreach ($teamcards as $teamcard) {
|
||||
// Bild aus der Mediathek löschen, falls vorhanden
|
||||
$bild_id = get_post_meta($teamcard->ID, '_teamcard_bild_id', true);
|
||||
if ($bild_id) {
|
||||
wp_delete_attachment($bild_id, true);
|
||||
}
|
||||
// Post und Metadaten löschen
|
||||
wp_delete_post($teamcard->ID, true);
|
||||
}
|
||||
|
||||
// Taxonomie 'teamcard_kategorie' und ihre Begriffe löschen
|
||||
$terms = get_terms([
|
||||
'taxonomy' => 'teamcard_kategorie',
|
||||
'hide_empty' => false,
|
||||
]);
|
||||
|
||||
if (!is_wp_error($terms)) {
|
||||
foreach ($terms as $term) {
|
||||
wp_delete_term($term->term_id, 'teamcard_kategorie');
|
||||
}
|
||||
}
|
||||
|
||||
// Alle Metadaten löschen, die mit dem Plugin verknüpft sind
|
||||
global $wpdb;
|
||||
$wpdb->query("DELETE FROM $wpdb->postmeta WHERE meta_key LIKE '_teamcard_%'");
|
||||
|
||||
// Rewrite Rules zurücksetzen
|
||||
flush_rewrite_rules();
|
||||
}
|
||||
|
||||
// Funktion ausführen
|
||||
delete_teamcard_data();
|
||||
Reference in New Issue
Block a user