web-dev-qa-db-fra.com

Rendre une colonne taxonomique triable dans l’administrateur?

J'ai défini un terme de taxonomie à afficher sous forme de colonne dans l'interface utilisateur d'administration pour mon type de publication personnalisé:

add_action( 'init', 'create_asset_tax' );

function create_asset_tax() {
  register_taxonomy(
    'asset_type',
    'design_asset',
    array(
        'label' => __( 'Asset Type' ),
        'rewrite' => array( 'slug' => 'type' ),
        'show_admin_column' => true,
        'hierarchical' => true,
        'sort' => true
    )
  );
}

Comment pourrais-je rendre cette colonne "triable" dans l'interface utilisateur d'administration pour mon type de publication personnalisé? La plupart des astuces que j'ai trouvées ici semblent être pour le tri des colonnes ajoutées, pas pour les colonnes qui résultent d'un terme de taxonomie, c'est donc un peu déroutant. Merci.

1
Steve

Vous pouvez utiliser le filtre posts_clauses:

function wpse155797_posts_clauses( $pieces, $query ) {
    if ( ! is_admin() || ! $query->is_main_query() ) {
        return $pieces;
    }
    global $wpdb;
    if ( ( $orderby = $query->get( 'orderby' ) ) == 'asset_type' ) {
        if ( ( $order = strtoupper( $query->get( 'order' ) ) ) != 'DESC' ) $order = 'ASC';
        $pieces[ 'join' ] .= ' LEFT JOIN ' . $wpdb->term_relationships . ' AS tr ON ' . $wpdb->posts . '.ID = tr.object_id'
            . ' LEFT JOIN ' . $wpdb->term_taxonomy . ' AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id'
            . ' LEFT JOIN ' . $wpdb->terms . ' AS t ON tt.term_id = t.term_id';
        $pieces[ 'fields' ] .= ', group_concat(t.name ORDER BY t.name ' . $order . ') AS ' . $orderby;
        $pieces[ 'groupby' ] = $wpdb->posts . '.ID';
        $pieces[ 'orderby' ] = $orderby . ' ' . $order . ', ' . $wpdb->posts . '.post_title ASC';
    }
    return $pieces;
}
add_filter( 'posts_clauses', 'wpse155797_posts_clauses', 10, 2 );

Cela suppose que vous avez ajouté

$columns['taxonomy-asset_type'] = 'asset_type';

à votre filtre manage_edit_sortable_columns.

Cela trie par termes de taxonomie mais a l’air amusant si vous triez par ordre décroissant et que vous avez plus d’un terme, chaque groupe étant toujours classé par ordre alphabétique. Pour résoudre ce problème, vous devez remplacer la colonne par défaut 'taxonomy-asset_type' dans votre filtre manage_posts_columns par 'asset_type' (modifier le nom de la colonne manage_edit_sortable_columns ci-dessus), puis dupliquer le code de sortie standard WP dans votre action manage_posts_custom_column avec une valeur ajoutée. array_reverse sur la sortie:

    case 'asset_type':
        $taxonomy = 'asset_type';
        if ( $terms = get_the_terms( $post->ID, $taxonomy ) ) {
            $out = array();
            foreach ( $terms as $t ) {
                $posts_in_term_qv = array();
                $posts_in_term_qv['taxonomy'] = $taxonomy;
                $posts_in_term_qv['term'] = $t->slug;

                $out[] = sprintf( '<a href="%s">%s</a>',
                    esc_url( add_query_arg( $posts_in_term_qv, 'upload.php' ) ),
                    esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) )
                );
            }
            // New bit
            if ( isset( $_GET['order'] ) && $_GET['order'] == 'desc' ) {
                $out = array_reverse( $out );
            }
            /* translators: used between list items, there is a space after the comma */
            echo join( __( ', ' ), $out );
        } else {
            echo '&#8212;';
        }
        break;
2
bonger