Ordinare Colonna Personalizzata per Query Tassonomica in WordPress

14 ago 2013, 01:14:17
Visualizzazioni: 13.6K
Voti: 8

Sto cercando di aggiungere una colonna personalizzata alla tabella di elenco dei post di un custom post type nella dashboard.

Ho letto molte domande/risposte su WPSE, insieme a questo articolo. Anche se sembra che tutti vogliano eseguire query per meta key/value.

Sto cercando di aggiungere un valore di tassonomia (praticamente una categoria) a una tabella di custom post type.

Vorrei che la colonna fosse ordinabile, ma non riesco a capire come modificare la query.

Aggiungi il titolo della colonna.

function mbe_column_titles($columns){
    $columns['title'] = 'Domanda Frequente';
    $columns['mbe-faq-category'] = 'Categoria';
    return $columns;
}
add_filter('manage_mbe-faqs_posts_columns', 'mbe_column_titles');

Aggiungi i valori delle righe.

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);

Prepara la chiave per l'ordinamento,

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');

Sono bloccato su come effettivamente ordinare la colonna per la Categoria FAQ. Suppongo che dovrebbe essere una query tassonomica. Sono troppo imbarazzato per pubblicare anche solo il mio tentativo di gestire questo aspetto, e tutto ciò che provo sembra fallire. Vorrei usare il filtro pre_get_posts per gestire questo se possibile.

4
Commenti

Wow, dopo aver scritto questo post, ho appena notato Colonne amministrative ordinabili, quando i dati non provengono da post_meta nella sezione correlata. Scusate per non aver cercato meglio prima di chiedere, questo potrebbe essere un duplicato. Anche se una risposta diretta sarebbe fuori sito... Colonne tassonomiche ordinabili, di Scribu

Michael Ecklund Michael Ecklund
14 ago 2013 01:17:11

La versione 3.5 ha aggiunto l'argomento show_admin_column a register_taxonomy che fondamentalmente fa tutto questo per te, senza bisogno di farlo manualmente.

Milo Milo
21 ott 2013 18:23:02

@Milo Grazie per averlo segnalato! Non ero a conoscenza di quel parametro. Senza dubbio rende le cose molto più semplici. Tuttavia, non sembra essere ordinabile con il tuo metodo. Il tuo metodo si occupa dei passaggi 1 e 2 della mia risposta.

Michael Ecklund Michael Ecklund
21 ott 2013 18:34:23

ah vero, ti permette di filtrare per termine, ma non di ordinare per termine.

Milo Milo
21 ott 2013 18:35:58
Tutte le risposte alla domanda 2
0
22

Per aggiungere una colonna personalizzata ordinabile alla tabella WP_List_Table del tuo post type all'interno della dashboard di amministrazione di WordPress, dovrai seguire questi passaggi:

  1. Sostituisci tutte le occorrenze di YOUR-POST-TYPE-NAME con il nome effettivo del tuo post type.
  2. Sostituisci tutte le occorrenze di YOUR-TAXONOMY-NAME con il nome effettivo della tua tassonomia.
  3. Sostituisci tutte le occorrenze di YOUR COLUMN NAME con il nome effettivo della tua colonna.
  4. Sostituisci tutte le occorrenze di YOUR-COLUMN-SLUG con lo slug effettivo della tua colonna.

Passaggio 1

Aggiungi colonne aggiuntive alla tabella di amministrazione di WordPress

if(!function_exists('mbe_change_table_column_titles')){
    function mbe_change_table_column_titles($columns){
        unset($columns['date']);// rimuovi temporaneamente, per avere la colonna personalizzata prima della colonna data
        $columns['YOUR-COLUMN-SLUG'] = 'YOUR COLUMN NAME';
        $columns['date'] = 'Data';// riaggiungi la colonna data
        return $columns;
    }
    add_filter('manage_YOUR-POST-TYPE-NAME_posts_columns', 'mbe_change_table_column_titles');
}

Passaggio 2

Aggiungi tutti i termini di tassonomia assegnati come dati di riga all'interno della colonna personalizzata

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);
}

Passaggio 3

Abilita l'ordinamento per la colonna personalizzata nella tabella di amministrazione

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');
}

Passaggio 4

Modifica post_clauses per consentire l'ordinamento delle colonne personalizzate per termine di tassonomia

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);
}

Passaggio 5 (BONUS)

Regola la larghezza delle colonne personalizzate nella tabella di amministrazione

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');
}

Ringraziamenti a @goto10 per aver posto la domanda Colonne di amministrazione ordinabili, quando i dati non provengono da post_meta e a @scribu per aver pubblicato Colonne personalizzate ordinabili e Colonne di tassonomia ordinabili per questa risposta alla domanda originale Colonna personalizzata ordinabile per query di tassonomia.

21 ott 2013 18:13:31
0
-2

Questo può essere fatto molto più facilmente con un singolo filtro:

/**
 * Ordinamento per Termine di Tassonomia
 *
 * Aggiunge l'ordinamento per colonna per una tassonomia personalizzata alla vista di modifica di un custom post type in WordPress.
 *
 * Nota: Sostituisci i valori {post_type} e {taxonomy} qui sotto.
 */
add_filter( 'manage_edit-{post_type}_sortable_columns', function( $sortable_columns ) {
  $sortable[ 'taxonomy-{taxonomy}' ] = ['orderby', 'asc'];
  return $sortable;
}, 10, 1 );

Sostituisci {post_type} e {taxonomy} con il post type e la tassonomia con cui stai lavorando. Il risultato finale sarà una colonna personalizzata sul tuo custom post type che è ordinabile e può essere utilizzata per ordinare i post nella WP_List_Table.

10 set 2020 17:54:32