La acción restrict_manage_posts activa la add_extra_tablenav()
función, que es cómo agrega menús desplegables adicionales a la tabla de lista deseada.
En el siguiente ejemplo, primero nos aseguramos de que el Tipo de publicación sea correcto, y luego tomamos todos los valores de DB almacenados contra la competition_name
clave en la postmeta
tabla (debe cambiar el nombre de la clave según sea necesario). La consulta es bastante básica y solo verifica si la Competencia está publicada, solo toma valores únicos (no desea duplicación en el menú desplegable) y luego los ordena alfabéticamente.
A continuación, verificamos los resultados (no hay ningún punto que muestre el menú desplegable para nada), y luego construimos las opciones (incluido un defualt para mostrar todo). Finalmente, se muestra el menú desplegable.
Como se indicó en mi comentario, este no es el final de la historia; necesitará algo de lógica para decirle a la Tabla de lista que solo muestre los resultados deseados cuando el filtro esté activo, pero lo dejaré que lo vea y luego comience otra pregunta si necesita más ayuda. Sugerencia : revise el archivo /wp-admin/includes/class-wp-posts-list-table.php
, y es padre.../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
gancho de acción para agregar cuadros desplegables adicionales. Sin embargo, no olvide que también tendría que agregar algo de lógica para el filtro, ya que WP no sabrá qué hacer con él fuera de la caja (a diferencia de las listas desplegables de taxonomía, que puede manejar automáticamente).