sortierbare benutzerdefinierte Spalte in der Medienbibliothek

Versuchen, eine benutzerdefinierte Spalte in der Medienbibliothek sortierbar zu machen. Es wurden viele Beispiele für Posts und Benutzer gefunden, sie können jedoch nicht auf der Medienbibliotheksseite verwendet werden.

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' ); 

wie kann ich isv_width sortierbar machen? Jede Hilfe wird geschätzt!

Solutions Collecting From Web of "sortierbare benutzerdefinierte Spalte in der Medienbibliothek"

Sie können die Anhang-Metadaten nicht gezielt sortieren, da sie in einer serialisierten Zeichenfolge gespeichert sind.

Während WP_Query nach Metawerten WP_Query kann, kann er nicht nach Daten sortieren, die serialisiert sind. Zum Beispiel wp_get_attachment_metadata wp_get_attachment_metadata das für Sie innerhalb des Spalten-Callbacks ab und stellt es wieder her, aber MySQL-Abfragen können diesen Datentyp nicht sortieren.

Kurze Antwort: Nicht möglich aufgrund der Speicherung von Breite und Höhe.


Nachverfolgen:

Natürlich, wenn Sie die Bildhöhe oder -breite als separate Meta-Werte einrichten, können Sie dann darauf abfragen, oder sollten in der Lage sein, zumindest mit ein paar mehr Haken (zusätzlich zu dem, was Sie haben) .. manage_upload_sortable_columns und 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; } 

Wenn es mehr hilft, gab Scribu ein Beispiel für das Erstellen neuer sortierbarer Spalten hier . Beachten Sie, dass der Hook für die Medienliste upload und nicht die media für die sortierbaren Spalten (da der Hook die Bildschirm-ID ist).

Ich habe dies neben Ihrem Code getestet und es funktioniert, ohne dass die _im_width , da ich den Schlüssel _im_width nicht mit Medien in meiner Installation verknüpft habe.

Ich hoffe, dass es genug Informationen gibt, um zu arbeiten, und überprüfen Sie den Link zu Scribus Seite, wenn Sie ein vollständigeres Beispiel für sortierbare Spalten sehen möchten.

Erstens: Wenn du Sachen zu Hooks oder Filtern hinzufügst, solltest du die Aktionsaufrufe immer in eine separate function schreiben und sie (in deinem Fall 🙂 an 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' ); 

Sonst kann man nicht sicher sein, dass sie früh genug laden.

Außerdem: Warum rufen Sie $desc = get_the_content(); und nicht benutzen?

Sie sollten auch eine Zeichenfolge anstelle von None , die sortierbar ist und vor der Zahl “0” oder nach dem Buchstaben “Z” sortiert wird. Sonst wäre es – bei der Sortierung – mitten in den Sortierergebnissen …

Hinweis: Wenn Sie den Code über die Übersetzung prüfen, sehen Sie alle gettext-functionen mit einem zweiten Parameter. Das ist die Textdomäne , sonst nichts. Also dein __('Width','domain'); wird wahrscheinlich deine themen / plugins textdomain haben, hm? 🙂

Vollständiger Arbeitscode

 /* * 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'); } } 

Problemumgehung für das Aktualisieren aller Bilder in der Post-Tabelle

 /* * 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 ); } } 

Zusammengefügt mit den unschätzbaren Beiträgen von Rarst, Bainternet, Kaiser, T31os und Scribu in diesem Stack