Adăugare coloană personalizată sortabilă după taxonomie în WordPress
Încerc să adaug o coloană personalizată în tabelul de afișare al postărilor pentru un tip de postare personalizată în panoul de administrare.
Am citit numeroase întrebări/răspunsuri pe WPSE, precum și acest articol. Totuși, se pare că toată lumea vrea să interogheze după cheie/valoare meta.
Eu încerc să adaug o valoare de taxonomie (în esență o categorie) în tabelul tipului de postare personalizată.
Aș dori ca coloana să fie sortabilă, dar nu înțeleg cum să ajustez interogarea.
Adăugarea titlului coloanei:
function mbe_column_titles($columns){
$columns['title'] = 'Întrebare frecventă';
$columns['mbe-faq-category'] = 'Categorie';
return $columns;
}
add_filter('manage_mbe-faqs_posts_columns', 'mbe_column_titles');
Adăugarea valorilor rândurilor:
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);
Pregătirea cheii de ordonare:
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');
Sunt blocat la partea de sortare efectivă a coloanei după Categoria FAQ. Presupun că ar trebui să fie o interogare de taxonomie. Sunt prea rușinat să postez încercările mele, iar tot ce încerc eșuează. Aș dori să folosesc filtrul pre_get_posts
pentru a gestiona acest lucru, dacă este posibil.

Pentru a adăuga o coloană personalizată sortabilă în WP_List_Table
al tipului tău de postare în panoul de administrare WordPress, va trebui să faci următoarele:
- Înlocuiește toate aparițiile lui
YOUR-POST-TYPE-NAME
cu numele real al tipului tău de postare. - Înlocuiește toate aparițiile lui
YOUR-TAXONOMY-NAME
cu numele real al taxonomiei tale. - Înlocuiește toate aparițiile lui
YOUR COLUMN NAME
cu numele real al coloanei tale. - Înlocuiește toate aparițiile lui
YOUR-COLUMN-SLUG
cu slug-ul real al coloanei tale.
Pasul 1
Adaugă Coloane Adiționale în Tabelul de Administrare WordPress
if(!function_exists('mbe_change_table_column_titles')){
function mbe_change_table_column_titles($columns){
unset($columns['date']);// elimină temporar, pentru a avea coloana personalizată înaintea coloanei de dată
$columns['YOUR-COLUMN-SLUG'] = 'YOUR COLUMN NAME';
$columns['date'] = 'Dată';// readaugă coloana de dată
return $columns;
}
add_filter('manage_YOUR-POST-TYPE-NAME_posts_columns', 'mbe_change_table_column_titles');
}
Pasul 2
Adaugă Toți Termenii de Taxonomie Asociați ca Date de Rând în Coloana Personalizată WordPress
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);
}
Pasul 3
Activează Coloana Personalizată WordPress pentru a fi Sortabilă
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');
}
Pasul 4
Modifică post_clauses
pentru a Permite Sortarea Coloanelor Personalizate după un Termen de Taxonomie
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);
}
Pasul 5 (BONUS)
Ajustează Lățimea Coloanelor Personalizate WordPress
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');
}
Mulțumiri lui @goto10
pentru întrebarea Coloane de administrare sortabile, când datele nu provin din post_meta și lui @scribu
pentru postarea Coloane Personalizate Sortabile și Coloane de Taxonomie Sortabile pentru acest răspuns la întrebarea originală Coloană Personalizată Sortabilă prin Interogare de Taxonomie.

Acest lucru poate fi realizat mult mai ușor cu un singur filtru:
/**
* Sortare după Termen din Taxonomie
*
* Adaugă sortarea pe coloană pentru o taxonomie personalizată în vizualizarea de editare a unui tip de postare personalizat în WordPress.
*
* Notă: Înlocuiește valorile {post_type} și {taxonomy} de mai jos.
*/
add_filter( 'manage_edit-{post_type}_sortable_columns', function( $sortable_columns ) {
$sortable[ 'taxonomy-{taxonomy}' ] = ['orderby', 'asc'];
return $sortable;
}, 10, 1 );
Înlocuiește {post_type}
și {taxonomy}
cu tipul de postare și taxonomia cu care lucrezi. Rezultatul final va fi o coloană personalizată în tipul tău de postare care poate fi sortată și poate fi utilizată pentru a sorta postările în WP_List_Table
.
