Comment filtrer la liste des publications (dans la liste des publications du tableau de bord WP) à l'aide d'un champ personnalisé (fonctionnalité de recherche)?

37

Malgré le fait que je googlé beaucoup, je n'ai pas trouvé de réponse à une question très simple:

J'ai des publications avec un champ personnalisé (nom_fournisseur). J'aimerais pouvoir rechercher et filtrer mes articles en fonction de ce champ personnalisé. En d'autres termes, dans la liste des publications de l'administrateur, j'aimerais disposer d'un champ de recherche (nommé "nom du fournisseur") dans lequel je peux saisir une valeur (par exemple, "IBM"), puis cliquer sur un bouton de recherche qui vous indiquera: toutes les publications qui ont un champ personnalisé nommé "nom_fournisseur" et, dans ce cas, la valeur du champ personnalisé sera "IBM".

Comment puis-je faire ceci ?

jean04
la source

Réponses:

44

J'ai codé un plugin juste pour ça et je n'ai jamais réussi à le publier:

entrez la description de l'image ici

Usage:

Dans le menu déroulant, vous avez une liste de tous les champs personnalisés. Il vous suffit donc de sélectionner le champ que vous souhaitez filtrer et de cliquer sur Filtrer. Si vous souhaitez filtrer une valeur spécifique d'un champ personnalisé, sélectionnez le nom du champ, entrez la valeur souhaitée et cliquez sur Filtrer.

<?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
la source
7
Pourquoi ne pas utiliser la fonction d'assistance pour votre boîte de sélection? c'est à dire. remplacer $field[0] == $current? ' selected="selected"':'', par selected( $field[0] == $current, true, false ),... :)
t31os
cette réponse ne fonctionne plus.
Kir Mazur
Y at-il un moyen de le faire fonctionner dans les dernières versions de WordPress?
Nakkeru