it-swarm.com.de

Benutzerdefinierte Tabellenspalte Sortierbar nach Taxonomie-Abfrage

Ich möchte einer benutzerdefinierten Beitragstyp-Beitragsauflistungstabelle im Dashboard eine benutzerdefinierte Spalte hinzufügen.

Ich habe viele Fragen/Antworten zu WPSE zusammen mit diesem Artikel gelesen. Obwohl es so aussieht, als ob jeder nach Metaschlüssel/Wert fragen möchte.

Ich versuche, einer benutzerdefinierten Beitragstypentabelle einen Taxonomiewert (im Grunde genommen eine Kategorie) hinzuzufügen.

Ich möchte, dass die Spalte sortierbar ist, verstehe jedoch die Abfrageanpassung nicht.

Fügen Sie den Spaltentitel hinzu.

function mbe_column_titles($columns){
    $columns['title'] = 'Frequently Asked Question';
    $columns['mbe-faq-category'] = 'Category';
    return $columns;
}
add_filter('manage_mbe-faqs_posts_columns', 'mbe_column_titles');

Fügen Sie die Zeilenwerte hinzu.

function mbe_column_rows($column_name, $post_id){
    if($column_name == 'mbe-faq-category'){
        $categories = wp_get_object_terms($post_id, 'mbe-faq-categories');
        $the_category = array();
        if($categories){
            foreach($categories as $category){
                $the_category[] = $category->name;
            }
        }
        echo join(', ', $the_category);
    }
}
add_action('manage_mbe-faqs_posts_custom_column', 'mbe_column_rows', 10, 2);

Bereiten Sie den Bestellschlüssel vor,

function mbe_sortable_columns($columns){
    $columns['mbe-faq-category'] = 'mbe-faq-category';
    return $columns;
}
add_filter('manage_edit-mbe-faqs_sortable_columns', 'mbe_sortable_columns');

Ich bin ratlos darüber, wie die Spalte tatsächlich nach der Kategorie FAQ sortiert wird. Ich würde annehmen, dass dies eine Taxonomie-Abfrage wäre. Es ist mir zu peinlich, meinen Versuch, damit umzugehen, überhaupt zu posten, und alles, was ich tue, scheint zu scheitern. Ich möchte den pre_get_posts-Filter verwenden, um dies zu handhaben, wenn dies möglich ist.

4
Michael Ecklund

Um eine benutzerdefinierte sortierbare Spalte zum WP_List_Table Ihres Beitragstyps im Back-End-Dashboard der WordPress-Administration hinzuzufügen, müssen Sie folgende Schritte ausführen:

  1. Ersetzen Sie alle Vorkommen von YOUR-POST-TYPE-NAME durch Ihren tatsächlichen Beitragstypnamen.
  2. Ersetzen Sie alle Vorkommen von YOUR-TAXONOMY-NAME durch Ihren tatsächlichen Taxonomienamen.
  3. Ersetzen Sie alle Vorkommen von YOUR COLUMN NAME durch Ihren tatsächlichen Spaltennamen.
  4. Ersetzen Sie alle Vorkommen von YOUR-COLUMN-SLUG durch Ihren tatsächlichen Spalten-Slug.

Schritt 1

Fügen Sie zusätzliche WordPress Admin-Tabellenspalten hinzu

if(!function_exists('mbe_change_table_column_titles')){
    function mbe_change_table_column_titles($columns){
        unset($columns['date']);// temporarily remove, to have custom column before date column
        $columns['YOUR-COLUMN-SLUG'] = 'YOUR COLUMN NAME';
        $columns['date'] = 'Date';// readd the date column
        return $columns;
    }
    add_filter('manage_YOUR-POST-TYPE-NAME_posts_columns', 'mbe_change_table_column_titles');
}

Schritt 2

Fügen Sie alle zugewiesenen verknüpfbaren Taxonomiebegriffe als Zeilendaten in der benutzerdefinierten WordPress Admin-Tabellenspalte hinzu

if(!function_exists('mbe_change_column_rows')){
    function mbe_change_column_rows($column_name, $post_id){
        if($column_name == 'YOUR-COLUMN-SLUG'){
            echo get_the_term_list($post_id, 'YOUR-TAXONOMY-NAME', '', ', ', '').PHP_EOL;
        }
    }
    add_action('manage_YOUR-POST-TYPE-NAME_posts_custom_column', 'mbe_change_column_rows', 10, 2);
}

Schritt 3

Aktivieren Sie die benutzerdefinierte WordPress Admin-Tabellenspalte, um sortierbar zu werden

if(!function_exists('mbe_change_sortable_columns')){
    function mbe_change_sortable_columns($columns){
        $columns['YOUR-COLUMN-SLUG'] = 'YOUR-COLUMN-SLUG';
        return $columns;
    }
    add_filter('manage_edit-YOUR-POST-TYPE-NAME_sortable_columns', 'mbe_change_sortable_columns');
}

Schritt 4

Ändern Sie den post_clauses, um das Sortieren benutzerdefinierter WordPress Admin-Tabellenspalten nach einem Taxonomiebegriff zuzulassen

if(!function_exists('mbe_sort_custom_column')){
    function mbe_sort_custom_column($clauses, $wp_query){
        global $wpdb;
        if(isset($wp_query->query['orderby']) && $wp_query->query['orderby'] == 'YOUR-COLUMN-SLUG'){
            $clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
            $clauses['where'] .= "AND (taxonomy = 'YOUR-TAXONOMY-NAME' OR taxonomy IS NULL)";
            $clauses['groupby'] = "object_id";
            $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC)";
            if(strtoupper($wp_query->get('order')) == 'ASC'){
                $clauses['orderby'] .= 'ASC';
            } else{
                $clauses['orderby'] .= 'DESC';
            }
        }
        return $clauses;
    }
    add_filter('posts_clauses', 'mbe_sort_custom_column', 10, 2);
}

Schritt 5 (BONUS)

Passen Sie die Breite der benutzerdefinierten WordPress Admin-Tabellenspalten an

if(!function_exists('mbe_print_admin_styles')){
    function mbe_print_admin_styles(){
        if(!is_admin()){
            return false;
        }
        global $pagenow;
        if($pagenow == 'edit.php' && isset($_GET['post_type']) && $_GET['post_type'] == 'YOUR-POST-TYPE-NAME'){
            echo '
        <style type="text/css">
            .column-YOUR-COLUMN-SLUG{
                width: 10%;
            }
        </style>
        '.PHP_EOL;
        }
    }
    add_action('wp_print_scripts', 'mbe_print_admin_styles');
}

Dank @goto10 für die Abfrage von sortierbaren Verwaltungsspalten, wenn keine Daten von post_meta stammen und @scribu für die Veröffentlichung von benutzerdefinierten sortierbaren Spalten und sortierbaren Taxonomiespalten Antwort auf die ursprüngliche Frage Benutzerdefinierte Tabellenspalte sortiert nach Taxonomie-Abfrage .

13
Michael Ecklund