Adicione o menu de filtro à lista administrativa de postagens (do tipo personalizado) para filtrar postagens por valores de campos personalizados


45

Esta resposta está muito próxima do que pretendo fazer, mas, em vez disso, gostaria de especificar um campo personalizado específico e exibir um menu de seleção de seus valores disponíveis. Obrigado!


1
@soulseekah não é legal pedir orientações antes de tentar coisas?
frnhr

Respostas:


73

Simples de fazer, primeiro crie o menu suspenso com apenas os valores meta que você deseja e, em seguida, pegue o envio do filtro, basta mudar POST_TYPEpara o nome do seu tipo de postagem e META_KEYo nome da sua meta-chave:

<?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! Estou tendo problemas para que isso apareça na minha página de postagem do tipo custtom (type = contestentry). Você poderia verificar o meu código functions.php, por favor? Isso é retirado de um plug-in existente? pastebin.com/BJMua8nq
adam5280

Você não alterou o POST_TYPEaqui, tente o seguinte: pastebin.com/tabUfh3Y
Bainternet 13/03/2012

Trabalho! Obrigado @Bainternet! O $ type = 'post'; na linha 65 teve que ser mudada também. Obrigado novamente!
adam5280

:) O único que você não precisou mudar, está lá por padrão, mas tudo bem também.
Bainternet 13/03/12

2
Esta resposta funciona muito bem no WordPress 4.9.5! É envelhecido muito bem, obrigado!
Davey

2

Se você estiver usando outra consulta dentro, restrict_manage_postscertifique-se de adicionar && $query->is_main_query()à sua instrução parse_query if, caso contrário, o filtro parse_query interferirá na 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

Se você precisar adicionar muitos campos, precisará adicionar à consulta

$query->query_vars['meta_query'][] = array(
    'key'     => 'KEY',
    'value'   => $_GET['FIELD'],
    'compare' => 'LIKE'
);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.