$current_tab, 'paged' => isset($_GET['paged']) ? intval($_GET['paged']) : 1, 'orderby' => isset($_GET['orderby']) ? sanitize_text_field($_GET['orderby']) : 'modified', 'order' => isset($_GET['order']) ? sanitize_text_field($_GET['order']) : 'desc', 'category'=> isset($_REQUEST['category']) ? intval($_REQUEST['category']) : 0, ); $redirect_url = add_query_arg( $params, admin_url('admin.php?page=select-and-handle') ); // Beiträge hinzufügen (POST) if ( $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['selected_posts']) && is_array($_POST['selected_posts']) ) { $new_posts = array_map( 'intval', $_POST['selected_posts'] ); $current = get_option( 'sah_selected_posts', [] ); $merged = array_unique( array_merge( $current, $new_posts ) ); update_option( 'sah_selected_posts', $merged ); $action_taken = true; } // Einzelnen Eintrag entfernen (GET) if ( isset($_GET['remove']) ) { $remove_id = intval($_GET['remove']); $current = get_option( 'sah_selected_posts', [] ); if ( ($key = array_search($remove_id, $current)) !== false ) { unset($current[$key]); update_option( 'sah_selected_posts', $current ); $action_taken = true; } } if ( $action_taken ) { if ( headers_sent() ) { echo ''; echo ''; exit; } else { if ( ob_get_length() ) { ob_end_clean(); } wp_redirect( $redirect_url ); exit; } } } /** * Fügt das Admin-Menü hinzu. */ function sah_add_admin_menu() { add_menu_page( 'Select and Handle', 'Select and Handle', 'manage_options', 'select-and-handle', 'sah_admin_page', 'dashicons-edit', 25 ); } add_action( 'admin_menu', 'sah_add_admin_menu' ); /** * Zeigt die Admin-Seite an. * Die Reihenfolge: Zuerst der Titel, dann die "Gespeicherte Auswahl" (direkt darunter), anschließend die Reiter, danach der Rest. */ function sah_admin_page() { sah_handle_form_submissions(); $current_tab = isset($_GET['tab']) ? sanitize_text_field($_GET['tab']) : 'post'; ?>

Select and Handle

'; echo '

Gespeicherte Auswahl

'; if ( ! empty( $selected_posts ) ) { echo '
'; $titles = []; // Alle relevanten Parameter übernehmen, um den Zustand beizubehalten. $params = array( 'tab' => $current_tab, 'paged' => isset($_GET['paged']) ? intval($_GET['paged']) : 1, 'orderby' => isset($_GET['orderby']) ? sanitize_text_field($_GET['orderby']) : 'modified', 'order' => isset($_GET['order']) ? sanitize_text_field($_GET['order']) : 'desc', 'category'=> isset($_GET['category']) ? intval($_GET['category']) : 0, ); foreach ( $selected_posts as $post_id ) { $post = get_post( $post_id ); if ( $post && ! empty( $post->post_title ) ) { $remove_params = $params; $remove_params['remove'] = $post_id; $remove_url = add_query_arg( $remove_params, admin_url( 'admin.php?page=select-and-handle' ) ); $titles[] = '' . '' . esc_html( $post->post_title ) . '' . ' [x]' . ''; } } echo implode( '
', $titles ); echo '
'; } else { echo '

Keine Einträge ausgewählt.

