web-dev-qa-db-fra.com

Tri des colonnes de taxonomie par méta-valeur numérique

Devenir lentement fou en essayant de rendre les colonnes d'administration de taxonomie triables par un numéro de champ personnalisé. J'ai une taxonomie personnalisée appelée "typer" et ces taxonomies ont un champ personnalisé appelé "prioret".

J'ai réussi à obtenir mon code pour afficher la colonne et la rendre triable. Le seul problème est que les champs sont triés par ordre alphabétique, bien que tous soient des nombres. thats signifie qu'un fieldset de [1, 3, 14, 22] se présenterait comme:

1

14

22

3

Mon code jusqu'à présent

function create_date_column_for_issues($issue_columns) {
  $issue_columns['prioritet'] = 'Prioritet / sortering';
  return $issue_columns;
}
add_filter('manage_edit-typer_columns', 'create_date_column_for_issues');

function populate_date_column_for_issues($value, $column_name, $term_id) {
  $issue = get_term($term_id, 'typer');
  $date = get_field('prioritet', $issue);
  switch($column_name) {
    case 'prioritet': 
        $value = $date;  


    break;
    default:

    break;
  }
  return $value;    
}
add_filter('manage_typer_custom_column', 'populate_date_column_for_issues', 10, 3);

function register_date_column_for_issues_sortable($columns) {
  $columns['prioritet'] = 'prioritet';
  return $columns;
}
add_filter('manage_edit-typer_sortable_columns', 'register_date_column_for_issues_sortable');

add_filter( 'terms_clauses', 'filter_terms_clauses', 10, 3 );

/**
 * Filter WP_Term_Query meta query
 *
 * @param   object  $query  WP_Term_Query
 * @return  object
 */
function filter_terms_clauses( $pieces, $taxonomies, $args ) {

    global $pagenow, $wpdb; 

    // Require ordering
    $orderby = ( isset( $_GET['orderby'] ) ) ? trim( sanitize_text_field( $_GET['orderby'] ) ) : ''; 
    if ( empty( $orderby ) ) { return $pieces; }

    // set taxonomy
    $taxonomy = $taxonomies[0];

    // only if current taxonomy or edit page in admin           
    if ( !is_admin() || $pagenow !== 'edit-tags.php' || !in_array( $taxonomy, [ 'typer' ] ) ) { return $pieces; }

    // and ordering matches
    if ( $orderby === 'prioritet' ) {
        $pieces['join']  .= ' INNER JOIN ' . $wpdb->termmeta . ' AS tm ON t.term_id = tm.term_id ';
        $pieces['where'] .= ' AND tm.meta_key = "prioritet"'; 
        $pieces['orderby']  = ' ORDER BY tm.meta_value '; 
    }

    return $pieces;
}

Mes connaissances sur MySQL sont à peu près nulles, donc je ne sais pas où aller.

En supplément:

À l'heure actuelle, le tri exclura toutes les taxonomies qui ont un champ vide. Ce serait bien de les afficher en bas, mais je me rends compte que j'ai besoin d'une requête beaucoup plus compliquée. Alors, ne participez à cela que s'il vous arrive d'avoir la solution sur le dessus de votre tête.

1
Emil Østervig

Le code que je publie est une version modifiée et simplifiée de la vôtre. J'ai obtenu ma solution en utilisant votre code.

/**
 * Filter WP_Term_Query meta query
 *
 * @param   object  $query  WP_Term_Query
 * @return  object
 */
function filter_terms_clauses( $pieces, $taxonomies, $args ) {

    global $pagenow, $wpdb;

    if(!is_admin()) {
        return $pieces;
    }

    if(
        is_admin() 
        && $pagenow == 'edit-tags.php' 
        && $taxonomies[0] == 'typer' 
        && ( isset($_GET['orderby']) && $_GET['orderby'] == 'prioritet' )
    ) {

        $pieces['join']     .= ' INNER JOIN ' . $wpdb->termmeta . ' AS tm ON t.term_id = tm.term_id ';
        $pieces['where']    .= ' AND tm.meta_key = "prioritet"'; 
        $pieces['orderby']   = ' ORDER BY tm.meta_value ';
        $pieces['order']     = isset($_GET['order']) ? $_GET['order'] : "DESC";
    }

    return $pieces;
}

add_filter( 'terms_clauses', 'filter_terms_clauses', 10, 3 );

J'espère que celui-ci vous aidera.

2
dipak_pusti

pour moi, j'ai fait une taxonomie personnalisée et dans cette taxonomie personnalisée j'avais une méta personnalisée. Je voulais avoir dans le backend d'administration une colonne et la rendre triable. pour faire un travail triable pour une taxonomie personnalisée dans une méta personnalisée, je l'ai fait.

https://Pastebin.com/vr2sCKzX

public function pre_get_terms( $query ) {
    $meta_query_args = array(
        'relation' => 'AND', // Optional, defaults to "AND"
        array(
            'key'     => 'order_index',
            'value'   => 0,
            'compare' => '>='
        )
    );
    $meta_query = new WP_Meta_Query( $meta_query_args );
    $query->meta_query = $meta_query;
    $query->orderby = 'position_clause';
}

J'ai trouvé la réponse dans ce lien https://core.trac.wordpress.org/ticket/34996

Je viens d'adapter la réponse fournie dans les commentaires de @ eherman24

1
Lucas Gabriel