Come filtrare l'elenco dei post (nell'elenco dei post del dashboard di WP) utilizzando un campo personalizzato (funzionalità di ricerca)?


37

Nonostante abbia cercato su Google molto, non ho trovato la risposta a una domanda molto semplice:

Ho alcuni post con un campo personalizzato (ad esempio nome_fornitore). Vorrei poter cercare e filtrare i miei post in base a questo campo personalizzato. In altre parole, nell'elenco dei post di amministrazione, vorrei avere una casella di ricerca (denominata "Nome fornitore") in cui posso digitare un valore (es. "IBM") e quindi fare clic su un pulsante di ricerca che fornirà indietro tutti i post che dispongono di un campo personalizzato denominato "nome_produttore" e, in tal caso, il valore del campo personalizzato sarà "IBM".

Come posso fare questo ?

Risposte:


44

Ho codificato un plug-in proprio per questo e non sono mai riuscito a pubblicarlo:

inserisci qui la descrizione dell'immagine

Uso:

Nel menu a discesa hai un elenco di tutti i campi personalizzati, quindi seleziona il campo in base al quale desideri filtrare e fai clic su filtro. se si desidera filtrare su un valore specifico di un campo personalizzato, selezionare il nome del campo, immettere il valore desiderato e fare clic su 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
}

7
Perché non utilizzare la funzione di aiuto per la casella di selezione? vale a dire. sostituire $field[0] == $current? ' selected="selected"':'', con selected( $field[0] == $current, true, false ),... :)
t31os

questa risposta non funziona più.
Kir Mazur,

C'è un modo per farlo funzionare nelle ultime versioni di WordPress?
nakkeru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.