Nach benutzerdefiniertem Feld im benutzerdefinierten Posttyp auf der Admin-Seite filtern

Ich habe Erweiterte Benutzerdefinierte Felder verwendet, um benutzerdefinierte Felder für Name des Wettbewerbs, 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 Feldern zu erstellen.

Ich versuche, eine “Filter by” -Dropdown-Box mit den verschiedenen Namen / Labels der Wettbewerbe zu erhalten, wie unten gezeigt, aber ich kann nur Lösungen finden, die Taxonomien verwenden, die ich lieber nicht verwende, wenn möglich, weil ich nur benutzerdefinierte Felder verwendet habe alles andere.

Ist es möglich, eine benutzerdefinierte Dropdown-Liste “Filtern nach” nur mit benutzerdefinierten Feldern zu erstellen?

Wordpress-Filter von

Solutions Collecting From Web of "Nach benutzerdefiniertem Feld im benutzerdefinierten Posttyp auf der Admin-Seite filtern"

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

 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 wie erforderlich. Ich habe “Wettbewerbsname als meta_key und” competition-name “als Drop-Down-Name ausgewählt.

Die Aktion restrict_manage_posts triggers die function add_extra_tablenav() aus, mit der Sie der gewünschten Listentabelle zusätzliche Dropdown-Elemente hinzufügen.

Im folgenden Beispiel stellen wir zuerst sicher, dass der Post-Typ korrekt ist, und dann greifen wir alle DB-Werte, die mit dem Schlüssel postmeta in der postmeta Tabelle gespeichert wurden, auf (Sie müssen den Schlüsselnamen wie gewünscht ändern). Die Abfrage ist ziemlich einfach und überprüft nur, ob der Wettbewerb veröffentlicht wurde, nimmt nur eindeutige Werte (du willst keine Duplizierung im Dropdown) und sortiert sie dann alphabetisch.

Als nächstes suchen wir nach Ergebnissen (keinen Punkt, der das Dropdown für nichts ausgibt), und konstruieren dann die Optionen (einschließlich einer Defaults, um alle anzuzeigen). Abschließend wird das Dropdown ausgegeben.

Wie in meinem Kommentar gesagt, ist dies jedoch nicht das Ende der Geschichte; Sie benötigen eine Logik, um der Listentabelle mitzuteilen, dass nur die gewünschten Ergebnisse angezeigt werden sollen, wenn der Filter aktiv ist. Ich überlasse es Ihnen jedoch, sich dies anzusehen und dann eine weitere Frage zu starten, falls Sie weitere Hilfe benötigen. Tipp/wp-admin/includes/class-wp-posts-list-table.php die Datei /wp-admin/includes/class-wp-posts-list-table.php , und es ist übergeordnet .../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$sp 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; /** Grab all of the options that should be shown */ $options[] = sprintf('', __('All Competitions', 'your-text-domain')); foreach($results as $result) : $options[] = sprintf('', esc_attr($result), $result); endforeach; /** Output the dropdown menu */ echo ''; }