在自定义列之后排序时,Wordpress 媒体库缺少具有 NULL 值的条目

Wordpress media library missing entries with NULL value when sorted after custom column

我在媒体条目的元数据中包含了 2 个自定义列,称为 'photographer' 和 'copyright'。我已将这两列都包含在媒体库的管理视图中,并将它们设为 sortable。但是当我按其中之一排序时,结果排除了该列中具有 NULL 值的条目

将自定义字段添加到管理面板媒体视图

//Custom columns in Media Admin view

add_filter('manage_media_columns', 'media_additional_columns', 1);
function media_additional_columns($defaults){
    $defaults['photographer'] = __('Photographer');
    $defaults['copyright'] = __('Copyright');
    return $defaults;
}

//Fill Custom Media Admin Columns with content

add_action('manage_media_custom_column', 'media_custom_columns_attachment_id', 1, 2);
function media_custom_columns_attachment_id($column_name, $post_id){
   switch ( $column_name ) {
    case 'photographer':
      echo get_post_meta( $post_id, 'photographer', true );
      break;

    case 'copyright':
      echo get_post_meta( $post_id, 'copyright', true );
      break;
}
}


在管理面板媒体视图中创建自定义列table

//make custom columns sortable

//add custom columns to array sortable columns
add_filter('manage_upload_sortable_columns', 'as_add_custom_column_sortable');
function as_add_custom_column_sortable($columns) {
    $columns['photographer'] = 'photographer';
    $columns['copyright'] = 'copyright';
    return $columns;
  }

//alter the post query in case stuff gets sorted by custom columns
  add_action( 'pre_get_posts', 'as_custom_column_orderby' );
  function as_custom_column_orderby( $query ) {
    if( ! is_admin() || ! $query->is_main_query() ) {
      return;
    }
    switch ($query->get( 'orderby')) {
      case 'photographer':
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'meta_key', 'photographer' );
        break;
      case 'copyright':
        $query->set( 'orderby', 'meta_value' );
        $query->set( 'meta_key', 'copyright' );
        break;   
    }
  }

我想在排序后 table 中包含具有 NULL 值的条目,位于具有非 NULL 值的条目之后。

我发现 this post 回答了帖子和用户的相同问题。我认为适用于帖子的答案也适用于媒体,因为媒体基本上是 post 类型的附件,但事实并非如此,我的媒体库完全是空的。

我刚开始 php,非常感谢您的帮助!

好吧,我通过将代码放入插件文件而不是直接 functions.php 并添加代码来为插件后媒体库中已存在的所有图像更新自定义列的值来规避问题已激活

////update all images with default values for custom fields "Photographer" and "Copyright"
// Run the loop when the plugin is activated
register_activation_hook(__FILE__, 'as_update_my_metadata');
function as_update_my_metadata(){
    $args = array(
        'post_type' => 'attachment', // Only get the posts
        'post_status' => 'publish' OR 'private', // Only the posts that are published
        'posts_per_page'   => -1 // Get every post
    );
    $posts = get_posts($args);
    foreach ( $posts as $post ) {
        // Run a loop and update every meta data
        update_post_meta( $post->ID, 'photographer', 'unknown' );
        update_post_meta( $post->ID, 'copyright', 'not defined' );
    }
}