Ordinare Colonna Personalizzata per Query Tassonomica in WordPress
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.

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:
- Sostituisci tutte le occorrenze di
YOUR-POST-TYPE-NAME
con il nome effettivo del tuo post type. - Sostituisci tutte le occorrenze di
YOUR-TAXONOMY-NAME
con il nome effettivo della tua tassonomia. - Sostituisci tutte le occorrenze di
YOUR COLUMN NAME
con il nome effettivo della tua colonna. - 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.

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
.
