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

37

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

Tenho algumas postagens com um campo personalizado (por exemplo, supplier_name). Gostaria de poder pesquisar e filtrar minhas postagens de acordo com esse campo personalizado. Em outras palavras, na listagem de posts admin, eu gostaria de ter uma caixa de pesquisa (chamada "Nome do Fornecedor") onde eu possa digitar um valor (ex. "IBM") e, em seguida, clicar em um botão de pesquisa me de volta todas as mensagens que têm um campo personalizado chamado "supplier_name" e, em caso afirmativo, o valor do campo personalizado será "IBM".

Como posso fazer isso?

    
por jean04 07.05.2011 / 13:41
fonte

1 resposta

45

Codifiquei um plugin apenas para isso e nunca publiquei:

Uso:

Nomenususpenso,vocêtemumalistadetodososcampospersonalizados,bastaselecionarocampopeloqualdesejafiltrareclicarem"Filtrar". Se você quiser 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
}
    
por Bainternet 07.05.2011 / 17:06
fonte