Taxonomia personalizada – coluna classificada personalizada

Eu criei taxonomia personalizada chamada ‘cidades’, onde você pode adicionar cidades e adicionou campo personalizado (botão de opção) com 2 opções: ‘Sim’ e ‘Não’ (não importa o que é isso). Everythins está bem, posso obter esse valor e outras coisas.

Mais tarde, vi uma idéia para adicionar uma coluna classificável (como ‘Nome’, ‘Slug’, ‘Postagens’, etc.). Eu consegui criar essa coluna, torná-la excitável, mas não sei como classificar essas cidades por esse campo personalizado? Agora, está classificando pelo nome, porque não posso fazê-lo funcionar com o campo personalizado.

Alguma pista / sugestão talvez?

Solutions Collecting From Web of "Taxonomia personalizada – coluna classificada personalizada"

Tive um problema semelhante e consegui resolvê-lo. No meu caso, tenho uma issue taxonomia personalizada, que contém um campo personalizado do seletor de data obrigatório usando o plugin ACF PRO – o nome do campo é issue_date . Eu queria adicionar a coluna da data à canvas de edição do issue no wp-admin/edit-tags.php?taxonomy=issue e eu queria permitir que os administradores classificassem as questões por data.

Eu tentei conectar-se a pre_get_posts como @aifrim respondido acima, mas essa ação não faz parte da consulta que é executada quando o WordPress carrega termos de taxonomia na canvas de edição. Além disso, os termos de taxonomia não possuem metadados nativos no database do WordPress, portanto, uma meta_query não funcionará porque meus metadados são armazenados em outra tabela. Uma curvatura divertida.

Passo 1: Crie a nova coluna em si, estará vazio inicialmente

 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'); 

Etapa 2: Preencha a nova coluna

 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); 

Passo 3: faça a nova coluna ser classificada

 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'); 

Passo 4: Defina a sorting personalizada (onde a magia acontece)

 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); 

Minha declaração condicional na etapa 4 também classificará a descida pelo issue_date como a sorting padrão quando não houver outro conjunto de critérios de sorting.

Espero que isso ajude alguém a procurar uma melhor experiência de administração!

Um campo personalizado é um meta-metadados personalizados feito pelo usuário ou um tema / plugin, neste caso, o campo personalizado é chamado simno.

Para adicionar uma coluna para postagens ou tipos de postagem personalizada (myposttype):

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

É assim que você faz a coluna adicionada adicionalmente classificável:

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

E é assim que você o classifica

 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'); } } 

E classificará eles asc ou desc para os valores Sim ou No que são salvos nos metadados.

É isso que você estava procurando?

Muito obrigado a @cfx por esta resposta. Agora que a WP tem suporte ao Term Meta, atualizei o Passo 4 para aproveitar isso. Esta solução toma emprestado desta resposta https://wordpress.stackexchange.com/a/246206/85388 que mostra como conectar uma meta_query a um pedido.

 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; } 

Para mim, fiz uma taxonomia personalizada e naquela taxonomia personalizada eu tinha um meta personalizado. Eu queria ter no backend administrativo uma coluna e torná-la classificável. para fazer trabalho extraável para uma taxonomia personalizada em um meta personalizado, fiz isso.

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'; } 

Encontrei a resposta neste link https://core.trac.wordpress.org/ticket/34996

Eu apenas tive que adaptar a resposta fornecida nos comentários por @ eherman24