Agregue un menú de filtro a la lista de publicaciones de administrador (de tipo personalizado) para filtrar publicaciones por valores de campo personalizados


45

Esta respuesta está muy cerca de lo que estoy buscando hacer, pero en cambio me gustaría especificar un campo personalizado específico y mostrar un menú de selección de sus valores disponibles. ¡Gracias!


1
@soulseekah no es legal pedir direcciones antes de probar cosas?
viernes

Respuestas:


73

Fácil de hacer, primero cree el menú desplegable con solo los meta valores que desee y luego capture el envío del filtro, simplemente cambie POST_TYPEel nombre de su tipo de publicación y META_KEYel nombre de su meta clave:

<?php
/*
Plugin Name: Admin Filter BY Custom Fields
Plugin URI: http://en.bainternet.info
Description: answer to http://wordpress.stackexchange.com/q/45436/2487
Version: 1.0
Author: Bainternet
Author URI: http://en.bainternet.info
*/

add_action( 'restrict_manage_posts', 'wpse45436_admin_posts_filter_restrict_manage_posts' );
/**
 * First create the dropdown
 * make sure to change POST_TYPE to the name of your custom post type
 * 
 * @author Ohad Raz
 * 
 * @return void
 */
function wpse45436_admin_posts_filter_restrict_manage_posts(){
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }

    //only add filter to post type you want
    if ('POST_TYPE' == $type){
        //change this to the list of values you want to show
        //in 'label' => 'value' format
        $values = array(
            'label' => 'value', 
            'label1' => 'value1',
            'label2' => 'value2',
        );
        ?>
        <select name="ADMIN_FILTER_FIELD_VALUE">
        <option value=""><?php _e('Filter By ', 'wose45436'); ?></option>
        <?php
            $current_v = isset($_GET['ADMIN_FILTER_FIELD_VALUE'])? $_GET['ADMIN_FILTER_FIELD_VALUE']:'';
            foreach ($values as $label => $value) {
                printf
                    (
                        '<option value="%s"%s>%s</option>',
                        $value,
                        $value == $current_v? ' selected="selected"':'',
                        $label
                    );
                }
        ?>
        </select>
        <?php
    }
}


add_filter( 'parse_query', 'wpse45436_posts_filter' );
/**
 * if submitted filter by post meta
 * 
 * make sure to change META_KEY to the actual meta key
 * and POST_TYPE to the name of your custom post type
 * @author Ohad Raz
 * @param  (wp_query object) $query
 * 
 * @return Void
 */
function wpse45436_posts_filter( $query ){
    global $pagenow;
    $type = 'post';
    if (isset($_GET['post_type'])) {
        $type = $_GET['post_type'];
    }
    if ( 'POST_TYPE' == $type && is_admin() && $pagenow=='edit.php' && isset($_GET['ADMIN_FILTER_FIELD_VALUE']) && $_GET['ADMIN_FILTER_FIELD_VALUE'] != '') {
        $query->query_vars['meta_key'] = 'META_KEY';
        $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
    }
}

¡Excelente! Estoy teniendo problemas para que esto aparezca en mi página de publicación de tipo custtom (type = contestentry). ¿Podría consultar mi código de functions.php por favor? ¿Está tomado de un complemento existente? pastebin.com/BJMua8nq
adam5280

No ha cambiado el POST_TYPEaquí intente esto: pastebin.com/tabUfh3Y
Bainternet

¡Trabajos! Gracias @Bainternet! El $ type = 'post'; en la línea 65 tuvo que ser cambiado también. ¡Gracias de nuevo!
adam5280

:) El único que no necesitaba cambiar, está allí por defecto, pero también está bien.
Bainternet

2
¡Esta respuesta funciona de maravilla en WordPress 4.9.5! Está envejecido muy bien, ¡gracias!
Davey

2

Si está utilizando otra consulta dentro, restrict_manage_postsasegúrese de agregar && $query->is_main_query()a su instrucción parse_query if, de lo contrario, el filtro parse_query interferirá con esa segunda consulta.

if ( 'POST_TYPE' == $type
      && is_admin()
      && $pagenow=='edit.php'
      && isset($_GET['ADMIN_FILTER_FIELD_VALUE'])
      && $_GET['ADMIN_FILTER_FIELD_VALUE'] != ''
      && $query->is_main_query()
) {
      $query->query_vars['meta_key'] = 'META_KEY';
      $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_VALUE'];
}

0

Si tiene que agregar muchos campos, debe agregarlos a la consulta

$query->query_vars['meta_query'][] = array(
    'key'     => 'KEY',
    'value'   => $_GET['FIELD'],
    'compare' => 'LIKE'
);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.