'; } echo ''; return ob_get_clean(); } /** * Gibt für einen Beitrag alle Begriffe aus den hierarchischen Taxonomien zurück. */ function sah_get_post_categories( $post_id, $post_type ) { $taxonomies = get_object_taxonomies( $post_type, 'objects' ); $category_names = []; foreach ( $taxonomies as $taxonomy ) { if ( $taxonomy->hierarchical ) { $terms = get_the_terms( $post_id, $taxonomy->name ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) { foreach ( $terms as $term ) { $category_names[] = $term->name; } } } } return $category_names; } /** * Ermittelt die erste hierarchische Taxonomie für den Post Type. */ function sah_get_category_taxonomy( $post_type ) { $taxonomies = get_object_taxonomies( $post_type, 'objects' ); foreach ( $taxonomies as $taxonomy ) { if ( $taxonomy->hierarchical ) { return $taxonomy->name; } } return ''; } /** * Erzeugt einen sortierbaren Link. * Spalten, die sortierbar sein sollen, sind "Titel" und "Last Modified". * Jetzt wird auch der aktuelle Kategorienfilter übernommen, sodass sich der Filter nicht zurücksetzt. */ function sah_sort_link( $column_label, $column_key, $current_tab ) { $current_orderby = $_GET['orderby'] ?? 'modified'; $current_order = $_GET['order'] ?? 'desc'; $next_order = 'asc'; $class = 'sortable'; if ( $current_orderby === $column_key ) { if ( $current_order === 'asc' ) { $next_order = 'desc'; $class .= ' sorted-asc'; } else { $next_order = 'asc'; $class .= ' sorted-desc'; } } $category = isset($_REQUEST['category']) ? intval($_REQUEST['category']) : 0; $url = add_query_arg( [ 'orderby' => $column_key, 'order' => $next_order, 'tab' => $current_tab, 'category' => $category, ], admin_url( 'admin.php?page=select-and-handle' ) ); return '' . esc_html( $column_label ) . ''; } /** * Zeigt eine Tabelle mit Beiträgen, Seiten oder Custom Post Types an. * Die Tabelle enthält: * - Eine Checkbox-Spalte * - Spalte "Titel": Fett dargestellter Link zum Beitrag (öffnet in neuem Tab) plus Statusanzeige (Privat/Entwurf) und einen "Bearbeiten"-Link. * - Spalte "Kategorie" * - Spalte "Last Modified": basierend auf dem Datum der letzten Änderung (Format: "YYYY/MM/DD at g:i a"). * Die Tabelle ist sortierbar nach "Titel" und "Last Modified". * Die Pagination wird oben und unten angezeigt, jeweils rechtsbündig. * * Wichtig: Der Kategorien-Filter wird über ein separates GET-Formular geregelt – der Parameter "category" wird über $_REQUEST ausgelesen. */ function sah_display_table( $post_type ) { $selected_category = intval( $_REQUEST['category'] ?? 0 ); $paged = max( 1, intval( $_GET['paged'] ?? 1 ) ); $posts_per_page = 10; $orderby = $_GET['orderby'] ?? 'modified'; $order = $_GET['order'] ?? 'desc'; $args = [ 'post_type' => $post_type, 'posts_per_page' => $posts_per_page, 'paged' => $paged, 'post_status' => [ 'publish', 'private', 'draft' ], 'orderby' => $orderby, 'order' => strtoupper( $order ), ]; $category_tax = sah_get_category_taxonomy( $post_type ); if ( $selected_category && $category_tax ) { $args['tax_query'] = [[ 'taxonomy' => $category_tax, 'field' => 'term_id', 'terms' => $selected_category, ]]; } $query = new WP_Query( $args ); // Kategorie-Filter-Formular und Pagination oben in einem flexiblen Container $category_filter_html = ''; if ( $category_tax ) { ob_start(); echo '
'; echo ''; echo ''; echo ''; echo '
'; $category_filter_html = ob_get_clean(); } $pagination_html = ''; if ( $query->max_num_pages > 1 ) { ob_start(); echo ''; $pagination_html = ob_get_clean(); } // Ausgabe des kombinierten Bereichs (Filter und obere Pagination) if ( ! empty( $category_filter_html ) || ! empty( $pagination_html ) ) { echo '
'; echo '
' . $category_filter_html . '
'; echo '
' . $pagination_html . '
'; echo '
'; } // Formular mit Tabelle ?>
have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); $post_id = get_the_ID(); $status = get_post_status( $post_id ); $status_text = ''; if ( $status === 'private' ) { $status_text = ' (Privat)'; } elseif ( $status === 'draft' ) { $status_text = ' (Entwurf)'; } ?>
Kategorie

Bearbeiten
Last Modified
Keine Beiträge gefunden.