Wie filtere ich eine Beitragsliste (in der WP-Dashboard-Beitragsliste) mithilfe eines benutzerdefinierten Felds (Suchfunktion)?

37

Trotz der Tatsache, dass ich viel gegoogelt habe, habe ich keine Antwort auf eine sehr einfache Frage gefunden:

Ich habe einige Posts mit einem benutzerdefinierten Feld (dh Lieferantenname). Ich möchte in der Lage sein, meine Beiträge nach diesem benutzerdefinierten Feld zu suchen und zu filtern. Mit anderen Worten, in der Liste der Admin-Beiträge möchte ich ein Suchfeld (mit dem Namen "Lieferantenname") haben, in das ich einen Wert (z. B. "IBM") eingeben und dann auf eine Suchschaltfläche klicken kann, die angezeigt wird Senden Sie mir alle Beiträge zurück, die ein benutzerdefiniertes Feld mit dem Namen "Lieferantenname" haben. In diesem Fall lautet der Wert des benutzerdefinierten Felds "IBM".

Wie kann ich das machen ?

jean04
quelle

Antworten:

44

Ich habe ein Plugin dafür programmiert und bin nie dazu gekommen, es zu veröffentlichen:

Bildbeschreibung hier eingeben

Verwendung:

In der Dropdown-Liste finden Sie eine Liste aller benutzerdefinierten Felder. Wählen Sie also einfach das Feld aus, nach dem Sie filtern möchten, und klicken Sie auf Filter. Wenn Sie nach einem bestimmten Wert eines benutzerdefinierten Felds filtern möchten, wählen Sie den Namen des Felds aus, geben Sie den gewünschten Wert ein und klicken Sie auf Filter.

<?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
quelle
7
Warum nicht die Hilfsfunktion für Ihre Auswahlbox nutzen? dh Ersetzen $field[0] == $current? ' selected="selected"':'', durch selected( $field[0] == $current, true, false ),... :)
t31os
Diese Antwort funktioniert nicht mehr.
Kir Mazur
Gibt es eine Möglichkeit, es in den neuesten Versionen von WordPress zum Laufen zu bringen?
Nakkeru