diff --git a/includes/admin-columns.php b/includes/admin-columns.php
new file mode 100644
index 0000000..e00001b
--- /dev/null
+++ b/includes/admin-columns.php
@@ -0,0 +1,38 @@
+ $val ) {
+ $new[ $key ] = $val;
+ if ( $key === 'title' ) {
+ $new['mcn_pinned'] = '📌 Angepinnt';
+ $new['mcn_badge'] = '🏷️ Badge';
+ $new['mcn_category'] = '📂 Kategorie';
+ }
+ }
+ return $new;
+}
+
+add_action( 'manage_mc_news_posts_custom_column', 'mcn_admin_column_content', 10, 2 );
+function mcn_admin_column_content( $col, $post_id ) {
+ switch ( $col ) {
+ case 'mcn_pinned':
+ echo get_post_meta( $post_id, '_mcn_pinned', true ) ? '✅' : '—';
+ break;
+ case 'mcn_badge':
+ $b = get_post_meta( $post_id, '_mcn_badge', true );
+ echo $b ? '' . esc_html( $b ) . '' : '—';
+ break;
+ case 'mcn_category':
+ $terms = get_the_terms( $post_id, 'mc_news_category' );
+ if ( $terms ) {
+ echo esc_html( implode( ', ', wp_list_pluck( $terms, 'name' ) ) );
+ } else {
+ echo '—';
+ }
+ break;
+ }
+}
diff --git a/includes/assets.php b/includes/assets.php
new file mode 100644
index 0000000..5d71153
--- /dev/null
+++ b/includes/assets.php
@@ -0,0 +1,35 @@
+post_content, 'server_news' ) ||
+ is_singular( 'mc_news' ) ||
+ is_post_type_archive( 'mc_news' )
+ ) ) {
+ wp_enqueue_style(
+ 'mcn-styles',
+ MCN_URL . 'assets/css/mcn-style.css',
+ [],
+ MCN_VERSION
+ );
+ wp_enqueue_script(
+ 'mcn-scripts',
+ MCN_URL . 'assets/js/mcn-script.js',
+ [],
+ MCN_VERSION,
+ true
+ );
+ }
+}
+
+add_action( 'admin_enqueue_scripts', 'mcn_admin_assets' );
+function mcn_admin_assets( $hook ) {
+ $screen = get_current_screen();
+ if ( $screen && $screen->post_type === 'mc_news' ) {
+ wp_enqueue_style( 'mcn-admin', MCN_URL . 'assets/css/mcn-admin.css', [], MCN_VERSION );
+ }
+}
diff --git a/includes/metaboxes.php b/includes/metaboxes.php
new file mode 100644
index 0000000..5eba34c
--- /dev/null
+++ b/includes/metaboxes.php
@@ -0,0 +1,60 @@
+ID, '_mcn_pinned', true );
+ $badge = get_post_meta( $post->ID, '_mcn_badge', true );
+ $server_ip = get_post_meta( $post->ID, '_mcn_server_ip', true );
+ ?>
+
+
+ >
+ Diese News oben anzeigen
+
+
+
+
+
+
+
+
+
+
+ Wird in der News-Karte angezeigt
+
+ 'Server News',
+ 'singular_name' => 'News',
+ 'add_new' => 'News hinzufügen',
+ 'add_new_item' => 'Neue News erstellen',
+ 'edit_item' => 'News bearbeiten',
+ 'new_item' => 'Neue News',
+ 'view_item' => 'News ansehen',
+ 'search_items' => 'News suchen',
+ 'not_found' => 'Keine News gefunden',
+ 'not_found_in_trash' => 'Keine News im Papierkorb',
+ 'menu_name' => '⛏ Server News',
+ ];
+
+ register_post_type( 'mc_news', [
+ 'labels' => $labels,
+ 'public' => true,
+ 'show_in_menu' => true,
+ 'menu_icon' => 'dashicons-megaphone',
+ 'menu_position' => 5,
+ 'supports' => [ 'title', 'editor', 'thumbnail', 'excerpt', 'author' ],
+ 'has_archive' => true,
+ 'rewrite' => [ 'slug' => 'server-news' ],
+ 'show_in_rest' => true,
+ ] );
+}
diff --git a/includes/shortcode.php b/includes/shortcode.php
new file mode 100644
index 0000000..67c2849
--- /dev/null
+++ b/includes/shortcode.php
@@ -0,0 +1,140 @@
+ 10,
+ 'kategorie' => '',
+ 'layout' => 'grid', // grid | list
+ 'badge' => '',
+ ], $atts, 'server_news' );
+
+ $args = [
+ 'post_type' => 'mc_news',
+ 'posts_per_page' => intval( $atts['anzahl'] ),
+ 'post_status' => 'publish',
+ 'meta_query' => [],
+ 'tax_query' => [],
+ ];
+
+ // Kategorie-Filter
+ if ( ! empty( $atts['kategorie'] ) ) {
+ $args['tax_query'][] = [
+ 'taxonomy' => 'mc_news_category',
+ 'field' => 'slug',
+ 'terms' => array_map( 'trim', explode( ',', $atts['kategorie'] ) ),
+ ];
+ }
+
+ // Angepinnte zuerst
+ $pinned_args = $args;
+ $pinned_args['meta_query'][] = [ 'key' => '_mcn_pinned', 'value' => '1' ];
+ $pinned_query = new WP_Query( $pinned_args );
+
+ $normal_args = $args;
+ $normal_args['meta_query'][] = [
+ 'relation' => 'OR',
+ [ 'key' => '_mcn_pinned', 'compare' => 'NOT EXISTS' ],
+ [ 'key' => '_mcn_pinned', 'value' => '', 'compare' => '=' ],
+ ];
+ $normal_query = new WP_Query( $normal_args );
+
+ ob_start();
+ ?>
+
+
+
+
+
+ 'mc_news_category', 'hide_empty' => true ] );
+ foreach ( $cats as $cat ) {
+ $icon = ! empty( $cat->description ) ? $cat->description . ' ' : '';
+ printf(
+ '',
+ esc_attr( $cat->slug ),
+ $icon,
+ esc_html( $cat->name )
+ );
+ }
+ ?>
+
+
+
+ have_posts() ) {
+ $query->the_post();
+ $post_id = get_the_ID();
+ $pinned = get_post_meta( $post_id, '_mcn_pinned', true );
+ $badge = get_post_meta( $post_id, '_mcn_badge', true );
+ $server_ip = get_post_meta( $post_id, '_mcn_server_ip', true );
+ $cats = get_the_terms( $post_id, 'mc_news_category' );
+ $cat_slugs = $cats ? implode( ' ', wp_list_pluck( $cats, 'slug' ) ) : '';
+ $cat_name = $cats ? $cats[0]->name : '';
+ $cat_icon = $cats ? $cats[0]->description : '📰';
+ ?>
+
+
+
+ 📌 Angepinnt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 📅
+ ✍️
+
+
+
+
+
+
+
+
+ 🖥️
+
+
+
+
+
Weiterlesen →
+
+
+
+
+
+
+
😔 Keine News in dieser Kategorie gefunden.
+
+
+ [
+ 'name' => 'News-Kategorien',
+ 'singular_name' => 'Kategorie',
+ 'add_new_item' => 'Neue Kategorie',
+ 'edit_item' => 'Kategorie bearbeiten',
+ 'search_items' => 'Kategorien suchen',
+ 'not_found' => 'Keine Kategorien gefunden',
+ 'menu_name' => 'Kategorien',
+ ],
+ 'hierarchical' => true,
+ 'show_in_menu' => true,
+ 'show_in_rest' => true,
+ 'rewrite' => [ 'slug' => 'news-kategorie' ],
+ ] );
+}
+
+/* -------------------------------------------------------
+ Standard-Kategorien beim ersten Aktivieren anlegen
+------------------------------------------------------- */
+add_action( 'init', 'msn_insert_default_categories', 20 );
+function msn_insert_default_categories() {
+ if ( get_option( 'msn_defaults_created' ) ) return;
+
+ $defaults = [
+ [ 'name' => '🔧 Update', 'slug' => 'update', 'description' => 'Server-Updates & Patches' ],
+ [ 'name' => '🎉 Event', 'slug' => 'event', 'description' => 'Community-Events & Aktionen' ],
+ [ 'name' => '⚠️ Wartung', 'slug' => 'wartung', 'description' => 'Geplante Wartungsarbeiten' ],
+ [ 'name' => '📢 Ankündigung', 'slug' => 'ankundigung','description' => 'Wichtige Ankündigungen' ],
+ [ 'name' => '🐛 Bugfix', 'slug' => 'bugfix', 'description' => 'Fehlerbehebungen' ],
+ ];
+
+ foreach ( $defaults as $cat ) {
+ if ( ! term_exists( $cat['slug'], 'msn_category' ) ) {
+ wp_insert_term( $cat['name'], 'msn_category', [
+ 'slug' => $cat['slug'],
+ 'description' => $cat['description'],
+ ] );
+ }
+ }
+
+ update_option( 'msn_defaults_created', true );
+}
diff --git a/includes/taxonomy.php b/includes/taxonomy.php
new file mode 100644
index 0000000..ce09e8e
--- /dev/null
+++ b/includes/taxonomy.php
@@ -0,0 +1,45 @@
+ 'Kategorien',
+ 'singular_name' => 'Kategorie',
+ 'search_items' => 'Kategorien suchen',
+ 'all_items' => 'Alle Kategorien',
+ 'parent_item' => 'Übergeordnete Kategorie',
+ 'edit_item' => 'Kategorie bearbeiten',
+ 'update_item' => 'Kategorie aktualisieren',
+ 'add_new_item' => 'Neue Kategorie',
+ 'new_item_name' => 'Name der neuen Kategorie',
+ 'menu_name' => 'Kategorien',
+ ];
+
+ register_taxonomy( 'mc_news_category', 'mc_news', [
+ 'labels' => $labels,
+ 'hierarchical' => true,
+ 'public' => true,
+ 'show_admin_column' => true,
+ 'rewrite' => [ 'slug' => 'news-kategorie' ],
+ 'show_in_rest' => true,
+ ] );
+
+ // Standard-Kategorien beim ersten Aufruf anlegen
+ add_action( 'init', function() {
+ $defaults = [
+ 'Update' => '🔄',
+ 'Event' => '🎉',
+ 'Wartung' => '🔧',
+ 'Wichtig' => '⚠️',
+ 'Community' => '👥',
+ ];
+ foreach ( $defaults as $name => $icon ) {
+ if ( ! term_exists( $name, 'mc_news_category' ) ) {
+ wp_insert_term( $name, 'mc_news_category', [
+ 'description' => $icon,
+ ] );
+ }
+ }
+ }, 20 );
+}
diff --git a/includes/widget.php b/includes/widget.php
new file mode 100644
index 0000000..5788a1a
--- /dev/null
+++ b/includes/widget.php
@@ -0,0 +1,78 @@
+ 'Zeigt die neuesten Server-News in der Sidebar.',
+ ] );
+ }
+
+ public function widget( $args, $instance ) {
+ $title = apply_filters( 'widget_title', $instance['title'] ?? 'Server News' );
+ $anzahl = intval( $instance['anzahl'] ?? 3 );
+
+ echo $args['before_widget'];
+ if ( $title ) echo $args['before_title'] . $title . $args['after_title'];
+
+ $query = new WP_Query( [
+ 'post_type' => 'mc_news',
+ 'posts_per_page' => $anzahl,
+ 'post_status' => 'publish',
+ ] );
+
+ if ( $query->have_posts() ) {
+ echo '';
+ wp_reset_postdata();
+ } else {
+ echo 'Noch keine News vorhanden.
';
+ }
+
+ echo $args['after_widget'];
+ }
+
+ public function form( $instance ) {
+ $title = $instance['title'] ?? 'Server News';
+ $anzahl = $instance['anzahl'] ?? 3;
+ ?>
+
+
+
+
+
+
+
+
+ sanitize_text_field( $new['title'] ),
+ 'anzahl' => intval( $new['anzahl'] ),
+ ];
+ }
+}