Como probablemente pueda imaginar por la falta de respuestas proporcionadas, la solución no es exactamente trivial. Lo que he hecho es crear un ejemplo autocontenido que asume un tipo de publicación personalizada de " movie
" y una clave de campo personalizada de " Género ".
Disclaimer : esto funciona con WP3.0 pero no puedo estar seguro de que funcionará con versiones anteriores.
Básicamente necesitas enganchar dos (2) ganchos para que funcione y otros dos (2) para que sea obvio y útil.
El primer enlace es ' restrict_manage_posts
', que le permite emitir un HTML <select>
en el área sobre la lista de publicaciones donde " Bulk Actions " y " Show Dates "filtros. El código proporcionado generará la funcionalidad " Ordenar por: " como se ve en este fragmento de pantalla:

ElcódigousaSQLdirectoporquenohayunafuncióndelaAPIdeWordPressqueproporcionelalistadetodaslasmeta_keysparauntipodepublicación(suenacomounfuturo trac boleto para mí ...) De todos modos, aquí está el código. Tenga en cuenta que toma el tipo de publicación de $_GET
y valida para asegurarse de que es tanto un tipo de publicación válido post_type_exists()
como un tipo de publicación movie
(esas dos comprobaciones son excesivas, pero lo hice para mostrarle cómo si no quieres codificar el tipo de publicación.) Finalmente, uso el parámetro sortby
URL ya que no está en conflicto con ninguna otra cosa en WordPress:
add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
if (isset($_GET['post_type'])) {
$post_type = $_GET['post_type'];
if (post_type_exists($post_type) && $post_type=='movie') {
global $wpdb;
$sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
$results = $wpdb->get_results($sql);
$html = array();
$html[] = "<select id=\"sortby\" name=\"sortby\">";
$html[] = "<option value=\"None\">No Sort</option>";
$this_sort = $_GET['sortby'];
foreach($results as $meta_key) {
$default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
$value = esc_attr($meta_key->meta_key);
$html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
}
$html[] = "</select>";
echo "Sort by: " . implode("\n",$html);
}
}
}
El segundo paso requerido es usar el gancho parse_query
que se llama después de que WordPress decida qué consulta debe ejecutarse pero antes de ejecutar la consulta. Aquí llegamos a establecer los valores de orderby
y meta_key
en la matriz query_var
de la consulta que son documentado en el Codex en el parámetro orderby
para query_posts()
. Probamos para asegurarnos de que:
- Estamos en el administrador (
is_admin()
),
- Estamos en la página que enumera las publicaciones en el administrador (
$pagenow=='edit.php'
),
- Se ha llamado a la página con un parámetro
post_type
URL igual a movie
, y
- También se ha llamado a la página con un parámetro
sortby
URL y no se pasó el valor de ' Ninguno '
Si todas esas pruebas pasan, entonces establecemos query_vars
(como se documenta aquí ) a meta_value
y nuestro valor sortby
para ' Género ':
add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
global $pagenow;
if (is_admin() && $pagenow=='edit.php' &&
isset($_GET['post_type']) && $_GET['post_type']=='movie' &&
isset($_GET['sortby']) && $_GET['sortby'] !='None') {
$query->query_vars['orderby'] = 'meta_value';
$query->query_vars['meta_key'] = $_GET['sortby'];
}
}
Y eso es todo lo que necesitas hacer; no se requieren ganchos " posts_order
" o " wp
"! Por supuesto que realmente necesitas hacer más; necesitas agregar algunas columnas en tu página que enumera las publicaciones para que puedas ver los valores que está ordenando, de lo contrario los usuarios se confundirán mucho. Así que agregue un gancho manage_{$post_type}_posts_columns
, en este caso manage_movie_posts_columns
. Este gancho pasa la matriz de columnas predeterminada y, para simplificar, simplemente lo reemplacé con dos columnas estándar; una casilla de verificación ( cb
) y un nombre de publicación ( title
). (Puedes inspeccionar posts_columns
con print_r()
para ver qué más está disponible de manera predeterminada).
Decidí agregar un " Ordenado por: " para cuando haya un parámetro sortby
URL y cuando no esté None
:
add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
$posts_columns = array(
'cb' => $posts_columns['cb'],
'title' => 'Movie Name',
);
if (isset($_GET['sortby']) && $_GET['sortby'] !='None')
$posts_columns['meta_value'] = 'Sorted By';
return $posts_columns;
}
Finalmente, usamos el gancho manage_pages_custom_column
para mostrar el valor cuando hay una publicación del tipo de publicación apropiada y con la prueba probablemente redundante para is_admin()
y $pagenow=='edit.php'
. Cuando hay un parámetro sortby
URL, extraemos el valor del campo personalizado que está ordenando y lo muestra en nuestra lista. Esto es lo que parece (recuerde, estos son datos de prueba, por lo que no hay comentarios de la galería de cacahuetes en las clasificaciones de películas):

Yaquíestáelcódigo:
add_action('manage_pages_custom_column','manage_movie_pages_custom_column',10,2);functionmanage_movie_pages_custom_column($column_name,$post_id){global$pagenow;$post=get_post($post_id);if($post->post_type=='movie'&&is_admin()&&$pagenow=='edit.php'){switch($column_name){case'meta_value':if(isset($_GET['sortby'])&&$_GET['sortby']!='None'){echoget_post_meta($post_id,$_GET['sortby'],true);}break;}}}
Tengaencuentaqueestosolorecogeelprimer" Género " para un movie
, es decir, el primer meta_valor en el caso de varios valores para una clave determinada. Pero, de nuevo, no estoy seguro de cómo funcionaría de otra manera.
Y para aquellos que no estén familiarizados con dónde colocar este código, puede colocarlo en un complemento o más probablemente para el novato en el archivo functions.php
en su tema actual.
Cómo esto ayuda.