Como filtrar a listagem de postagens (na lista de postagens do painel do WP) usando um campo personalizado (funcionalidade de pesquisa)?

37

Apesar de ter pesquisado muito no Google, não encontrei a resposta para uma pergunta muito simples:

Tenho algumas postagens com um campo personalizado (ou seja, supplier_name). Gostaria de poder pesquisar e filtrar minhas postagens de acordo com este campo personalizado. Em outras palavras, na lista de postagens de administrador, eu gostaria de ter uma caixa de pesquisa (denominada "Nome do fornecedor") na qual possa digitar um valor (por exemplo, "IBM") e, em seguida, clique em um botão de pesquisa que fornecerá devolva todas as postagens que possuem um campo customizado chamado "supplier_name" e, se houver, o valor do campo customizado será "IBM".

Como posso fazer isso ?

jean04
fonte

Respostas:

44

Eu codifiquei um plugin apenas para isso e nunca consegui publicá-lo:

insira a descrição da imagem aqui

Uso:

No menu suspenso, você tem uma lista de todos os campos personalizados; basta selecionar o campo que deseja filtrar e clicar em filtro. se você deseja filtrar para um valor específico de um campo personalizado, selecione o nome do campo, insira o valor desejado e clique em filtro.

<?php
/*
Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: Filter posts or pages in admin by custom fields (post meta)
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/



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
}
Bainternet
fonte
7
Por que não usar a função auxiliar para sua caixa de seleção? ie substituir $field[0] == $current? ' selected="selected"':'', por selected( $field[0] == $current, true, false ),... :)
t31os 18/07/11
esta resposta não funciona mais.
Kir Mazur
Existe uma maneira de fazê-lo funcionar nas versões mais recentes do WordPress?
Nakkeru