Como classificar postagens de postagem personalizadas na ordem padrão por vários campos?

Estou com um sem fins lucrativos que pagou pelo desenvolvimento de um plugin de tipo de postagem personalizado que nos ajudará a rastrear plantas ameaçadas que estamos mantendo no cultivo, resgatadas do desenvolvimento. Estamos principalmente felizes com isso, mas precisamos de um pouco de ajuda. Nosso plugin é chamado nasc_report e temos vários “autores” que estão gerando relatórios. As plantas são atendidas ao longo do tempo, então, a cada ano, pedimos um recenseamento. Então, eu gostaria que a ordem de sorting padrão fosse governada primeiro pelo autor (as postagens de cada autor serão agrupadas) e, em seguida, por nasc_population_code (A a Z), e depois por data (mais recente na parte superior). Isso produzirá pequenos grupos de nosso material vegetal cultivado por código de população, mas separá-los pelo autor.

(Paralelamente, nossos produtores recebem um papel separado que só permite que eles vejam suas próprias inputs – todas as inputs são privadas -, mas os administradores, infelizmente, vêem tudo e não podem ocultar tudo, exceto os seus próprios, os administradores também são geralmente produtores. sobre isso seria bem-vindo também. Se pudéssemos permitir aos administradores as opções: “Todos | Privado | Mina” e fazer “Mina” a canvas padrão, então eu só precisaria padronizar por nasc_population_code e depois por data.)

Eu procurei, mas não encontrei uma resposta direta à minha pergunta ou, se eu tiver, não consegui entender muito bem. Eu usaria pre_get_posts? Estou apenas um pouco perdido no código, aqui. Qualquer ajuda seria apreciada.

Solutions Collecting From Web of "Como classificar postagens de postagem personalizadas na ordem padrão por vários campos?"

Como acabei de escrever uma resposta pre_get_posts para outra pessoa, vou modificá-la levemente e ver se ela funciona para você também.

Ao usar pre_get_posts a variável $ query é passada “por referência”, o que significa que podemos manipular diretamente o object $query com as funções de atalho, como set_query_var . Remova o código de consulta do seu modelo de taxonomia e tente o seguinte em suas funções.php:

 function wpa_66507( $query ) { if ( is_post_type_archive('nasc_report ') && is_main_query() ) { //where 'nasc_report' is assumed to be your post type name set_query_var( 'orderby', 'author meta_value date' ); set_query_var( 'meta_key', 'nasc_population_code' ); } } add_action( 'pre_get_posts', 'wpa_66507' ); 

Espero que isto ajude. Estou um pouco confuso em ordens de sorting (especialmente se eles podem ser misturados ) e acho que você pode precisar definir o parâmetro posts_per_page como -1 se desejar mostrar todas as suas postagens em uma única página sem paginação.

EDITAR # 1:

Examinei isso de novo e testei algumas postagens da amostra. Classifica por:

  1. Nome de exibição do autor do autor (em vez do ID do autor) – ascendente
  2. Post meta key nasc_population_code – ascendente
  3. Data de publicação – descendente

Para fazer isso, não podemos mais usar os pre_get_posts relativamente simples e ter que fazer mais SQL personalizados. Peço desculpas antecipadamente que não poderei explicar isso incrivelmente bem porque meu próprio entendimento é limitado. WordPress tem um monte de outros filtros que permitem ajustar a consulta SQL real que o WordPress pretende executar no database para recuperar suas postagens. Os que eu estou usando aqui são:

  1. posts_join – em geral, isso vincula outras tabelas à tabela wp_posts
  2. posts_orderby – isso controla o pedido
  3. post_limits – isso controla quantos posts recuperar

As inputs do Codex são, com certeza, um pouco finas e acho que elas são um tanto confusas.

editar: Esta solução também pressupõe que você tenha uma meta-chave (campo personalizado, praticamente a mesma diferença) chamado nasc_population_code .

Então, colocando tudo junto, experimente:

 add_filter('posts_join', 'wpa_66507_join'); function wpa_66507_join( $join ) { if ( ! is_admin() && is_post_type_archive('nasc_report') && is_main_query() ) { global $wpdb; // join the users table so we can sort by author name $join .= " LEFT JOIN $wpdb->users AS author ON ( {$wpdb->posts}.post_author = author.id )"; // join the postmeta table so we can sort by meta key $join .= " LEFT JOIN $wpdb->postmeta AS nasc_population_code ON ( {$wpdb->posts}.ID = nasc_population_code.post_id AND nasc_population_code.meta_key = 'nasc_population_code' )"; } return $join; } add_filter('posts_orderby', 'wpa_66507_orderby'); function wpa_66507_orderby($orderby_statement) { if ( ! is_admin() && is_post_type_archive('nasc_report') && is_main_query() ) { global $wpdb; $orderby_statement = "author.display_name ASC, nasc_population_code.meta_value ASC"; } return $orderby_statement; } add_filter('post_limits', 'wpa_66507_limits'); function wpa_66507_limits($limits) { if ( ! is_admin() && is_post_type_archive('nasc_report') && is_main_query() ) { $limits = ""; } return $limits; }