Hinzufügen eines Filtermenüs zur Administratorliste von Posts (benutzerdefinierten Typs), um Posts nach benutzerdefinierten Feldwerten zu filtern


45

Diese Antwort entspricht sehr genau dem, was ich tun möchte. Stattdessen möchte ich ein bestimmtes benutzerdefiniertes Feld angeben und ein Auswahlmenü der verfügbaren Werte anzeigen. Vielen Dank!


1
@soulseekah Ist es nicht legal, vor dem Ausprobieren nach dem Weg zu fragen?
14.

Antworten:


73

Erstellen Sie einfach das Dropdown-Menü mit den gewünschten Meta-Werten, und fangen Sie dann die Übermittlung des Filters ab. Ändern Sie einfach POST_TYPEden Namen Ihres Beitragstyps und META_KEYden Namen Ihres Metaschlüssels:

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

Ausgezeichnet! Ich habe Probleme damit, dass dies auf meiner benutzerdefinierten Post-Seite erscheint (type = contestentry). Könnten Sie bitte meinen functions.php Code überprüfen? Wird dies von einem vorhandenen Plugin übernommen? pastebin.com/BJMua8nq
adam5280

Sie änderte sich nicht die POST_TYPEhier versuchen , dieses: pastebin.com/tabUfh3Y
Bainternet

Funktioniert! Vielen Dank @Bainternet! Der $ type = 'post'; on line 65 musste ebenfalls geändert werden. Danke noch einmal!
Adam5280

:) Die einzige, die du nicht ändern musstest, ist standardmäßig vorhanden, aber das ist auch in Ordnung.
Bainternet

2
Diese Antwort ist ein Genuss für WordPress 4.9.5! Es ist sehr schön gealtert, danke!
Davey

2

Wenn Sie eine andere Abfrage verwenden, restrict_manage_postsstellen Sie sicher, dass Sie die && $query->is_main_query()Anweisung parse_query if ergänzen , da sonst der Filter parse_query die zweite Abfrage beeinträchtigt.

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

Wenn Sie viele Felder hinzufügen müssen, müssen Sie zur Abfrage hinzufügen

$query->query_vars['meta_query'][] = array(
    'key'     => 'KEY',
    'value'   => $_GET['FIELD'],
    'compare' => 'LIKE'
);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.