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 → +
+
+ +
+ + +
+ [ + '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'] ), + ]; + } +}