L' action restrict_manage_posts déclenche la add_extra_tablenav()
fonction, c'est-à-dire comment vous ajoutez des listes déroulantes supplémentaires à la table de liste souhaitée.
Dans l'exemple ci-dessous, nous nous assurons d'abord que le type de publication est correct, puis nous récupérons toutes les valeurs de base de données stockées par rapport à la competition_name
clé dans la postmeta
table (vous devez modifier le nom de la clé comme requis). La requête est assez basique et vérifie uniquement si le concours est publié, ne prend que des valeurs uniques (vous ne voulez pas de duplication dans la liste déroulante), puis les classe par ordre alphabétique.
Ensuite, nous vérifions les résultats (aucun point de sortie de la liste déroulante pour rien), puis construisons les options (y compris un defualt pour tout afficher). Enfin, la liste déroulante est sortie.
Comme indiqué dans mon commentaire, ce n'est pas la fin de l'histoire cependant; vous aurez besoin d'un peu de logique pour dire au tableau de liste d'afficher uniquement les résultats souhaités lorsque le filtre est actif, mais je vous laisse y jeter un œil, puis commencer une autre question si vous avez besoin d'aide. Astuce - extraire le fichier /wp-admin/includes/class-wp-posts-list-table.php
et son parent.../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
crochet d'action pour ajouter des boîtes déroulantes supplémentaires. N'oubliez pas que vous devrez également ajouter une certaine logique au filtre, car WP ne saura pas quoi en faire dès la sortie de la boîte (contrairement aux listes déroulantes de taxonomie, qu'il peut gérer automatiquement).