Como ordenar a área de administração de um tipo de postagem personalizada do WordPress por um campo personalizado

51

Ao editar um dos meus tipos de postagem personalizados, desejo listar todas as entradas por um campo personalizado, em vez da data em que são publicadas (o que, para um tipo de postagem personalizado, provavelmente não é relevante). Eu recebi uma pista dos comentários de uma postagem no blog sobre tipos de postagens personalizadas e o autor disse que era possível e que ele até fez isso para que você pudesse clicar nos nomes das colunas para uma classificação personalizada. Ele mencionou a função posts_orderby que notei em meus próprios comentários, mas agora posso encontrar a postagem do blog mais. Alguma sugestão? Eu vi uma solução que usou

add_action('wp', 'check_page');

E a função check_page usou add_filter para alterar a consulta, mas tenho certeza de que seria apenas trabalhar nos arquivos de tema, não na área de administração.

    
por tooshel 11.08.2010 / 22:16
fonte

3 respostas

65

Como você provavelmente pode imaginar pela falta de respostas fornecidas, a solução não é exatamente trivial. O que eu fiz foi criar um exemplo um tanto auto-contido que assume um tipo de postagem personalizada de " movie " e uma chave de campo personalizado de " Gênero ".

Disclaimer : isso funciona com o WP3.0, mas não posso ter certeza de que funcionará com versões anteriores.

Você basicamente precisa enganchar dois (2) ganchos para fazê-lo funcionar e outros dois (2) para torná-lo óbvio e útil.

O primeiro gancho é ' restrict_manage_posts ', que permite emitir um HTML <select> na área acima da lista de postagens em que as "Ações em massa " e " Mostrar datas "filtros. O código fornecido gerará a funcionalidade " Classificar por: " conforme visto neste snippet de tela:

OcódigousaSQLdiretoporquenãoháumafunçãodaAPIdoWordPressparaforneceralistadetodasasmeta_keysparaostiposdepostagem(pareceumfuturo trac bilhete para mim ...) Enfim, aqui está o código. Observe que ele pega o tipo de postagem de $_GET e valida para garantir que seja um tipo de postagem válido post_type_exists() , além de ser um tipo movie post (essas duas verificações são exageradas, mas eu fiz isso para mostrar a você como se você não quiser codificar o tipo de postagem.) Por fim, uso o parâmetro sortby URL, pois ele não entra em conflito com mais nada no WordPress:

add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
    if (isset($_GET['post_type'])) {
        $post_type = $_GET['post_type'];
        if (post_type_exists($post_type) && $post_type=='movie') {
            global $wpdb;
            $sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
            $results = $wpdb->get_results($sql);
            $html = array();
            $html[] = "<select id=\"sortby\" name=\"sortby\">";
            $html[] = "<option value=\"None\">No Sort</option>";
            $this_sort = $_GET['sortby'];
            foreach($results as $meta_key) {
                $default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
                $value = esc_attr($meta_key->meta_key);
                $html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
            }
            $html[] = "</select>";
            echo "Sort by: " . implode("\n",$html);
        }
    }
}

A segunda etapa obrigatória é usar o gancho parse_query chamado após o WordPress decidir qual consulta deve ser executada, mas antes de executar a consulta. Aqui, podemos definir valores de orderby e meta_key na matriz query_var da consulta, que são documentados no Codex no parâmetro orderby para query_posts() . Nós testamos para garantir que:

  1. Estamos no admin ( is_admin() ),
  2. Estamos na página que lista as postagens no administrador ( $pagenow=='edit.php' ),
  3. A página foi chamada com um parâmetro post_type URL igual a movie e
  4. A página também foi chamada com um parâmetro sortby URL e não foi passado um valor de ' Nenhum '

Se todos esses testes forem aprovados, definiremos o query_vars (como documentado aqui ) para meta_value e nosso valor sortby para ' Gênero ':

add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
    global $pagenow;
    if (is_admin() && $pagenow=='edit.php' &&
        isset($_GET['post_type']) && $_GET['post_type']=='movie' && 
        isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
        $query->query_vars['orderby'] = 'meta_value';
        $query->query_vars['meta_key'] = $_GET['sortby'];
    }
}

E isso é tudo que você precisa fazer; não são necessários ganchos " posts_order " ou " wp "! Claro que você realmente precisa fazer mais; você precisa adicionar algumas colunas na sua página que lista as postagens para que você possa realmente ver os valores que está classificando, caso contrário os usuários ficarão muito confusos. Portanto, adicione um manage_{$post_type}_posts_columns hook, neste caso manage_movie_posts_columns . Esse gancho é passado na matriz padrão de colunas e, para simplificar, eu o substituí por duas colunas padrão; uma caixa de seleção ( cb ) e um nome de postagem ( title ). (Você pode inspecionar posts_columns com print_r() para ver o que mais está disponível por padrão).

Eu decidi adicionar um " Classificado por: " para quando houver um parâmetro sortby URL e quando não for None :

add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
    $posts_columns = array(
        'cb' => $posts_columns['cb'],
        'title' => 'Movie Name',
        );
    if (isset($_GET['sortby']) && $_GET['sortby'] !='None') 
        $posts_columns['meta_value'] = 'Sorted By';

    return $posts_columns;
}

Por fim, usamos o gancho manage_pages_custom_column para realmente exibir o valor quando há uma postagem do tipo de postagem apropriado e com o teste provavelmente redundante para is_admin() e $pagenow=='edit.php' . Quando há um parâmetro sortby URL extraímos o valor do campo personalizado que está sendo classificado por um display em nossa lista. Aqui está o que parece (lembre-se, este é o teste de dados, portanto, nenhum comentário da galeria de amendoim nas classificações do filme!:):

Eaquiestáocódigo:

add_action('manage_pages_custom_column','manage_movie_pages_custom_column',10,2);functionmanage_movie_pages_custom_column($column_name,$post_id){global$pagenow;$post=get_post($post_id);if($post->post_type=='movie'&&is_admin()&&$pagenow=='edit.php'){switch($column_name){case'meta_value':if(isset($_GET['sortby'])&&$_GET['sortby']!='None'){echoget_post_meta($post_id,$_GET['sortby'],true);}break;}}}

Observequeissosópegaoprimeiro" Gênero " para um movie , ou seja, o primeiro meta_value no caso de vários valores para uma determinada chave. Mas, novamente, não sei como funcionaria de outra maneira!

E para aqueles que não estão familiarizados com onde colocar esse código, você pode colocá-lo em um plug-in ou mais provavelmente para o novato no arquivo functions.php em seu tema atual.

Como isso ajuda.

    
por MikeSchinkel 12.08.2010 / 03:13
fonte
8

A partir do WordPress 3.1 (estou usando a versão beta), as colunas agora podem ser classificadas por meio de seus títulos.

A postagem a seguir detalha como implementá-los.

enlace

    
por Leo Plaw 12.12.2010 / 13:23
fonte
-1

Aqui está uma solução simples:

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

Basta substituir SEU TIPO DE POST e 'your_custom_field'

    
por jake 16.05.2016 / 14:57
fonte