web-dev-qa-db-fra.com

Taxonomie personnalisée - colonne triable personnalisée

J'ai créé une taxonomie personnalisée appelée "villes" où vous pouvez ajouter des villes et ajouté un champ personnalisé (bouton radio) avec 2 options: "Oui" et "Non" (peu importe ce que c'est). Tout va bien, je peux avoir cette valeur et d'autres choses.

Plus tard, j'ai eu l'idée d'ajouter une colonne pouvant être triée (comme 'Nom', 'Slug', 'Messages' etc.). J'ai réussi à créer cette colonne, à la rendre triable mais je ne sais pas comment trier ces villes par ce champ personnalisé? Pour le moment, le tri s'effectue par nom, car je ne parviens pas à le faire fonctionner avec un champ personnalisé.

Des indices/astuces peut-être?

1
mihajlo

J'ai eu un problème similaire et j'ai réussi à le résoudre. Dans mon cas, j'ai une taxonomie personnalisée, issue, qui contient un champ personnalisé du sélecteur de date requis à l'aide de ACF PRO plugin; le nom du champ est issue_date. Je voulais ajouter la colonne de date à mon écran d'édition issue à wp-admin/edit-tags.php?taxonomy=issue et permettre aux administrateurs de trier les problèmes par date.

J'ai essayé de me connecter à pre_get_posts comme @aifrim a répondu ci-dessus, mais cette action ne fait pas partie de la requête qui s'exécute lorsque WordPress charge des termes de taxonomie dans l'écran d'édition. En outre, les termes de taxonomie n’ayant aucune métadonnée native dans la base de données WordPress, un meta_query ne fonctionnera pas car mes métadonnées sont stockées dans une autre table. Un curveball amusant.

Etape 1:Crée la nouvelle colonne elle-même, elle sera initialement vide

function create_date_column_for_issues($issue_columns) {
  $issue_columns['date'] = 'Date';
  return $issue_columns;
}
add_filter('manage_edit-issue_columns', 'create_date_column_for_issues');

Étape 2:Remplit la nouvelle colonne

function populate_date_column_for_issues($value, $column_name, $term_id) {
  $issue = get_term($term_id, 'issue');
  $date = DateTime::createFromFormat('Ymd', get_field('issue_date', $issue));
  switch($column_name) {
    case 'date': 
      $value = $date->format('Y/m/d');
    break;
    default:
    break;
  }
  return $value;    
}
add_filter('manage_issue_custom_column', 'populate_date_column_for_issues', 10, 3);

Etape 3:Rendre la nouvelle colonne triable

function register_date_column_for_issues_sortable($columns) {
  $columns['date'] = 'issue_date';
  return $columns;
}
add_filter('manage_edit-issue_sortable_columns', 'register_date_column_for_issues_sortable');

Étape 4:Définit le tri personnalisé (où la magie se produit)

function sort_issues_by_date($pieces, $taxonomies, $args) {
  global $pagenow;
  if(!is_admin()) {
    return $pieces;
  }

  if(is_admin() && $pagenow == 'edit-tags.php' && $taxonomies[0] == 'issue' && (!isset($_GET['orderby']) || $_GET['orderby'] == 'issue_date')) {
    $pieces['join']   .= " INNER JOIN wp_options AS opt ON opt.option_name = concat('issue_',t.term_id,'_issue_date')";
    $pieces['orderby'] = "ORDER BY opt.option_value";
    $pieces['order']   = isset($_GET['order']) ? $_GET['order'] : "DESC";
  }

  return $pieces;
}
add_filter('terms_clauses', 'sort_issues_by_date', 10, 3);

Mon instruction conditionnelle à l'étape 4 triera également par ordre décroissant issue_date comme tri par défaut lorsqu'il n'y a pas d'autre critère de tri défini.

J'espère que cela aidera quelqu'un d'autre qui cherche à faire une meilleure expérience d'administration!

2
cfx

Merci beaucoup à @cfx pour cette réponse. Maintenant que WP dispose du support Term Meta, j'ai mis à jour l'étape 4 pour en tirer parti. Cette solution emprunte cette réponse https://wordpress.stackexchange.com/a/246206/85388 qui montre comment connecter une méta_query à une commande.

add_filter('pre_get_terms', 'uh_service_type_taxonomy__orderby');
function uh_service_type_taxonomy__orderby( $term_query ) {
  global $pagenow;
  if(!is_admin()) {
    return $term_query;
  }
  // WP_Term_Query does not define a get() or a set() method so the query_vars member must
  // be manipulated directly
  if(is_admin() && $pagenow == 'edit-tags.php' && $term_query->query_vars['taxonomy'][0] == 'uh_service_type_taxonomy' && (!isset($_GET['orderby']) || $_GET['orderby'] == 'term_order')) {
    // set orderby to the named clause in the meta_query
    $term_query->query_vars['orderby'] = 'order_clause';
    $term_query->query_vars['order'] = isset($_GET['order']) ? $_GET['order'] : "DESC";
    // the OR relation and the NOT EXISTS clause allow for terms without a meta_value at all
    $args = array('relation' => 'OR',
      'order_clause' => array(
        'key' => 'taxonomy_term_order',
        'type' => 'NUMERIC'
      ),
      array(
        'key' => 'taxonomy_term_order',
        'compare' => 'NOT EXISTS'
      )
    );
    $term_query->meta_query = new WP_Meta_Query( $args );
  }
  return $term_query;
}
1
Joel Stransky

Un champ personnalisé est une métadonnée de publication personnalisée créée par l'utilisateur ou un thème/plug-in. Dans ce cas, ce champ personnalisé s'appelle yesno.

Pour ajouter une colonne à des publications ou à des types de publication personnalisés (myposttype):

add_filter('manage_edit-myposttype_columns', 'my_custom_columns');
function my_custom_columns($columns) {
    $columns['yesno'] = 'Yes/No';
    return $columns;
}

Voici comment rendre la colonne nouvellement ajoutée triable:

add_filter('manage_edit-myposttype_sortable_columns', 'my_sortable_columns');
function my_sortable_columns($columns)
{
    $columns['yesno'] = 'yesno';
    return $columns;
}

Et voici comment vous le triez

add_action('pre_get_posts', 'sort_my_posts');
function sort_my_posts($query)
{
    if (!is_admin())
        return;
    $orderby = $query->get('orderby');
    if ($orderby == 'yesno') {
        $query->set('meta_key', 'yesno');
        $query->set('orderby', 'yesno');
    }
}

Et il les triera par ordre croissant ou décroissant pour les valeurs Oui ou Non qui sont enregistrées dans les métadonnées.

Est-ce ce que vous cherchiez?

0
aifrim

pour moi, j'ai fait une taxonomie personnalisée et dans cette taxonomie, j'avais une méta personnalisée. Je voulais avoir dans le backend d'administration une colonne et la rendre triable. 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

Il me suffisait d'adapter la réponse fournie dans les commentaires de @ eherman24

0
Lucas Gabriel