web-dev-qa-db-fra.com

colonne personnalisée triable dans la médiathèque

essayer de rendre une colonne personnalisée triable dans la bibliothèque multimédia. Vous avez trouvé de nombreux exemples d'articles et d'utilisateurs, mais vous ne pouvez pas les amener à travailler sur la page de la médiathèque.

function wpse_hook_isv_columns() {
    add_action('manage_media_custom_column', 'isv_custom_media_column_content',10,2);
    add_filter('manage_media_columns', 'isv_custom_media_column_headings');
    add_filter('manage_media_imwidth_sortable_columns', 'imwidth_column_register_sortable' );
}
add_action( 'admin_init', 'wpse_hook_isv_columns' );


function isv_custom_media_column_headings($defaults) {
   $defaults['isv_width'] = __( 'Width', 'imwidth' );
   $defaults['isv_height']    = 'Height';
   return $defaults;
}

function isv_custom_media_column_content($column_name,$id) {
   $meta = wp_get_attachment_metadata($id);
   switch ($column_name) {         
      case 'isv_width':
         $imWidth = get_post_meta($id, "_im_width", true);
         if(  $imWidth ) : 

            echo $imWidth .' ('.$meta['width'].')';
         else : //  add meta value if not there...

            update_post_meta($id, '_im_width', $meta['width']);
            echo $meta['width'].' (updated)';
         endif;          
         break;

      case 'isv_height':
         $desc = get_the_content();
         echo $meta['height'] ? $meta['height'] : $none;
         break;
   }
}

// Register the column as sortable ???
function imwidth_column_register_sortable( $columns ) {
    $custom = array(
          // meta column id => sortby value used in query
          'imwidth'    => 'Width',
    );
    return wp_parse_args($custom, $columns);
}

// This example i found works!

function registerdate($columns) {
    $columns['registerdate'] = __('Registered', 'registerdate');
    return $columns;
}
add_filter('manage_users_columns', 'registerdate');

function registerdate_columns( $value, $column_name, $user_id ) {
    if ( 'registerdate' != $column_name )
       return $value;
    $user = get_userdata( $user_id );
    $registerdate = $user->user_registered;
    return $registerdate;
}
add_action('manage_users_custom_column',  'registerdate_columns', 10, 3);

function registerdate_column_sortable($columns) {
      $custom = array(
      // meta column id => sortby value used in query
      'registerdate'    => 'registered',
      );
  return wp_parse_args($custom, $columns);
}
add_filter( 'manage_users_sortable_columns', 'registerdate_column_sortable' );

comment puis-je rendre isv_width triable? Toute aide appréciée!

6
v3nt

Vous ne pouvez pas effectuer de tri sur les métadonnées de la pièce jointe, car elles sont stockées dans une chaîne sérialisée.

Alors que WP_Query peut trier sur des méta-valeurs, il ne peut pas trier sur des données sérialisées. Par exemple, wp_get_attachment_metadata le récupère et le désérialise dans le rappel de colonne, mais les requêtes MySQL ne peuvent pas trier sur ce type de données.

Réponse courte: Impossible en raison de la manière dont la largeur et la hauteur sont stockées.


Suivre:

Bien sûr, si vous configurez la hauteur ou la largeur de l'image en tant que méta-valeurs distinctes, vous pouvez alors interroger celle-ci, ou au moins en utilisant au moins deux crochets supplémentaires (en plus de ce que vous avez) .. manage_upload_sortable_columns et request.

// These would go inside your admin_init hook
add_filter( 'manage_upload_sortable_columns', 'isv_column_register_sortable' );
add_filter( 'request', 'isv_column_orderby' );

function isv_column_orderby( $vars ) {
    if ( isset( $vars['orderby'] ) && 'Width' == $vars['orderby'] ) {
        $vars = array_merge( $vars, array(
            'meta_key' => '_im_width',
            'orderby' => 'meta_value_num'
        ) );
    }
    return $vars;
}
function isv_column_register_sortable( $columns ) {
    $columns['isv_width'] = 'Width';
    return $columns;
}

Si cela vous aide davantage, Scribu donne un exemple de création de nouvelles colonnes triables ici . Notez que le hook pour la liste de média est upload et non pas media pour les colonnes triables (parce que le hook est l'identifiant d'écran).

Je l'ai testé avec votre code et cela a fonctionné, l'ordre de tri ayant été désactivé, car la clé _im_width n'est pas associée au support dans mon installation.

J'espère que c'est assez d'informations pour travailler, et assurez-vous de vérifier le lien vers la page de Scribu si vous voulez voir un exemple plus complet de colonnes pouvant être triées.

1
t31os

