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_name
Schlüssel in der postmeta
Tabelle 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.php
und 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>';
}
restrict_manage_posts
Aktions-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).