¿Cómo filtrar el listado de publicaciones (en el listado de publicaciones del panel de WP) usando un campo personalizado (funcionalidad de búsqueda)?

37

A pesar de que busqué mucho en Google, no he encontrado la respuesta a una pregunta muy simple:

Tengo algunas publicaciones con un campo personalizado (es decir, nombre_proveedor). Me gustaría poder buscar y filtrar mis publicaciones de acuerdo con este campo personalizado. En otras palabras, en la lista de publicaciones de administración, me gustaría tener un cuadro de búsqueda (llamado "Nombre del proveedor") donde puedo escribir un valor (por ejemplo, "IBM") y luego, hacer clic en un botón de búsqueda que dará Regrese todas las publicaciones que tengan un campo personalizado llamado "nombre_proveedor" y, de ser así, el valor del campo personalizado será "IBM".

Cómo puedo hacer esto ?

jean04
fuente

Respuestas:

44

Codifiqué un complemento solo para eso y nunca pude publicarlo:

ingrese la descripción de la imagen aquí

Uso:

En el menú desplegable, tiene una lista de todos los campos personalizados, así que simplemente seleccione el campo por el que desea filtrar y haga clic en filtrar. si desea filtrar a un valor específico de un campo personalizado, seleccione el nombre del campo, ingrese el valor que desea y haga clic en filtrar.

<?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
fuente
77
¿Por qué no utilizar la función de ayuda para su cuadro de selección? es decir. reemplazar $field[0] == $current? ' selected="selected"':'', con selected( $field[0] == $current, true, false ),... :)
t31os
Esta respuesta ya no funciona.
Kir Mazur
¿Hay alguna manera de hacerlo funcionar en las versiones más recientes de WordPress?
nakkeru