Filtern nach benutzerdefiniertem Feld im benutzerdefinierten Beitragstyp auf der Administrationsseite


11

Ich habe erweiterte benutzerdefinierte Felder verwendet, um benutzerdefinierte Felder für Wettbewerbsnamen, Antworten usw. zu erstellen. Ich habe einen benutzerdefinierten Beitragstyp für Wettbewerbe erstellt, wie auf dem Bild gezeigt, und ich habe Wordpress functions.php verwendet, um die Spalten aus meinen benutzerdefinierten Feldwerten zu erstellen.

Ich versuche, ein "Filter by" -Tropfenfeld mit den unten aufgeführten Namen / Bezeichnungen der Wettbewerbe zu erhalten, aber ich kann nur Lösungen mit Taxonomien finden, die ich nach Möglichkeit lieber nicht verwende , da ich nur benutzerdefinierte Felder für verwendet habe alles andere.

Ist es möglich, ein benutzerdefiniertes Dropdown-Menü "Filtern nach" nur mit benutzerdefinierten Feldern zu erstellen?

WordPress-Filter von


Sie können den restrict_manage_postsAktions-Hook verwenden, um zusätzliche Dropdown-Felder hinzuzufügen. Vergessen Sie jedoch nicht, dass Sie auch eine Logik für den Filter hinzufügen müssen, da WP nicht sofort weiß, was damit zu tun ist (im Gegensatz zu Dropdown-Listen für Taxonomie, die automatisch verarbeitet werden können).
David Gard

Als zusätzlichen Gedanken: Wenn Sie möchten, können Sie den Namen als Link in Ihre Listentabelle einfügen. Dies bedeutet, dass Sie einen Wettbewerb filtern können, indem Sie auf den Namen klicken, anstatt ein Dropdown-Menü zu haben.
David Gard

Antworten:


12

Versuchen Sie diesen Code, um das Ergebnis für Filter anzuzeigen

add_filter( 'parse_query', 'prefix_parse_filter' );
function  prefix_parse_filter($query) {
   global $pagenow;
   $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

   if ( is_admin() && 
     'competition' == $current_page &&
     'edit.php' == $pagenow && 
      isset( $_GET['competition-name'] ) && 
      $_GET['competition-name'] != '') {

    $competion_name = $_GET['competition-name'];
    $query->query_vars['meta_key'] = 'competition_name';
    $query->query_vars['meta_value'] = $competition_name;
    $query->query_vars['meta_compare'] = '=';
  }
}

Ändern Sie den Metaschlüssel und den Metawert nach Bedarf. Ich habe "Wettbewerbsname als meta_key und" Wettbewerbsname "als ausgewählten Dropdown-Namen verwendet.


Schön, ich fühlte mich faul, also schlug er vor, eine zusätzliche Frage zu stellen;)
David Gard

Die 2 Antworten scheinen eine vollständige Antwort zu sein und sollten kombiniert werden.
RCNeil

10

Die Aktion Restrict_manage_posts löst die add_extra_tablenav()Funktion aus. Auf diese Weise fügen Sie Ihrer gewünschten Listentabelle zusätzliche Dropdowns hinzu.

Im folgenden Beispiel stellen wir zunächst sicher, dass der Beitragstyp korrekt ist, und greifen dann auf alle DB-Werte zu, die für den competition_nameSchlüssel in der postmetaTabelle gespeichert sind (Sie müssen den Schlüsselnamen nach Bedarf ändern). Die Abfrage ist ziemlich einfach und prüft nur, ob der Wettbewerb veröffentlicht wurde, nimmt nur eindeutige Werte an (Sie möchten keine Duplizierung in der Dropdown-Liste) und ordnet sie dann alphabetisch an.

Als nächstes suchen wir nach Ergebnissen (es macht keinen Sinn, das Dropdown für nichts auszugeben) und konstruieren dann die Optionen (einschließlich eines Defekts, um alle anzuzeigen). Schließlich wird das Dropdown ausgegeben.

Wie in meinem Kommentar erwähnt, ist dies jedoch nicht das Ende der Geschichte. Sie benötigen eine Logik, um der Listentabelle mitzuteilen, dass Ihre gewünschten Ergebnisse nur angezeigt werden sollen, wenn der Filter aktiv ist. Ich überlasse es Ihnen jedoch, sich das anzusehen und dann eine weitere Frage zu stellen, wenn Sie weitere Unterstützung benötigen. Tipp - Überprüfen Sie die Datei /wp-admin/includes/class-wp-posts-list-table.phpund ihre übergeordnete Datei.../wp-class-list-table.php

/**
 * Add extra dropdowns to the List Tables
 *
 * @param required string $post_type    The Post Type that is being displayed
 */
add_action('restrict_manage_posts', 'add_extra_tablenav');
function add_extra_tablenav($post_type){

    global $wpdb;

    /** Ensure this is the correct Post Type*/
    if($post_type !== 'competition')
        return;

    /** Grab the results from the DB */
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type
    );
    $results = $wpdb->get_col($query);

    /** Ensure there are options to show */
    if(empty($results))
        return;

    // get selected option if there is one selected
    if (isset( $_GET['competition-name'] ) && $_GET['competition-name'] != '') {
        $selectedName = $_GET['competition-name'];
    } else {
        $selectedName = -1;
    }

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('All Competitions', 'your-text-domain'));
    foreach($results as $result) :
        if ($result == $selectedName) {
            $options[] = sprintf('<option value="%1$s" selected>%2$s</option>', esc_attr($result), $result);
        } else {
            $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
        }
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="competition-name" name="competition-name">';
    echo join("\n", $options);
    echo '</select>';

}

Wenn ich das benutze, bekomme ich den FehlerNotice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (6) for the number of arguments passed (5). Please see Debugging in WordPress for more information. (This message was added in version 4.8.3.) in /[...]/wp-includes/functions.php on line 4773
rassoh

Ich
erhalte

0

Wenn dies für niemanden funktioniert, musste meine Lösung die Spalte, nach der ich filtern wollte, zur Liste der sortierbaren Spalten für meinen benutzerdefinierten Beitragstyp hinzufügen.

// Make Custom Post Type Custom Columns Sortable
function cpt_custom_columns_sortable( $columns ) {

    // Add our columns to $columns array
    $columns['item_number'] = 'item_number';
    $columns['coat_school'] = 'coat_school'; 

    return $columns;
} add_filter( 'manage_edit-your-custom-post-type-slug_sortable_columns', 'cpt_custom_columns_sortable' );

0

Ersetzen Sie die folgende Abfrage, um die wpdb zu korrigieren: Vorbereitungsfehler:

$query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type,
        'competition_name' //this is needed a second time to define "%3$s" in ORDER BY
  );
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.