Cómo ordenar el área de administración de WordPress tipo de envío personalizado por un campo personalizado

wordpress.stackexchange https://wordpress.stackexchange.com/questions/45

  •  16-10-2019
  •  | 
  •  

Pregunta

Durante la edición de una de mis tipos de envíos personalizados Quiero ser capaz de enumerar todas las entradas por un campo personalizado en lugar de la fecha de su publicación (que, para un tipo de envío personalizado probablemente no es relevante). Tengo una pista a partir de los comentarios de un post sobre tipos de envíos personalizados y el autor dijo que era posible y que incluso lo hizo por lo que podría hacer clic en los nombres de columna para una ordenación personalizada. Se refirió a la href="http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby"> posts_orderby función la que he señalado en mis propios comentarios, pero ahora se puede encontrar la entrada de blog más. ¿Alguna sugerencia? Vi una solución que utiliza

add_action('wp', 'check_page');

Y la función check_page utilizado add_filter para cambiar la consulta, pero estoy bastante seguro de que sólo funcionaría en el tema archivos, no en el área de administración.

¿Fue útil?

Solución

Como podrán imaginar por la falta de respuestas proporcionadas, la solución no es exactamente trivial. Lo que he hecho es crear un ejemplo un tanto auto-contenido que asume un tipo de envío personalizado de "movie" y la clave del campo personalizado " Género ".

Aviso Legal . Esto funciona con WP3.0, pero no puedo estar seguro de que funcionará con versiones anteriores

Es, básicamente, tiene que conectar dos (2) ganchos para hacer que funcione, y otros dos (2) para que sea obvia y útil.

El primer gancho es 'restrict_manage_posts' que le permite emitir una <select> HTML en la zona superior de la lista de puestos donde los " Acciones en Bloque " y " Mostrar fechas " filtros. El código proporcionado generará el " Ordenar por: " funcionalidad como se ve en esta pantalla fragmento:

Cómo crear Ordenar por funcionalidad para un tipo de mensaje personalizado en la administración de WordPress
(fuente: mikeschinkel.com )

El código utiliza SQL directa, ya que no es una función de la API de WordPress para proporcionar la lista de todos meta_keys por unos tipos de correos (suena como un futuro trac boleto para mí ...) de todos modos, aquí está el código. Tenga en cuenta que se agarra el tipo de puesto de $_GET y valida para asegurarse de que es a la vez un post_type_exists() tipo de mensaje válido, además de ser un tipo de post movie (esos dos cheques son una exageración, pero lo hice para mostrar cómo si no desea . para codificar el tipo de correos) por último uso el parámetro URL sortby ya que no entre en conflicto con cualquier 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 necesario es utilizar el gancho parse_query que se llama después de WordPress uno decide lo que se debe ejecutar la consulta, pero antes de que se ejecuta la consulta. Aquí se llega a valores establecidos de orderby y meta_key en orden query_var de la consulta que son documentado en el Códice en el parámetro orderby para query_posts(). Ponemos a prueba para asegurarse de que:

  1. Estamos en el admin (is_admin()),
  2. Estamos en la página que muestra los mensajes de la parte administrativa ($pagenow=='edit.php'),
  3. La página ha sido llamada con un parámetro de URL post_type igual a movie, y
  4. La página también ha sido llamada con un parámetro de URL sortby y que no se ha superado un valor de " Ninguno

Si todas estas pruebas pasan entonces establecemos el query_vars (como se documenta aquí ) a meta_value y nuestro valor para sortby ' 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 tiene que hacer; sin ganchos "posts_order" "wp" o requeridos! Por supuesto usted hace realmente necesidad de hacer más; es necesario agregar algunas columnas en su página que enumera los mensajes, porque se puede ver los valores que se está clasificando por lo contrario los usuarios se confundirán Mucho. Así que añadir un gancho manage_{$post_type}_posts_columns, en este caso manage_movie_posts_columns. Este gancho se pasa la matriz por defecto de columnas y por simplicidad acabo reemplazó con dos columnas estándar; una casilla de verificación (cb) y un nombre de post (title). (Puede inspeccionar posts_columns con un print_r() para ver lo que hay disponible de forma predeterminada.)

I decidió añadir un " por: Tiempo " para cuando hay un parámetro de URL sortby y cuando no se 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 realmente el valor cuando hay un puesto del tipo de mensaje apropiado y con la prueba probablemente redundante para is_admin() y $pagenow=='edit.php'. Cuando hay un parámetro de URL sortby extraemos el valor del campo a medida que se ordenan mediante una pantalla en nuestra lista. Esto es lo que parece (recuerda, esto es por lo que los datos de prueba no hay comentarios de la galería de maní en las clasificaciones de películas:!):

Columnas personalizadas añaden para una de un tipo de mensaje en la administración de WordPress
(fuente: mikeschinkel.com )

Y aquí está el código:

add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_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') {
                    echo get_post_meta($post_id,$_GET['sortby'],true);
                }
                break;
        }
    }
}

Tenga en cuenta que esto sólo se recoge el primer " Género " para un movie, es decir, el primer meta_value en el caso de varios valores para una clave dada. Pero, de nuevo no estoy seguro de cómo funcionaría de otra manera!

Y para los que no conocen dónde poner este código se puede poner en un plugin o más probablemente para el principiante en el archivo functions.php en su tema actual.

¿Cómo esto ayuda.

Otros consejos

A partir de WordPress 3.1 (estoy usando la versión beta) columnas puede ser ahora pueden ordenar a través de sus títulos.

La siguiente detalles de la publicación de cómo ponerlas en práctica.

http://scribu.net/wordpress/custom-sortable-columns.html

Aquí hay una solución simple:

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

Sólo reemplace SU POSTERIOR TIPO y 'your_custom_field'

Licenciado bajo: CC-BY-SA con atribución
scroll top