媒体库中的可排序自定义列

时间:2011-12-06 作者:v3nt

正在尝试在媒体库中对自定义列进行排序。找到了许多帖子和用户的示例,但无法让他们在媒体库页面上工作。

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\' );
如何使isv\\U宽度可排序?感谢您的帮助!

3 个回复
最合适的回答,由SO网友:t31os 整理而成

无法对附件元数据进行特定排序,因为它存储在序列化字符串中。

同时WP_Query 可以对元数据进行排序它不能对序列化的数据进行排序。例如wp_get_attachment_metadata 在列回调中为您获取并取消序列化,但MySQL查询无法对该类型的数据进行排序。

Short answer: 由于宽度和高度是如何存储的,因此不可能。

当然,如果您将图像高度或宽度设置为单独的元数据,那么您可以查询该值,或者至少应该能够使用多个钩子(除了您拥有的内容之外)来查询该值。。manage_upload_sortable_columnsrequest.

// 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;
}
如果有帮助的话,Scribu给出了一个创建新的可排序列的示例here. 注意,媒体列表的挂钩是upload 而不是media 对于可排序列(因为挂钩是屏幕id)。

我将其与您的代码一起进行了测试,它确实起到了作用,但排序顺序被关闭了,因为我没有_im_width 与“我的安装”中的媒体关联的密钥。

我希望有足够的信息可以参考,如果你想看到更完整的可排序列示例,请务必查看Scribu页面的链接。

SO网友:kaiser

第一:如果要向挂钩或过滤器添加内容,则应始终将操作调用包装在单独的函数中,并将其挂钩(在您的情况下:)到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\' );
否则你就不能成为舒尔,因为他们加载得太早了。

还有:你为什么打电话来$desc = get_the_content(); 而不使用它?

您还应该使用字符串,而不是None 这是可排序的,在数字“0”之前或字母“Z”之后排序。否则,在排序的情况下,它将位于排序结果的中间。。。

旁注:如果您检查有关翻译的Codex,那么您将看到所有gettext函数都有第二个参数。这是文本域,没有其他内容。所以你的__(\'Width\',\'domain\'); 可能会有你的主题/插件textdomain,嗯?:)

SO网友:brasofilo

完整工作代码

/*
 * 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\');
    }   
}
更新Posts表中所有图像的变通方法
/*
 * 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 );
    }
}
整个堆栈汇集了来自Rarst、Bainternet、kaiser、t31os和scribu的宝贵信息

结束

相关推荐

通过wp-admin和iOS应用程序发布,涉及相同的挂钩和触发器?

我有一个add_action 在函数中。php,该操作用于save_post 我正在运行的函数命名为set\\u attachment\\u url。我只是在帖子上获取第一个附件,并用该附件的URL设置一个自定义字段。好消息是,当我从wp管理员添加内容时,一切都很好。但当我从iOS应用程序添加内容时,我不会得到相同的结果。我必须添加帖子,点击帖子,单击“更新”,然后THEN 它起作用了。虽然我学得很快,但我对钩子和每一个钩子何时被解雇的了解还不够。任何人都能发现问题所在,为什么在iOS上insert不起作