X

Como filtrar seus posts e páginas por campo personalizado no painel do WordPress

Snippets por IsItWP

Procurando filtrar seus posts por campo personalizado no admin do WordPress? Este snippet adicionará um novo menu suspenso de campo personalizado às suas listagens de posts e páginas do WordPress. O menu exibirá uma lista de todos os campos personalizados. Para filtrar os posts e páginas, você só precisa selecionar o campo pelo qual deseja filtrar.

adicionar menu de seleção para filtrar por campo personalizado admin

Instruções:

Tudo o que você precisa fazer é adicionar este código ao arquivo functions.php do seu tema ou em um plugin específico do site:

add_filter( 'parse_query', 'ba_admin_posts_filter' );
add_action( 'restrict_manage_posts', 'ba_admin_posts_filter_restrict_manage_posts' );

function ba_admin_posts_filter( $query )
{
    global $pagenow;
    if ( is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_NAME']) && $_GET['ADMIN_FILTER_FIELD_NAME'] != '') {
        $query->query_vars['meta_key'] = $_GET['ADMIN_FILTER_FIELD_NAME'];
    if (isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '')
        $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
    }
}

function ba_admin_posts_filter_restrict_manage_posts()
{
    global $wpdb;
    $sql = 'SELECT DISTINCT meta_key FROM '.$wpdb->postmeta.' ORDER BY 1';
    $fields = $wpdb->get_results($sql, ARRAY_N);
?>
<select name="ADMIN_FILTER_FIELD_NAME">
<option value=""><?php _e('Filter By Custom Fields', 'baapf'); ?></option>
<?php
    $current = isset($_GET['ADMIN_FILTER_FIELD_NAME'])? $_GET['ADMIN_FILTER_FIELD_NAME']:'';
    $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
    foreach ($fields as $field) {
        if (substr($field[0],0,1) != "_"){
        printf
            (
                '<option value="%s"%s>%s</option>',
                $field[0],
                $field[0] == $current? ' selected="selected"':'',
                $field[0]
            );
        }
    }
?>
</select> <?php _e('Value:', 'baapf'); ?><input type="TEXT" name="ADMIN_FILTER_FIELD_VALUE" value="<?php echo $current_v; ?>" />
<?php
}

Observação: Se esta é a primeira vez que você adiciona trechos de código no WordPress, consulte nosso guia sobre como copiar/colar trechos de código corretamente no WordPress, para não quebrar acidentalmente seu site.

Se você gostou deste trecho de código, considere conferir nossos outros artigos no site, como: 62 melhores temas gratuitos de blog WordPress ou 7 melhores plugins de formulário de contato WordPress.

