Cambiar el orden de las columnas personalizadas para editar paneles

27

Cuando registra una columna personalizada así:

//Register thumbnail column for au-gallery type
add_filter('manage_edit-au-gallery_columns', 'thumbnail_column');
function thumbnail_column($columns) {
$columns['thumbnail'] = 'Thumbnail';
return $columns;
}

por defecto aparece como el último a la derecha. ¿Cómo puedo cambiar el orden? ¿Qué sucede si quiero mostrar la columna de arriba como la primera o la segunda?

Gracias de antemano

Mirko
fuente

Respuestas:

36

Básicamente estás haciendo una pregunta PHP, pero la responderé porque está en el contexto de WordPress. Debe reconstruir la matriz de columnas, insertando su columna antes de la columna de la que desea que quede :

add_filter('manage_posts_columns', 'thumbnail_column');
function thumbnail_column($columns) {
  $new = array();
  foreach($columns as $key => $title) {
    if ($key=='author') // Put the Thumbnail column before the Author column
      $new['thumbnail'] = 'Thumbnail';
    $new[$key] = $title;
  }
  return $new;
}
MikeSchinkel
fuente
sí, supongo que sería una manera más fácil :) pero tuve la idea correcta en mi respuesta. bien pensado.
Bainternet
בניית אתרים - Casi había terminado de escribir mi respuesta cuando respondiste la tuya, así que nuestras respuestas "se cruzaron en el correo" , por así decirlo. De todos modos, me llevó un tiempo darme cuenta; ciertamente no se me ocurrió la primera vez que lo necesitaba.
MikeSchinkel
Una cosa a tener en cuenta: ¿qué sucede si otro complemento elimina la columna del autor? Su propia columna de miniaturas también desaparecería. Podrías hacer un isset($new['thumbnail'])chequeo antes de regresar $new. Si no está configurado, solo agréguelo al final, por ejemplo.
Geert
5

Si tiene complementos como WPML que agregan columnas automáticamente, incluso a tipos de publicaciones personalizadas, es posible que tenga un código complicado en el encabezado de su tabla.

No desea copiar el código a la definición de su columna. ¿Por qué alguien, para el caso?

Solo queremos ampliar las columnas predeterminadas ya proporcionadas, bien formateadas y ordenables.

De hecho, esto es solo siete líneas de código, y mantiene intactas todas las demás columnas.

# hook into manage_edit-<mycustomposttype>_columns
add_filter( 'manage_edit-mycustomposttype_columns', 'mycustomposttype_columns_definition' ) ;

# column definition. $columns is the original array from the admin interface for this posttype.
function mycustomposttype_columns_definition( $columns ) {

  # add your column key to the existing columns.
  $columns['mycolumn'] = __( 'Something different' ); 

  # now define a new order. you need to look up the column 
  # names in the HTML of the admin interface HTML of the table header. 
  #   "cb" is the "select all" checkbox.
  #   "title" is the title column.
  #   "date" is the date column.
  #   "icl_translations" comes from a plugin (in this case, WPML).
  # change the order of the names to change the order of the columns.
  $customOrder = array('cb', 'title', 'icl_translations', 'mycolumn', 'date');

  # return a new column array to wordpress.
  # order is the exactly like you set in $customOrder.
  foreach ($customOrder as $colname)
    $new[$colname] = $columns[$colname];    
  return $new;
}

espero que esto ayude..

usuario2390733
fuente
3

la única forma en que sé cómo es crear tu propia matriz de columnas

// Add to admin_init function
add_filter('manage_edit-au-gallery_columns', 'add_my_gallery_columns');

function add_my_gallery_columns($gallery_columns) {
        $new_columns['cb'] = '<input type="checkbox" />';

        $new_columns['id'] = __('ID');
        $new_columns['title'] = _x('Gallery Name', 'column name');
                // your new column somewhere good in the middle
        $new_columns['thumbnail'] = __('Thumbnail');

        $new_columns['categories'] = __('Categories');
        $new_columns['tags'] = __('Tags');
        $new_columns['date'] = _x('Date', 'column name');

        return $new_columns;
    }

y luego renderice estas columnas adicionales agregadas como lo haría normalmente

// Add to admin_init function
    add_action('manage_au-gallery_posts_custom_column', 'manage_gallery_columns', 10, 2);

    function manage_gallery_columns($column_name, $id) {
        global $wpdb;
        switch ($column_name) {
        case 'id':
            echo $id;
                break;

        case 'Thumbnail':
            $thumbnail_id = get_post_meta( $id, '_thumbnail_id', true );
                // image from gallery
                $attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') );
                if ($thumbnail_id)
                    $thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
                elseif ($attachments) {
                    foreach ( $attachments as $attachment_id => $attachment ) {
                        $thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
                    }
                }
                if ( isset($thumb) && $thumb ) {echo $thumb; } else {echo __('None');}
            break;
        default:
            break;
        } // end switch
}

Espero que esto ayude

Bainternet
fuente
2

Esta es una combinación de algunas respuestas SO, ¡espero que ayude a alguien!

function array_insert( $array, $index, $insert ) {
    return array_slice( $array, 0, $index, true ) + $insert +
    array_slice( $array, $index, count( $array ) - $index, true);
}

add_filter( 'manage_resource_posts_columns' , function ( $columns ) {
    return array_insert( $columns, 2, [
        'image' => 'Featured Image'
    ] );
});

Descubrí que array_splice()no mantendrá las claves personalizadas como las necesitamos. array_insert()hace.

DigitalDesignDj
fuente
1
Esta debería ser la respuesta correcta.
xudre