Dodaj menu filtrów do administracyjnej listy postów (typu niestandardowego), aby filtrować posty według niestandardowych wartości pól


45

Ta odpowiedź jest bardzo zbliżona do tego, co chcę zrobić, ale zamiast tego chciałbym określić konkretne pole niestandardowe i wyświetlić menu wyboru dostępnych wartości. Dzięki!


1
@soulseekah nie ma prawa pytać o drogę przed wypróbowaniem rzeczy?
frnhr

Odpowiedzi:


73

Proste, najpierw utwórz listę rozwijaną, używając tylko wybranych wartości meta, a następnie przechwyć przesłanie filtra, po prostu zmień POST_TYPEnazwę typu swojego posta i META_KEYnazwę swojego klucza meta:

<?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'];
    }
}

Doskonały! Mam problem z wyświetleniem tego na mojej stronie postu typu custtom (typ = konkursowy). Czy możesz sprawdzić mój kod funkcji.php? Czy to pochodzi z istniejącej wtyczki? pastebin.com/BJMua8nq
adam5280

Nie zmieniłeś POST_TYPEtutaj, spróbuj tego: pastebin.com/tabUfh3Y
Bainternet

Pracuje! Dzięki @Bainternet! $ Type = 'post'; linia 65 również musiała zostać zmieniona. Dzięki jeszcze raz!
adam5280

:) Jedyny, którego nie musiałeś zmieniać, jest domyślnie, ale to też OK.
Bainternet,

2
Ta odpowiedź działa na WordPress 4.9.5! Starzeją się bardzo ładnie, dziękuję!
Davey,

2

Jeśli używasz innego zapytania wewnątrz, restrict_manage_postsupewnij się, że dodajesz && $query->is_main_query()do instrukcji parse_query if, w przeciwnym razie filtr parse_query zakłóci to drugie zapytanie.

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

Jeśli musisz dodać wiele pól, musisz dodać do zapytania

$query->query_vars['meta_query'][] = array(
    'key'     => 'KEY',
    'value'   => $_GET['FIELD'],
    'compare' => 'LIKE'
);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.