Comentários   Deixe uma Resposta

  1. Olá, é possível visualizar isso apenas em um certo tipo de post? Obrigado

  2. Olá, obrigado pelo código, mas infelizmente não funciona para mim. O menu suspenso de seleção aparece acima da lista de posts e tem os campos personalizados corretos, mas se eu escrever um valor – ele não exibirá nenhum resultado, mesmo que haja um número de posts que tenham esse valor nesse campo personalizado.

  3. olá, quero usar isso para posts personalizados de Usuários, como o código mudará, alguém pode me ajudar!!

  4. Ainda funcionando perfeitamente. Obrigado, ótimo snippet!

  5. Excelente. O post é um tanto antigo, mas acabei de copiar e colar o código no meu arquivo functions e funciona perfeitamente. (Ok, não "perfeitamente" em termos de exibição, mas ajustar é o meu problema! Funcionalmente parece no ponto.) [WP 4.2.2] Eu queria essa funcionalidade há tempos... e encontrá-la foi tão fácil assim que decidi realmente fazer algo a respeito. Obrigado MUITO! 🙂

  6. Salvatore Capolupo January 3, 2015 at 4:13 pm

    estava procurando algo assim. não tão fácil, e útil. obrigado 🙂

  7. Olá a todos, alguém pode me ajudar a criar uma função personalizada para ordenar posts sem plugin? Eu gostaria de incluir a capacidade de ordenar posts como páginas...

    Eu tenho um código como add_filter( ‘parse_query’, ‘my_custom_post_sort’ );

    mas eu não sei como continuar...

  8. Olá,

    Acabei de encontrar seu snippet de filtro de campo personalizado.

    É possível filtrar tags também? Alguma ideia do que preciso mudar?

    Saudações

  9. Olá, parece muito interessante mesmo...

    Mas infelizmente não é exatamente o que estou procurando há muito tempo.

    Eu realmente odeio a busca na Biblioteca de Mídia. Qual o propósito de uma busca que não consegue encontrar nenhum anexo nem por (sub)string nos NOMES DE ARQUIVO, nem por ID, as strings no ALT ou LEGENDA, CAMPOS PERSONALIZADOS, TAGS etc.. Essa capacidade de BUSCA padrão tem todo CMS menos WP. Muito estranho. Você tem alguma ideia de como adicionar algo assim à Biblioteca de Mídia “upload.php” e “media-upload.php” (janela pop-up para inserção de anexos em Página/Post)?

    Tenho medo de não conseguir fazer isso sozinho, está um pouco acima do meu conhecimento de PHP. Mas parece que você já tem o código pronto para o lançamento! De qualquer forma, este exemplo é uma inspiração para mim.
    :-))

    1. Se você não adicionar nenhuma informação ou palavra-chave aos seus registros de mídia, como você os encontrará?
      Claro que a pesquisa do WP é muito limitada, mas para a mídia funciona bem se você adicionar boas tags ALT a cada imagem 😉

      1. POR QUE adicionar aos metadados? Geralmente, NOME DE ARQUIVO, ID, Autor, etc. – todas as informações estão presentes no banco de dados. Um SQL inteligente pode retornar os dados. Sem mencionar as colunas problemáticas de ordenação ASC/DESC – quero dizer as novas colunas adicionadas através de function.php (Tamanho do Arquivo, ID, etc.) Acho que o problema é aparente.

  10. Ótimo post, obrigado!

  11. Isso é incrível.
    Existe alguma maneira de mostrar o filtro apenas em uma página de edição de tipo de post personalizado?

    Eu tentei colocar um 
    if (isset($_GET[‘post_type’]) && $_GET[‘post_type’] == ‘product’)
    no filtro, mas não parece funcionar.

  12. Excelente post, obrigado Kevin. Implementando agora nos meus sites!

    1. Legal, fico feliz em saber disso.

  13. oi kevin! bom trecho!
    mas estou tendo um problema com ele… não consigo filtrar a lista de posts do admin por múltiplos filtros.
    se eu filtrar pelo meu campo personalizado e categoria, então… ele não me traz resultados (na verdade, existem).

    o que pode estar acontecendo?

    1. Tenho certeza de que múltiplos valores seriam possíveis, apenas não é algo que eu tenha investigado, vou investigar um pouco mais a fundo e ver sobre fazer algo assim em um futuro snippet.

  14. Acabei de implementar seu código e ele funciona muito bem para o propósito declarado. Com seu código, consigo ver rapidamente quais posts têm uma entrada para um campo personalizado específico, no entanto, espero que haja uma maneira de mostrar quais posts não têm uma entrada para esse mesmo campo personalizado, para que seja mais fácil para mim voltar e adicionar a entrada ausente em vez de ter que abrir cada post individualmente para ver se ele tem dados nesse campo personalizado específico.  Qualquer ideia é muito apreciada.  Obrigado!

    1. Bem, a melhor maneira seria adicionar o valor do campo personalizado à listagem de posts do administrador, você poderia modificar este trecho para fazer algo assim.

      http://wpsnipp.com/index.php/functions-php/add-featured-thumbnail-to-admin-post-columns/

      1. Acabei encontrando um plugin chamado “Mass Custom Fields Manager” que me permitiu identificar todos os meus posts que não tinham o campo personalizado que eu queria e adicionar automaticamente o campo com um valor à minha escolha.  Eu então pude usar com sucesso sua funcionalidade para filtrar por esse novo valor.  Funciona fantasticamente.  Isso me poupou de ter que classificar manualmente quase 2.000 posts.  Obrigado!!

        1. Que bom saber que você conseguiu fazer as coisas funcionarem, 2000 posts certamente seria muito para atualizar manualmente. Sem problemas, fico feliz em poder ajudar!

  15. Bom trecho, obrigado.
    Eu vou alterá-lo para fazê-lo funcionar para a seção de páginas.

    1. Fico feliz em saber que você gostou do trecho, se você fizer alguma alteração, enviar as alterações de volta para wpsnipp.com através do nosso formulário de contribuição http://wpsnipp.com/index.php/contribute/ seria ótimo para nossos visitantes. Aproveite o trecho!

    2. Oi Finalwebsites, você alterou o código? Você pode me ajudar?

      1. Olá,
        sim, consegui fazer funcionar, experimente a função nesta página:
        http://www.finalwebsites.com/blog/wordpress/add-a-parent-pages-filter-function-your-wordpress-admin-section/

        1. Obrigado por postar a atualização do trecho,

        2. Obrigado! Mas o link está dando timeout!

  16. Kevin,

    obrigado pelo trecho. Funciona perfeitamente. Estou curioso, o 'ba' em ba_admin_posts_filter() significa blog admin?

    1. O nome da função ba_admin_posts_filter() é apenas uma função personalizada, poderia ser qualquer coisa realmente. No entanto, neste caso, o autor do trecho incluiu parte do nome de domínio dele, en.bainternet.info, como ba_

      1. Kevin, aqui está um trecho que escrevi para que o filtro possa ter curingas '%' e '_', caso alguém queira algo assim:

        function ba_admin_where_filter($where){    if (strpos($where, ‘meta_value’) !== FALSE) { $where = preg_replace(‘/(.meta_value[^=]*)=(.*)$/U’, “$1 LIKE $2″, $where);  } return $where;}add_filter( ‘posts_where_request’, ‘ba_admin_where_filter’ );FYI, se você especificar 0 como filtro, ele retorna todas as postagens. Isso é verdade para o seu código original também. Eu pensei que era porque$_GET[‘ADMIN_FILTER_FIELD_VALUE’] != ”

        avalia como falso, então eu tentei 
        strval($_GET[‘ADMIN_FILTER_FIELD_VALUE’]) != ""

        mas ainda retornou todas as postagens. Ah bem.

        1. Kevin, existe uma maneira de mostrar os campos ocultos também (ou seja, aqueles que começam com underscore)? Obrigado.

  17. Cliff Paulick July 25, 2011 at 5:31 pm

    Existe uma maneira de criar uma busca no front-end, baseada em campos personalizados ou taxonomias personalizadas?

    1. Bem, este trecho específico é para a filtragem de admin, você poderia adicionar a capacidade de o WordPress buscar campos personalizados também. No entanto, com tudo isso dito, eu daria uma olhada no plugin search everything.  http://wordpress.org/extend/plugins/search-everything/

      1. Cliff Paulick July 25, 2011 at 6:37 pm

        Sim, eu já vi esse e outros. Só queria saber se você tinha algo diferente/melhor – especialmente procurando uma maneira de sincronizar as opções de busca.
        Por exemplo: Se cidade = Tulsa, então restrinja o estado para ter apenas 1 opção = Oklahoma. Ou se você escolher Oklahoma primeiro, então mude o menu suspenso de cidades para exibir apenas cidades em Oklahoma… Então pressione “Buscar”.

        Obrigado novamente.

        1. Nada do que postei até agora, no entanto você pode adicionar seleção de categoria à busca. Eu uso essa opção na caixa de busca em wpsnipp.com, poderia configurar cidades como categorias.

          http://wpsnipp.com/index.php/cat/search-category-with-dropdown/

Adicionar um Comentário

Ficamos felizes que você escolheu deixar um comentário. Por favor, tenha em mente que todos os comentários são moderados de acordo com nossa política de privacidade, e todos os links são nofollow. NÃO use palavras-chave no campo do nome. Vamos ter uma conversa pessoal e significativa.

Checklist de Lançamento WordPress

O Checklist Definitivo para Lançamento de WordPress

Compilamos todos os itens essenciais da lista de verificação para o lançamento do seu próximo site WordPress em um e-book prático.
Sim, envie-me o eBook Gratuito!