Premièrement: si vous ajoutez des éléments à des crochets ou à des filtres, vous devez toujours envelopper les appels d'action dans une fonction distincte et la raccrocher (dans votre cas :) à admin_init:

function wpse_hook_isv_columns()
{
    add_action('manage_media_custom_column', 'isv_custom_media_column_content',10,2);
    add_filter('manage_media_columns', 'isv_custom_media_column_headings');
}
add_action( 'admin_init', 'wpse_hook_isv_columns' );
// or:
if ( is_admin() )
    add_action( 'init', 'wpse_hook_isv_columns' );

Sinon, vous ne pouvez pas être sûr qu'ils chargent assez tôt.

Aussi: Pourquoi appelez-vous $desc = get_the_content(); et ne l’utilisez pas?

Vous devez également utiliser une chaîne au lieu de None qui puisse être triée et triée avant le nombre "0" ou après la lettre "Z". Sinon, ce serait - en cas de tri - au beau milieu des résultats de tri ...

Note: Si vous consultez le Codex à propos de la traduction, toutes les fonctions de gettext auront un second paramètre. C'est le textdomain , rien d'autre. Donc, votre __('Width','domain'); aura probablement votre thèmes/plugins textdomain, hm? :)

2
kaiser

Code de travail complet

/*
 * Add Sortable Width and Height Columns to the Media Library
 *
 */

if( is_admin() )
{
    add_filter( 'manage_upload_columns', 'wpse_35680_size_columns_register' );
    add_action( 'manage_media_custom_column', 'wpse_35680_size_columns_display', 10, 2 );
    add_filter( 'manage_upload_sortable_columns', 'wpse_35680_size_columns_sortable' );
    add_filter( 'wp_generate_attachment_metadata', 'wpse_35680_update_imagesize_meta_data', 10, 2);
    add_action( 'pre_get_posts', 'wpse_35680_size_columns_do_sort' );
}


/*
 * Adding Width and Height columns
 *
 */

function wpse_35680_size_columns_register( $columns ) 
{
    $columns['_width'] = 'Width';
    $columns['_height'] = 'Height';

    return $columns;
}


/*
 * Display the columns
 *
 */

function wpse_35680_size_columns_display( $column_name, $post_id ) 
{
    if( '_width' != $column_name && '_height' != $column_name || !wp_attachment_is_image( $post_id ) )
        return;

    list( $url, $width, $height ) = wp_get_attachment_image_src( $post_id, 'full' );

    if( '_width' == $column_name )
        echo get_post_meta($post_id, '_width', true);

    if( '_height' == $column_name )
        echo get_post_meta($post_id, '_height', true);
}


/*
 * Registering columns as sortable
 *
 */

function wpse_35680_size_columns_sortable( $columns ) 
{
    $columns['_width'] = '_width';
    $columns['_height'] = '_height';

    return $columns;
}


/*
 * Save Image Attachments meta data on save
 *
 */

function wpse_35680_update_image_meta_data( $image_data, $att_id ) 
{
    $width  = $image_data['width'];
    $height = $image_data['height'];

    update_post_meta( $att_id, '_width', $width );
    update_post_meta( $att_id, '_height', $height );

    return $image_data;
}


/*
 * Sort the columns
 *
 */

function wpse_35680_size_columns_do_sort(&$query)
{
    global $current_screen;
    if( 'upload' != $current_screen->id )
        return;

    $is_width = (isset( $_GET['orderby'] ) && '_width' == $_GET['orderby']);
    $is_height = (isset( $_GET['orderby'] ) && '_height' == $_GET['orderby']);
    if( !$is_width && !$is_height )
        return;

    if ( '_width' == $_GET['orderby'] ) 
    {
        $query->set('meta_key', '_width');
        $query->set('orderby', 'meta_value_num');
    }

    if ( '_height' == $_GET['orderby'] ) 
    {
        $query->set('meta_key', '_height');
        $query->set('orderby', 'meta_value_num');
    }   
}

Solution de contournement pour la mise à jour de toutes les images dans la table des publications

/*
 * Update ALL attachments metada with Width and Height
 *
 * Important: Run Only Once
 * 
 */
//add_action('admin_init','wpse_35680_run_only_once');
function wpse_35680_run_only_once()
{   
    global $wpdb;
    $attachments = $wpdb->get_results( "SELECT ID FROM $wpdb->posts WHERE post_mime_type LIKE '%image%'" );
    foreach( $attachments as $att )
    {
        list( $url, $width, $height ) = wp_get_attachment_image_src( $att->ID, 'full' );
        update_post_meta( $att->ID, '_width', $width );
        update_post_meta( $att->ID, '_height', $height );
    }
}

Assemblé avec la précieuse contribution de Rarst, Bainternet, kaiser, t31os et scribu tout au long de cette pile

2
brasofilo