web-dev-qa-db-fra.com

Comment filtrer la liste de publication (en WP tableau de bord affiche une liste) en utilisant un champ personnalisé (fonctionnalité de recherche)?

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é (c'est-à-dire 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 ?

37
jean04

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

enter image description here

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
}
45
Bainternet